বেজিয়ারের সাথে দুটি গ্রহের মধ্যে জাহাজ চলাচল, ত্বরণের জন্য কিছু সমীকরণ অনুপস্থিত


48

ঠিক আছে, আমি ইতিমধ্যে math.stackechange.com এ পোস্ট করেছি তবে কোনও উত্তর পাইনি :(

এখানে প্রথমে আমার সমস্যার একটি চিত্র, বিবরণটি তারপরে:

বিকল্প পাঠ

সুতরাং আমি সমস্ত পয়েন্ট এবং মান সেট আপ।

জাহাজটি প্রতি গেমটিক P1দিয়ে বাম গ্রহের চারপাশে ঘোরাফেরা শুরু করে S=0.27 Degrees, যখন এটি পৌঁছে যায় বেজিয়ার Point Aবক্ররেখা অনুসরণ করা শুরু হয় এটি পৌঁছানো পর্যন্ত Point D, তারপরে এটি প্রতি গেম টিক P2দিয়ে ডান গ্রহের আশেপাশে ভ্রমণ করে S=0.42 Degrees। পার্থক্যটি Sতাই গ্রহগুলির চারপাশে একই চলনের গতির সাথে ভ্রমণ।

এখন পর্যন্ত খুব ভাল, আমি এটি আপ এবং চলমান, এখন আমার সমস্যা।

যখন S P1এবং S P2অনেক কিছু থেকে পৃথক, জাহাজটি যখন গন্তব্যস্থলে পৌঁছে তখন দুটি গতির মধ্যে লাফ দেয়, যা দেখতে বেশ খারাপ লাগে। তাই আমি মধ্যে জাহাজ ত্বরান্বিত প্রয়োজন Point Aএবং Point Dথেকে S P1থেকে S P2

আমি যে জিনিসটি মিস করছি তা বেগুনি রঙের, সেগুলি হ'ল:

  • টিক্স গণনা করার একটি উপায় যা ত্বরণকে বিবেচনা করে জাহাজটিকে বেজিয়ারের সাথে চলতে লাগে।

  • এবং টি এর উপর ভিত্তি করে বেজিয়ার বক্ররেখানের অবস্থান অনুসন্ধান করার একটি উপায়, আবার ত্বরণকে বিবেচনা করে।

এটিএম আমি Nএর পয়েন্টগুলির মধ্যবর্তী দূরত্ব গণনা করে বেজিয়ারের দৈর্ঘ্য গণনা করি । সুতরাং আমার যা প্রয়োজন বলে আমি মনে করি তা Tতাত্বিকতা অনুসারে আমার বেজিয়ার গণনাতে আমার স্কেল করা দরকার scale


2
যে খুঁজে বের করার উপর ভাল কাজ। আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি আপনার প্রশ্নের উত্তর হিসাবে আপনার অনুসন্ধানগুলি পোস্ট করুন।
বাম্মজ্যাক

উত্তর:


83

ঠিক আছে, আমি সবকিছু কাজ করে ফেলেছি, এটি চিরকাল নিয়ে গেছে, তাই আমি এখানে আমার বিস্তারিত সমাধান পোস্ট করব।
দ্রষ্টব্য: সমস্ত কোডের নমুনা জাভাস্ক্রিপ্টে রয়েছে।

সুতরাং আসুন সমস্যাটিকে মূল অংশগুলিতে ভাঙি:

  1. আপনাকে 0..1বেজিয়ার বক্ররেখার দৈর্ঘ্যের পাশাপাশি পয়েন্টগুলিও গণনা করতে হবে

  2. Tজাহাজটিকে এক গতি থেকে অন্য গতিতে গতি বাড়ানোর জন্য আপনার এখন স্কেলিং সামঞ্জস্য করতে হবে

সঠিকভাবে বেজিয়ার পাচ্ছেন

বেজিয়ার কার্ভ আঁকার জন্য কিছু কোড সন্ধান করা সহজ, এখানে বিভিন্ন ধরণের পন্থা রয়েছে যদিও এর মধ্যে একটি হ'ল ডেস্কটেলজৌ অ্যালগোরিদম , তবে আপনি কেবল ঘনক বেজিয়ার বক্ররেখার জন্য সমীকরণটিও ব্যবহার করতে পারেন :

// Part of a class, a, b, c, d are the four control points of the curve
x: function (t) {
    return ((1 - t) * (1 - t) * (1 - t)) * this.a.x
           + 3 * ((1 - t) * (1 - t)) * t * this.b.x
           + 3 * (1 - t) * (t * t) * this.c.x
           + (t * t * t) * this.d.x;
},

y: function (t) {
    return ((1 - t) * (1 - t) * (1 - t)) * this.a.y
           + 3 * ((1 - t) * (1 - t)) * t * this.b.y
           + 3 * (1 - t) * (t * t) * this.c.y
           + (t * t * t) * this.d.y;
}

এটির সাহায্যে এখন কেউ কল করে বেজিয়র বক্ররেখা আঁকতে পারে xএবং এর মধ্য yদিয়ে tকীভাবে আসে 0 to 1তা একবার দেখে নেওয়া যাক:

বিকল্প পাঠ

আহ ... এটি সত্যিই পয়েন্টগুলির এমনকি বিতরণ নয়, তাই না?
বাজিয়ার বক্রের প্রকৃতির কারণে, বিন্দুগুলি 0...1আলাদা থাকে arc lenghts, সুতরাং শুরু এবং শেষের কাছাকাছি বিভাগগুলি বক্রাকার মধ্যবর্তী কাছাকাছি অবস্থিত দীর্ঘগুলির চেয়ে দীর্ঘ হয়।

বক্ররেখার একে একে দৈর্ঘ্যের পরামিতিগুলিতে সমানভাবে ম্যাপিং টি

তো এখন কি করা? ভাল সরল কথায়, আমাদের বক্ররেখার Tউপর আমাদের মানচিত্র তৈরি করার জন্য একটি ফাংশন প্রয়োজন t, যাতে আমাদের T 0.25ফলাফলটি বক্রের দৈর্ঘ্যের tস্থানে থাকে 25%

আমরা যে কিভাবে করব? ওয়েল, আমরা Google ... কিন্তু এটা দেখা যাচ্ছে যে শব্দটি না যে googleable , এবং কিছু সময়ে আপনি এই আঘাত করব পিডিএফ । কোনটি নিশ্চিতভাবে পঠনযোগ্য, তবে আপনি স্কুলে ফিরে পড়া সমস্ত গণিতের জিনিসগুলি ইতিমধ্যে ভুলে গেছেন (বা আপনি কেবল সেই গাণিতিক প্রতীক পছন্দ করেন না) এটি বেশ অকেজো।

এখন কি? ভাল যান এবং গুগল আরও কিছু পড়ুন (পড়ুন: 6 ঘন্টা), এবং আপনি অবশেষে এই বিষয়ের উপর একটি দুর্দান্ত নিবন্ধটি পেয়েছেন (সুন্দর ছবি সহ! ^ _ ^ "):
Http://www.planetclegg.com/projects/WarpingTextToSplines.html

আসল কোড করছে

আপনি যদি এই পিডিএফটি ডাউনলোড করতে কেবলমাত্র প্রতিরোধ করতে না পারেন যদিও আপনি ইতিমধ্যে আপনার গাণিতিক জ্ঞানটি দীর্ঘ, দীর্ঘ, অনেক আগে হারিয়ে ফেলেছিলেন (এবং আপনি দুর্দান্ত নিবন্ধের লিঙ্কটি এড়িয়ে যেতে সক্ষম হয়েছেন ), আপনি এখন ভাবতে পারেন: "Godশ্বর, এটি গ্রহণ করবে কয়েকশো লাইন কোড এবং টন সিপিইউ "

না এটা হবে না. কারণ আমরা যখন সমস্ত প্রোগ্রামাররা করি তা করি, যখন গণিতের জিনিস আসে:
আমরা কেবল প্রতারণা করি।

আর্ক-দৈর্ঘ্যের প্যারামিটারাইজেশন, অলস উপায়

আসুন এটির মুখোমুখি হোন, আমাদের গেমটিতে আমাদের অন্তহীন নির্ভুলতার প্রয়োজন নেই, তাই না? সুতরাং আপনি যদি নাসায় কাজ না করে এবং মানুষকে মঙ্গল গ্রহে প্রেরণের পরিকল্পনা না করেন তবে আপনার কোনও 0.000001 pixelসঠিক সমাধানের প্রয়োজন হবে না ।

সুতরাং আমরা কিভাবে মানচিত্র না Tসম্মুখের t? এটি সহজ এবং কেবল 3 টি পদক্ষেপ নিয়ে গঠিত:

  1. Nবক্ররেখার পয়েন্টগুলি গণনা করুন tএবং arc-lengthসেই অবস্থানটিতে অ্যারেতে (বক্ররের দৈর্ঘ্য) ব্যবহার করুন

  2. মানচিত্রে Tসম্মুখের t, প্রথম সংখ্যাবৃদ্ধি Tবক্ররেখা মোট দৈর্ঘ্য দ্বারা পেতে uএবং তারপর বৃহত্তম মান চেয়ে ছোট যে এর সূচির জন্য লেন্থ অ্যারে অনুসন্ধানu

  3. আমাদের যদি সঠিক আঘাত লেগে থাকে তবে সেই সূচকটিতে অ্যারের মানটি ভাগ করে Nফিরে আসুন, যদি আমরা যে পয়েন্টটি পেয়েছি এবং পরেরটির মধ্যে কিছুটা বিভক্ত না করে আবার জিনিসটি আবার ভাগ করে ফিরুন N

এখানেই শেষ! সুতরাং এখন সম্পূর্ণ কোডটি একবার দেখুন:

function Bezier(a, b, c, d) {
    this.a = a;
    this.b = b;
    this.c = c;
    this.d = d;

    this.len = 100;
    this.arcLengths = new Array(this.len + 1);
    this.arcLengths[0] = 0;

    var ox = this.x(0), oy = this.y(0), clen = 0;
    for(var i = 1; i <= this.len; i += 1) {
        var x = this.x(i * 0.05), y = this.y(i * 0.05);
        var dx = ox - x, dy = oy - y;        
        clen += Math.sqrt(dx * dx + dy * dy);
        this.arcLengths[i] = clen;
        ox = x, oy = y;
    }
    this.length = clen;    
}

এটি আমাদের নতুন বক্ররেখা সূচনা করে এবং গণনা করে arg-lenghts, এটি দৈর্ঘ্যের শেষটি total lengthবক্ররেখার হিসাবে সংরক্ষণ করে , এখানে মূল ফ্যাক্টরটি this.lenআমাদের N। উপরের ছবিটির আকারের একটি বক্ররেখার জন্য যত বেশি উচ্চতর, তত বেশি যথাযথ হবে 100 points, আপনার যদি কেবল একটি ভাল দৈর্ঘ্যের প্রাক্কলনের প্রয়োজন 25হয় তবে আমাদের মতো 1 পিক্সেল বন্ধ থাকার মতো কিছু ইতিমধ্যে কাজটি করবে our উদাহরণস্বরূপ, তবে তারপরে আপনার কাছে একটি সুনির্দিষ্ট ম্যাপিং থাকবে যার ফলস্বরূপ ম্যাপিংয়ের সময় এতটা Tবিতরণও হবে না t

Bezier.prototype = {
    map: function(u) {
        var targetLength = u * this.arcLengths[this.len];
        var low = 0, high = this.len, index = 0;
        while (low < high) {
            index = low + (((high - low) / 2) | 0);
            if (this.arcLengths[index] < targetLength) {
                low = index + 1;

            } else {
                high = index;
            }
        }
        if (this.arcLengths[index] > targetLength) {
            index--;
        }

        var lengthBefore = this.arcLengths[index];
        if (lengthBefore === targetLength) {
            return index / this.len;

        } else {
            return (index + (targetLength - lengthBefore) / (this.arcLengths[index + 1] - lengthBefore)) / this.len;
        }
    },

    mx: function (u) {
        return this.x(this.map(u));
    },

    my: function (u) {
        return this.y(this.map(u));
    },

আসল ম্যাপিং কোড, প্রথমে আমরা binary searchআমাদের সঞ্চিত দৈর্ঘ্যের উপর সেক্ষেত্রে সবচেয়ে ছোট দৈর্ঘ্যের চেয়ে ছোট একটি সন্ধান targetLengthকরি, তারপরে আমরা কেবল ফিরে আসি বা ঘূর্ণনটি ঘটিয়ে ফিরে যাই return

    x: function (t) {
        return ((1 - t) * (1 - t) * (1 - t)) * this.a.x
               + 3 * ((1 - t) * (1 - t)) * t * this.b.x
               + 3 * (1 - t) * (t * t) * this.c.x
               + (t * t * t) * this.d.x;
    },

    y: function (t) {
        return ((1 - t) * (1 - t) * (1 - t)) * this.a.y
               + 3 * ((1 - t) * (1 - t)) * t * this.b.y
               + 3 * (1 - t) * (t * t) * this.c.y
               + (t * t * t) * this.d.y;
    }
};

আবার এই tবক্ররেখা গণনা ।

ফলাফলের জন্য সময়

বিকল্প পাঠ

এখনই ব্যবহার করে mxএবং myআপনি Tবক্ররেখায় সমানভাবে বিতরণ করবেন :)

এত শক্ত ছিল না, তাই না? আবার, দেখা যাচ্ছে যে একটি সাধারণ (যদিও নিখুঁত সমাধান নয়) একটি গেমের জন্য যথেষ্ট।

আপনি যদি সম্পূর্ণ কোডটি দেখতে চান তবে একটি গিস্ট পাওয়া যায়:
https://gist.github.com/670236

অবশেষে, জাহাজগুলিকে ত্বরান্বিত করছে

সুতরাং এখন যা যা রয়েছে তা হ'ল জাহাজগুলিকে তাদের পথ ধরে ত্বরান্বিত করা, অবস্থানটি ম্যাপিংয়ের Tপরে আমরা tআমাদের বক্ররেখার সন্ধান করতে ব্যবহার করি ।

প্রথমে আমাদের দুটি গতির সমীকরণ প্রয়োজন , যথা ut + 1/2at²এবং এবং(v - u) / t

প্রকৃত কোডে এটির মতো দেখতে:

startSpeed = getStartingSpeedInPixels() // Note: pixels
endSpeed = getFinalSpeedInPixels() // Note: pixels
acceleration = (endSpeed - startSpeed) // since we scale to 0...1 we can leave out the division by 1 here
position = 0.5 * acceleration * t * t + startSpeed * t;

তারপরে আমরা তা করে স্কেল করব 0...1:

maxPosition = 0.5 * acceleration + startSpeed;
newT = 1 / maxPosition * position;

এবং সেখানে আপনি যান, জাহাজগুলি এখন পথ ধরে সুচারুভাবে এগিয়ে চলছে।

যদি এটি কাজ না করে ...

আপনি যখন এটি পড়ছেন, সবকিছু ঠিকঠাক এবং ছদ্মবেশী কাজ করে তবে গেমদেব চ্যাটরুমের কাউকে সমস্যাটি ব্যাখ্যা করার সময় আমি আমার চিন্তায় চূড়ান্ত ত্রুটিটি পেয়েছি accele

যদি আপনি ইতিমধ্যে মূল প্রশ্নের চিত্রটি সম্পর্কে ভুলে যান না, তবে আমি sসেখানে উল্লেখ করেছি , sএটি ডিগ্রিগুলির গতিতে পরিণত হয় , তবে জাহাজগুলি পিক্সেলের পথ ধরে এগিয়ে যায় এবং আমি সেই সত্যটি ভুলে গিয়েছিলাম। সুতরাং এই ক্ষেত্রে আমার যা করার দরকার ছিল তা হ'ল ডিগ্রিতে স্থানচ্যুতিটিকে পিক্সেলের একটি বাস্তুচ্যুতে রূপান্তরিত করা, দেখা যাচ্ছে এটি বরং সহজ:

function rotationToMovement(planetSize, rotationSpeed) {
    var r = shipAngle * Math.PI / 180;
    var rr = (shipAngle + rotationSpeed) * Math.PI / 180;
    var orbit = planetSize + shipOrbit;
    var dx = Math.cos(r) * orbit - Math.cos(rr) * orbit;
    var dy = Math.sin(r) * orbit - Math.sin(rr) * orbit;
    return Math.sqrt(dx * dx + dy * dy);
};

তো আর এটাই! পড়ার জন্য ধন্যবাদ ;)


