आपके प्रश्न के संदर्भ में, http://nodewar.com/ पर , आपके समाधान के लिए कुछ विशिष्ट विचार हैं:
- आपके पास कम (कम) अधिकतम कोणीय वेग है, और इसे बहुत कम समय में पहुंचने के लिए पर्याप्त अधिकतम टोक़ है।
- आपके ड्रोन और टारगेट में प्रत्येक में वेग और बाहरी त्वरण है, जो थ्रस्ट (ग्रैविटेशन एब्स) से असंबंधित है।
- आपका वांछित लक्ष्य इतनी बार बदल जाता है कि पूरी तरह से लक्ष्य बनाने की कोशिश बेकार हो जाएगी। आपको पास आने की कोशिश करनी चाहिए, और इसे हर फ्रेम को सही करना चाहिए।
ये विधियाँ हैं जो मैंने एक वांछित त्वरण तक पहुँचने के लिए काम करने के लिए निर्धारित की हैं।
त्वरण, वेग नहीं
क्योंकि आपके पास पहले से ही एक दिया हुआ वेग है, और आपका लक्ष्य आगे बढ़ रहा है, आपको एक बिंदु की ओर जोर देने की आवश्यकता नहीं है। आपको अपने वेग को बदलने के लिए जोर की जरूरत है कि यह क्या होना चाहिए। इसका मतलब यह है कि आपके जहाज को यह इंगित करने की आवश्यकता नहीं है कि वह कहाँ जा रहा है, लेकिन उस दिशा में जिसमें उसे गति मिलनी चाहिए।
// My target velocity is for maintaining a circular orbit. Yours may differ.
// Earlier, I calculated total gravity and the perpendicular direction.
// You may wish to subtract gravity from your total, rather than match it.
var targetVel = o.lib.vec.times(lateralDir, targetVelMag);
var targetAccel = lv.sum(
o.lib.vec.diff(targetVel, o.me.vel),
o.lib.vec.times(gravity, 1 / o.me.mass)
);
सही हेडिंग की ओर बढ़ते हुए
आपके पास एक त्वरण वेक्टर है, अब आप इसे लागू करना चाहते हैं। निर्धारित करें कि आपको कितनी दूर घूमने की आवश्यकता है। मैंने शायद यहां आवश्यकता से अधिक चरणों का उपयोग किया था, लेकिन घूर्णी निर्देशांक मुझे भ्रमित करते हैं, और मुझे लगता है कि अनकैप्ड शिप रोटेशन मूल्य वैसे भी एपीआई में एक बग है।
// convert acceleration to an angle
var polar = o.lib.vec.toPolar(targetAccel);
var traj = polar[1];
// constrain the angle to +/-2PI, because the ship's rotation is not limited
// by default
var fixed_rot = o.lib.ang.rescale(o.me.rot);
// limit the correction to be +/-1PI
var traj_correction = traj - fixed_rot;
if (traj_correction > (Math.PI)){
traj_correction = (2 * Math.PI) - traj_correction;
} else if (traj_correction < (-1 * Math.PI)){
traj_correction = (2 * Math.PI) + traj_correction;
}
एक सरल सूत्र। हर समय मुड़ने में कोई बुराई नहीं है, इसलिए आंशिक टोक़ मूल्यों को लागू करने से परेशान न हों। यदि आपको कोणीय वेग में एक छोटे से सुधार की आवश्यकता है, तो आपको प्रति सेकंड कई बार, वैसे भी यह निर्धारण करने के लिए मिलता है।
if (traj_correction > 0){
torque = 1;
} else if (traj_correction < 0){
torque = -1;
}
एक कम सरल सूत्र। एक बिंदु आएगा जहां आप मोड़ जारी नहीं रखना चाहते, क्योंकि आप अंततः रोकना चाहते हैं। सौभाग्य से, उस कोणीय वेग टोपी का मतलब है कि आप तेजी से अधिकतम कोणीय गति से शून्य तक धीमा कर सकते हैं। ऐसा करने के लिए आपको केवल गणना करने की आवश्यकता है।
var max_a_accel = c.MAX_TORQUE / o.me.m_i;
var a_deccel_time = Math.abs(o.me.a_vel) / max_a_accel;
// the same math as linear acceleration, now in angles.
var stopping_angle = 0.5 * max_a_accel * a_deccel_time * a_deccel_time;
if (stopping_angle >= Math.abs(traj_correction)){
// slowdown required. Reverse torque
torque *= -1;
}
अपनी आवश्यकताओं के अनुरूप ऊपर दिए गए कोड को ट्विक करने के बाद, आपका जहाज तेजी से और ठीक उसी तरह घूमना चाहिए, जिस लक्ष्य को आपने उसे दिया था।
तेज गति
तो, जोर कब लगाना है? फिर से, लक्ष्य और अन्य कारकों का तेजी से परिवर्तन एक सटीक समाधान को हल करने में बड़ी कठिनाई पैदा करता है। करने की कोशिश मत करो।
// if the heading is close to the final value, thrust.
if (Math.abs(traj_correction ) < 0.02) { // about 1 degree
if (true
// some logical test, in case you don't want to accelerate past
// a maximum speed, or some such. Not required for your stated purpose.
){
thrust = 1;
}
}
उन मामलों के लिए जहां आपको आंशिक जोर की आवश्यकता होती है, आप फिर से इस तथ्य पर भरोसा कर सकते हैं कि आप प्रति सेकंड 0 और 1 जोर के बीच कई बार चुन सकते हैं। यह आपको वास्तविक मूल्य को अलग किए बिना एक प्रभावी आंशिक जोर देता है।
सौभाग्य!