इसके लिए एक विश्लेषणात्मक समाधान मुश्किल है, लेकिन हम आवश्यक सटीकता के भीतर समाधान खोजने के लिए बाइनरी खोज का उपयोग कर सकते हैं ।
जहाज समय पर कक्षा में निकटतम बिंदु तक पहुँच सकता है t_min :
shipOrbitRadius = (ship.position - planet.orbitCenter).length;
shortestDistance = abs(shipOrbitRadius - planet.orbitRadius);
t_min = shortestDistance/ship.maxSpeed;
जहाज t_max के बराबर या उससे कम समय में कक्षा के किसी भी बिंदु तक पहुँच सकता है :
(यहाँ, सादगी के लिए, मुझे लगता है जहाज सूरज के माध्यम से ड्राइव कर सकते हैं। आप इस से बचने के लिए तो आप कम से कम कुछ मामलों के लिए गैर-सरल-रेखा पथ करने के लिए स्विच करने की आवश्यकता होगी चाहते हैं। "चुंबन हलकों" अच्छा और कक्षीय लग सकता है यांत्रिकी-y, एक स्थिर कारक से अधिक एल्गोरिथ्म को बदले बिना)
if(shipOrbitRadius > planet.orbitRadius)
{
t_max = planet.orbitRadius * 2/ship.maxSpeed + t_min;
}
else
{
t_max = planet.orbitRadius * 2/ship.maxSpeed - t_min;
}
यदि हमारी कक्षीय अवधि कम है, तो हम इस ऊपरी सीमा पर सुधार करने में सक्षम हो सकते t_max
हैं कि पहली बार चुनने के बाद t_min
ग्रह जहाज की शुरुआत की स्थिति के लिए अपना निकटतम दृष्टिकोण बनाता है। इन दोनों में से जो भी मान लें t_max
वह छोटा है। यह क्यों काम करता है की एक व्युत्पत्ति के लिए बाद में इसका जवाब देखें।
अब हम इन चरम सीमाओं, t_min और t_max के बीच द्विआधारी खोज का उपयोग कर सकते हैं । हम एक ऐसे टी-मान की खोज करेंगे जिसमें त्रुटि शून्य के करीब हो:
error = (planet.positionAtTime(t) - ship.position).squareMagnitude/(ship.maxSpeed*ship.maxSpeed) - t*t;
(इस निर्माण का उपयोग करते हुए, त्रुटि @ t_min> = 0 और त्रुटि @ t_max <= 0, इसलिए त्रुटि के साथ कम से कम एक अवरोधन होना चाहिए = बीच में एक टी-मान के लिए =
जहां, पूर्णता के लिए, स्थिति फ़ंक्शन कुछ इस तरह है ...
Vector2 Planet.positionAtTime(float t)
{
angle = atan2(startPosition - orbitCenter) + t * orbitalSpeedInRadians;
return new Vector2(cos(angle), sin(angle)) * orbitRadius + orbitCenter;
}
ध्यान दें कि यदि जहाज की गति की तुलना में ग्रह की कक्षीय अवधि बहुत कम है, तो यह त्रुटि फ़ंक्शन t_min से t_max तक की अवधि में कई बार संकेत बदल सकता है। बस जल्द से जल्द + ve & -ve जोड़ी पर नज़र रखें, और उनके बीच खोज जारी रखें जब तक कि त्रुटि शून्य के करीब न हो ("पर्याप्त पास" आपकी इकाइयों और गेमप्ले संदर्भ के प्रति संवेदनशील हो। आधा फ्रेम अवधि का वर्ग हो सकता है। अच्छी तरह से काम - यह सुनिश्चित करता है कि अवरोधन एक फ्रेम के भीतर सटीक है)
एक बार जब आपके पास एक अच्छा त्रुटि-कम करने वाला टी होता है, तो आप केवल जहाज को planet.positionAtTime (t) पर इंगित कर सकते हैं और पूर्ण गला घोंटकर जा सकते हैं, विश्वास है कि ग्रह उस बिंदु पर उसी समय तक पहुंच जाएगा जब आप करते हैं।
आप हमेशा Log_2 ((2 * orbitRadius / ship.maxSpeed) / errorThreshold) पुनरावृत्तियों के भीतर एक समाधान पा सकते हैं। इसलिए, उदाहरण के लिए, यदि मेरा जहाज 60 फ्रेम में कक्षा को पार कर सकता है, और मुझे एक फ्रेम के भीतर एक अवरोधन चाहिए, तो मुझे लगभग 6 पुनरावृत्तियों की आवश्यकता होगी।