7
এটি হজম হতে কিছুটা সময় নিতে চলেছে। তবে বাহ, আপনার নিজের প্রশ্নের আশ্চর্যজনক উত্তর।
অ্যাটাকিংহোব

7
আমি এই উত্তরটিকে উঁচু করে তোলার জন্য একটি অ্যাকাউন্ট তৈরি করেছি
কেউই

আমার বন্ধু কিছু পয়েন্ট আছে। কবজির মতো কাজ করেছেন। প্রশ্নোত্তর উভয় উর্ধ্বে।
জেসে

2
'i' ০.০৫ দ্বারা গুণিত হয়েছে, যখন 'লেন' ১০০ তে সেট করা হয়েছিল this এটি '0' এর পরিবর্তে '0-5' এ ম্যাপ করা হবে।
অশুভ কার্যকলাপ

1
@ এভিলিটিভিটি হ্যাঁ আমি এটিও দেখেছি, তার আসল দৈর্ঘ্য 20 হতে হবে, তারপরে 0.05 থেকে 0.01 এ পরিবর্তন করতে ভুলে গেছেন। ডায়নামিক 'লেন' (সত্যতর চাপের দৈর্ঘ্যের সাথে অভিযোজক, বা সম্ভবত এর সমান সমান) ভাল থাকুন এবং 1 / 'লেন' দ্বারা "পদক্ষেপ" গণনা করুন। আমি দেখতে পেয়েছি যে এত অদ্ভুত আর কেউ এই বছরগুলিতে এনেছে !!!
বিল কোটসিয়াস

