আপনার প্রশ্নের প্রসঙ্গে, http://nodewar.com/ , আপনার সমাধানের জন্য কয়েকটি নির্দিষ্ট বিবেচনা রয়েছে:
- আপনার কাছে (কম) সর্বাধিক কৌণিক বেগ এবং খুব অল্প সময়ের মধ্যে এটি পৌঁছানোর জন্য পর্যাপ্ত সর্বাধিক টর্ক have
- আপনার ড্রোন এবং টার্গেটের প্রতিটিটির বেগ এবং বাহ্যিক ত্বরণ থ্রাস্টের সাথে সম্পর্কিত নয় (মহাকর্ষ প্রচুর পরিমাণে)।
- আপনার কাঙ্ক্ষিত লক্ষ্যটি এত ঘন ঘন পরিবর্তিত হয় যে নিখুঁতভাবে লক্ষ্য করার চেষ্টা করা ব্যর্থ হবে। আপনার কাছাকাছি যাওয়ার চেষ্টা করা উচিত, এবং প্রতিটি ফ্রেম এটি সংশোধন করা উচিত।
এই পদ্ধতিগুলি আমি পছন্দসই ত্বরণে পৌঁছানোর জন্য কাজ করার জন্য স্থির করেছিলাম।
ত্বরণ, বেগ নয়
আপনার ইতিমধ্যে একটি প্রদত্ত বেগ রয়েছে বলে এবং আপনার লক্ষ্যটি চলমান, আপনার কোনও বিন্দুর দিকে জোরের প্রয়োজন নেই। আপনার বেগটি যা হওয়া উচিত তা পরিবর্তন করার জন্য আপনাকে জোর দেওয়া দরকার। এর অর্থ হ'ল আপনার জাহাজটি কোথায় যাচ্ছে তার দিকে ইঙ্গিত করা উচিত নয়, তবে এটি যেদিকে গতিবেগ করবে in
// 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)
);
ডান শিরোনাম দিকে স্টিয়ারিং
আপনার কাছে একটি ত্বরণ ভেক্টর রয়েছে, এখন আপনি এটি প্রয়োগ করতে চান। আপনাকে কতদূর ঘোরানো দরকার তা নির্ধারণ করুন। আমি সম্ভবত এখানে প্রয়োজনের চেয়ে আরও বেশি পদক্ষেপগুলি ব্যবহার করেছি, তবে ঘোরানো স্থানাঙ্কগুলি আমাকে বিভ্রান্ত করে, এবং আমি মনে করি না আনপ্যাড জাহাজের ঘূর্ণন মানটি যাইহোক API এ একটি বাগ in
// 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 এর মধ্যে বহুবার চয়ন করতে পারেন। এটি আপনাকে আসল মান পরিবর্তিত না করে কার্যকর আংশিক চাপ দেয়।
শুভকামনা!