4

সমস্যাটি হ'ল কোনও জাহাজ সেই ট্র্যাজেক্টরিটিকে স্বাভাবিকভাবে গ্রহণ করবে না। এমনকি এটি পুরোপুরি কাজ করার পরেও এটি সঠিক দেখাচ্ছে না।

আপনি যদি গ্রহের মধ্যে মসৃণ রূপান্তরটি অনুকরণ করতে চান তবে আমি আসলে এটির মডেলিং করার পরামর্শ দেব। আপনার দুটি মাত্র উল্লেখযোগ্য বাহিনী রয়েছে: মহাকর্ষ এবং জোর এই সমীকরণগুলি খুব সহজ।

আপনাকে কেবল আপনার ধ্রুবকগুলি সেট করতে হবে: পি 1, পি 2, শিপ অফ মাস

প্রতিটি গেম-টিক (সময়: টি) দিয়ে আপনি 3 টি জিনিস করছেন

  1. জাহাজে পি 1 এবং জাহাজে পি 2 এর মাধ্যাকর্ষণ গণনা করুন, ফলাফল ভেক্টরগুলিকে থ্রাস্ট ভেক্টরে যুক্ত করুন।

  2. পদক্ষেপ 1 থেকে আপনার নতুন ত্বরণের উপর ভিত্তি করে আপনার নতুন বেগ গণনা করুন

  3. আপনার নতুন বেগ অনুযায়ী জাহাজটি সরান

অনেকগুলি কাজের মতো মনে হতে পারে তবে এটি কোডের এক ডজন লাইনে করা যেতে পারে এবং এটি খুব প্রাকৃতিক দেখায়।

আপনার যদি পদার্থবিজ্ঞানের সাথে সাহায্যের প্রয়োজন হয় তবে আমাকে জানান।


আমি পরীক্ষার বিষয়টি বিবেচনা করতে পারি যে আপনি যদি কোনও ফাংশন গ্রহণের মধ্যে এটি করার কোনও উপায় সরবরাহ করতে পারেন তবে t:)
Ivo Wetzel

- তবে গেম প্রোগ্রামিংয়ে আপনি টি ভেরিয়েবল হিসাবে ব্যবহার করবেন না। আপনি ইতিমধ্যে একটি প্যারাম্যাট্রিক পরিস্থিতিতে রয়েছেন, কারণ আপনি জাহাজটির জন্য কেবল নতুন ডিএক্স এবং ডাই গণনা করছেন। এখানে দুটি গ্রহের কক্ষপথ (ফ্ল্যাশ মধ্যে) একটি উদাহরণ aharrisbooks.net/flash/fg2r12/twoPlanets.html : - এবং এখানে পাইথন মধ্যে একই জিনিস aharrisbooks.net/pythonGame/ch09/twoPlanets.py
দুই পাই

2

আমি জাভাস্ক্রিপ্টে লিখিত কোড উদাহরণ সহ এই সমস্যার সম্ভাব্য সমাধান ব্যাখ্যা করার জন্য একটি দুর্দান্ত নিবন্ধ পেয়েছি । এটি "টি টি টান দিয়ে" মানকে সঠিক দিক দিয়ে কাজ করে।

পরিবর্তে, আমরা এই সত্যটি ব্যবহার করতে পারি যে কোনও বিন্দু বিতরণের জন্য গড় লেগের দৈর্ঘ্য d_avg প্রায় সমান-ব্যবধানযুক্ত বিন্দুগুলির যে লেগ দৈর্ঘ্যের উত্পাদনের সাথে প্রায় একই রকম হয় (n এর বৃদ্ধি হওয়ার সাথে সাথে এই মিলটি বৃদ্ধি পায়)। যদি আমরা আসল লেগ দৈর্ঘ্যের d এবং গড় লেগ দৈর্ঘ্যের d_avg এর মধ্যে ডিফেরার পার্থক্য গণনা করি, তবে প্রতিটি পয়েন্টের সাথে সম্পর্কিত সময় প্যারামিটার টি এই পার্থক্য হ্রাস করার জন্য ন্যাজ করা যেতে পারে।

এই প্রশ্নের ইতিমধ্যে অনেক দুর্দান্ত উত্তর রয়েছে, তবে আমি এই সমাধানটি লক্ষ্য করার মতো বলে মনে করি।


1

আপনি কীভাবে এই সমস্যার সমাধান করেছেন তা বর্ণনা করার জন্য আপনার দুর্দান্ত পৃষ্ঠার জন্য ধন্যবাদ। আমি আপনার থেকে কিছুটা আলাদাভাবে বিশদভাবে করেছি, কারণ আমি গভীরভাবে স্মৃতিবদ্ধ ছিলাম: আমি কোনও অ্যারে তৈরি করি না, বা বাইনারি অনুসন্ধান করে ডান 'বিভাগ' এর জন্য এটি অনুসন্ধান করতে হয়। এটি কারণ আমি সর্বদা জানি যে আমি আমার বেজিয়ার বক্ররেখার এক প্রান্ত থেকে অন্য প্রান্তে চলে যাচ্ছি: অতএব, আমি কেবল 'কারেন্ট' বিভাগটি মনে করি এবং যদি আমি দেখতে পাই যে আমি আমার পরবর্তী অংশটি গণনা করতে সেগমেন্টের সীমানার বাইরে চলে যাচ্ছি অবস্থান, আমি পরবর্তী (বা পূর্ববর্তী) বিভাগটি (ভ্রমণের দিকের উপর ভিত্তি করে) গণনা করি my এটি আমার আবেদনের জন্য বেশ ভাল কাজ করে। আমার একমাত্র ত্রুটি ছিল যা কিছু কাজ করতে হয়েছিল, কিছু বাঁকগুলিতে, বিভাগগুলির আকার এত ছোট ছিল যে আমার পরবর্তী প্লটটি উল্লেখ করার জন্য হয়েছিল - বিরল সময়ে - বর্তমানের চেয়ে একাধিক অংশ এগিয়ে ছিল, তাই কেবল যাওয়ার পরিবর্তে '

এটি বেশ অর্থপূর্ণ কিনা তা জানেন না তবে এটি অবশ্যই আমাকে সাহায্য করেছিল helped


0

এই ধরণের মডেলিংটি অদ্ভুত এবং অদ্ভুত অযৌক্তিক ফলাফল আনতে পারে। বিশেষ করে যদি শুরু গ্রহের গতি সত্যিই ধীর হয়।

একটি শক্তির সাথে জাহাজগুলির মডেল করুন।

জাহাজগুলি যখন প্রথম গ্রহটির শেষ কক্ষপথে থাকে, তখন পুরো জোর দিয়ে ত্বরান্বিত করুন।

জাহাজটি যখন কোনও নির্দিষ্ট দূরত্বে চলে যায় তখন টার্গেট গ্রহের কক্ষপথের গতিতে জাহাজকে ধীর করতে রিভার্স থ্রাস্ট ব্যবহার করুন।

সম্পাদনা: কোনও নোড কক্ষপথ ছেড়ে চলে যাওয়ার সময় একবারে পুরো সিমুলেশনটি করুন। হয় সমস্ত ডেটা প্রেরণ করুন, বা বিরতিতে মাত্র কয়েকজন মুভমেন্ট ভেক্টর প্রেরণ করুন এবং তাদের মধ্যে বিভক্ত করুন।


সমস্যাটি হ'ল, এটি সমস্ত টিক ভিত্তিক, মধ্যবর্তী অবস্থান নেই। এটি একটি নেটওয়ার্কিং মাল্টিপ্লেয়ার গেম এবং একটি সম্পূর্ণ গেমের 600+ জাহাজের সমস্ত অবস্থান পাঠানো সমস্ত নেটওয়ার্কিংকে মেরে ফেলবে। কেবলমাত্র এমন ইভেন্ট রয়েছে যা একটি টিকঅফসেট প্রেরণ করে, বাকিগুলি বর্তমান বিশ্বের টিক এবং অফসেটের ভিত্তিতে গণনা করা হয়।
আইভো ওয়েটজেল

আমি আমার প্রতিক্রিয়া সম্পাদনা করেছি।
আক্রমণ হাবো

0

যদি আমি এটি সঠিকভাবে বুঝতে পারি তবে আপনার সমস্যা অতিরিক্ত সীমাবদ্ধ।

আমি বিশ্বাস করি যে আপনি কিছু সময় কক্ষপথ মধ্যে একটি নির্দিষ্ট পথ বরাবর ভ্রমণ করতে মহাকাশযান চান টন , এবং আপনি এটা গতি থেকে ত্বরান্বিত করতে চান S1 গতি S2 একই সময় টন । দুর্ভাগ্যক্রমে, আপনি (সাধারণভাবে) কোনও ত্বরণ খুঁজে পেতে পারেন না যা একই সাথে উভয়ই বাধাগুলিকে সন্তুষ্ট করে।

সমাধানযোগ্য হওয়ার জন্য আপনার সমস্যাটি কিছুটা শিথিল করতে হবে।


2
তাহলে কীভাবে শিথিল করবেন? আমি যা কল্পনা করতে পারি তা হ'ল টিটি পরিবর্তন করে যা আমি বেজিয়ার পাথ স্টাফগুলিতে প্লাগ করে। প্রথমে ধীর গতিতে ০.৫ এবং তারপরে দ্রুতগতিতে গতি বাড়ানোর জন্য আমার এটির কোনও পরিমাণে স্কেল করা দরকার So বক্ররেখা?
আইভো ওয়েটজেল

1
আমি মনে করি স্পেসশিপটি যদি তার আসল গতি থেকে স্থানান্তরের মাঝপথে আশেপাশের কোথাও ত্বরান্বিত হয় এবং তারপরে নতুন কক্ষপথে হ্রাস পায় তবে এটি আরও বাস্তববাদী দেখবে।
গ্যারেথ রিস

তবুও আমি কীভাবে পুরো জিনিসটির মধ্যে ত্বরণটি প্লাগ করতে পারি তার জন্য আমি আটকে আছি, আমাকে কোনওভাবেই টিটি পরিবর্তন করতে হবে: /
আইভো ওয়েটজেল

0

আমি এই উত্তরটি জুড়ে এসেছি কারণ আমি একটি এসজিজি পাথের সাথে সমানভাবে পয়েন্ট বিতরণ করতে চাই যা বেজিয়ার বক্ররেখা ব্যবহার করে।

এমডিএন বলছে না যে এটি অবনমিত হয়েছে, আপনি path.getPointAtLengthসঠিক ফলাফল পেতে এটি ব্যবহার করতে পারেন । https://developer.mozilla.org/en-US/docs/Web/API/SVGPathElement/getPointAtLength

এটি বর্তমানে ক্রোম / সাফারি / ফায়ারফক্সে কাজ করে, এবং আইই / এজতেও কাজ করা উচিত তবে আমি সেগুলি 2 যাচাই করিনি।


-1

গৃহীত সমাধানের সাথে সমস্যা

বেজিয়ার একটি ক্ষতিকারক ক্রিয়াকলাপ হিসাবে , আমরা বক্ররেখার বিভিন্ন ক্ষেত্রে বিভিন্ন হার অগ্রিম আশা করি।

যেহেতু আইভোর সমাধানটি প্রাথমিক সূচকীয় নমুনাগুলির মধ্যে রৈখিকভাবে বিভক্ত হয় , ত্রুটিগুলি (সাধারণত ঘনক্ষেত্র) বক্ররেখার প্রান্ত / মাঝখানে যেখানে ভারী be সুতরাং যতক্ষণ না তিনি প্রস্তাবিত হিসাবে নমুনার হারটি ব্যাপকভাবে বৃদ্ধি করা হয় ততক্ষণ ত্রুটিগুলি সুস্পষ্ট এবং জুমের কিছু স্তরে সর্বদা প্রদত্তর জন্য স্পষ্ট হবে , অর্থাত্ সেই অ্যালগরিদমের জন্য পক্ষপাত অন্তর্নিহিত। যেমন ভেক্টর-ভিত্তিক গ্রাফিক্সের জন্য ভাল নয় যেখানে জুম সীমাহীন হতে পারে beNN

গাইডেড স্যাম্পলিংয়ের মাধ্যমে পক্ষপাতিত্বের বিরুদ্ধে লড়াই করা

একটি বিকল্প সমাধান সুসংগত পুনরায় ম্যাপ হয় distanceথেকে tপ্রাকৃতিক পক্ষপাত যে বেজিয়ে ফাংশন উৎপন্ন প্রতিহত করেন।

ধরে নিই আমরা আদর্শভাবে এটি চাই:

curve length = 10

t      distance
0.2    2
0.4    4
0.6    6
0.8    8
1.0    10

তবে এটিই আমরা বেজিয়ার পজিশন ফাংশন থেকে পেয়েছি:

t      distance
0.2    0.12
0.4    1.22
0.6    2.45
0.8    5.81
1.0    10.00

দিকে তাকিয়ে Nনিয়ে যাওয়া নমুনা, আমরা যেখানে দূরত্ব বদ্বীপ সর্বশ্রেষ্ঠ হয়, এবং রীস্যাম্পেল ( "বিভক্ত") দুই সংলগ্ন দূরত্বের মধ্যে মাঝপথে দেখতে পারেন, বৃদ্ধি Nএ 1. উদাহরণস্বরুপ, বিভাজন জন্য t=0.9(যা বৃহত্তম বদ্বীপ মাঝপথে হয়), আমরা হয়তো পাওয়া:

0.8    5.81
0.9    7.39
1.0    10.00

পুরো সেটটিতে যে কোনও দুটি দূরত্বের মধ্যে সর্বাধিক ব-দ্বীপ কিছুটির নীচে না হওয়া পর্যন্ত আমরা পরবর্তী প্রক্রিয়াটির পুনরাবৃত্তিটি করব minDistanceDeltaএবং আরও সুনির্দিষ্টভাবে, epsilonআমরা যে নির্দিষ্ট দূরত্বে ম্যাপ করতে চাইছি তার থেকে কম দূরে t; এরপরে আমরা আমাদের পছন্দসই tপদক্ষেপগুলিকে রৈখিকভাবে ম্যাপ করতে পারি distance। এটি একটি হ্যাশ টেবিল / মানচিত্র তৈরি করে যা আপনি সস্তায় অ্যাক্সেস করতে পারবেন এবং যার মূল্যমানের মধ্যে আপনি পক্ষপাতিত্ব ছাড়াই রানটাইম এ লার্প করতে পারবেন।

সেটটি Nবাড়ার সাথে সাথে এটির পুনরাবৃত্তি করতে ব্যয় বেড়ে যায়, তাই আদর্শভাবে এটি প্রাক-প্রক্রিয়া হিসাবে করুন। প্রতিটি সময় Nবৃদ্ধি পায়, intervalsপুরানো, একক ব্যবধানের পরিবর্তে তারা সংগ্রহের সময় দুটি নতুন ফলাফল অন্তর যুক্ত করুন an এটি সেই কাঠামো যার ভিত্তিতে আপনি পরের বৃহততম অন্তরকে দুটিতে বিভক্ত করার জন্য সন্ধান করতে কাজ করেন। সবাইকে বলা হচ্ছে intervalsদূরত্ব অনুসারে সাজানো সহজ জিনিষ রাখে, আপনি শুধু শেষ বন্ধ পরবর্তী কাজ আইটেমটি পপ করতে পারেন, এবং বিভক্ত যেমন ইত্যাদি

আমরা আদর্শভাবে যা চেয়েছিলাম এমন কিছু দিয়ে শেষ করি:

epsilon: 0.01

t            distance
0.200417     2.00417
0.3998132    3.9998132
0.600703     6.00703
0.800001     8.00001
0.9995309    9.995309

যেহেতু আমরা প্রতিটি পদক্ষেপে অনুমান গ্রহণ করা হয়, আমরা সঠিক সঠিক দূরত্বের পাবেন না 2, 4ইত্যাদি আমরা চেয়েছিলাম, কিন্তু পুনরাবৃত্তি মাধ্যমে পুনরাবৃত্তির এই আকাঙ্ক্ষিত দূরত্ব মান পাসে যথেষ্ট পেতে, যাতে আপনি আপনার ম্যাপ করতে tন্যায্য সঠিকতা সঙ্গে পদক্ষেপ, কারণে পক্ষপাত দূর কাছাকাছি-সমমানের নমুনা।

তারপরে আপনি যেমন উদ্ধার করতে পারেন t=0.5যেমন আইভো তার উত্তরে করেন, যেমন উপরে ( 3.9998132এবং 6.00703) দুটি নিকটতম মানগুলির মধ্যে সংযোগ স্থাপন করে ।

উপসংহার

বেশিরভাগ ক্ষেত্রে, আইভোর সমাধানটি ভালভাবে কাজ করবে, তবে যে ক্ষেত্রে যে distanceকোনও ক্ষেত্রে পক্ষপাতদুটি এড়ানো উচিত, নিশ্চিত হয়ে নিন যে আপনার গুলি যতটা সম্ভব সমানভাবে ছড়িয়ে ছিটিয়ে রয়েছে এবং তারপরে রৈখিকভাবে ম্যাপ করা হয়েছে t

নোট করুন যে বিভাজক প্রতিটি সময় মাঝখানে বিভক্ত না হয়ে stochastically করা যেতে পারে, উদাহরণস্বরূপ আমরা সম্ভবত যে প্রথম উদাহরণ অন্তর t=0.827পরিবর্তে চেয়ে বিভক্ত হতে পারে t=0.9

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.