मुझे पता है कि यह एक पुराना सवाल है, लेकिन मुझे लगता है कि कुछ ऐसा है जो अब तक दिए गए उत्तरों में छूट गया है। मूल प्रश्न में, मिसाइल (या जो भी) को लक्ष्य की स्थिति में तेजी लाने के लिए कहा गया था। कई जवाबों ने बताया कि यह गलत था, और आपको यह सोचना चाहिए कि आपको लगता है कि लक्ष्य कुछ समय बाद होगा। यह बेहतर है लेकिन फिर भी गलत है।
आप वास्तव में जो करना चाहते हैं, वह लक्ष्य की ओर नहीं बढ़ता है बल्कि लक्ष्य की ओर बढ़ता है । इसके बारे में सोचने का तरीका लक्ष्य पर इंगित वांछित वेग (या लक्ष्य स्थान का एक प्रक्षेपण) को सेट करना है और फिर यह पता लगाना है कि आप किस त्वरण को सर्वोत्तम रूप से लागू कर सकते हैं (जो भी प्रतिबंध आपके पास है, यानी एक मिसाइल शायद त्वरित नहीं हो सकती है) सीधे अपने वांछित वेग को प्राप्त करने के लिए) (याद रहे कि वेग एक वेक्टर है)।
यहां एक काम किया उदाहरण है जिसे मैंने आज सुबह लागू किया है, मेरे मामले में एक खिलाड़ी एआई के लिए एक खेल सिमुलेशन खेल में, जहां खिलाड़ी अपने प्रतिद्वंद्वी का पीछा करने की कोशिश कर रहा है। आंदोलन को एक मानक 'किक-बहाव' मॉडल द्वारा नियंत्रित किया जाता है जहां वेग को अद्यतन करने के लिए एक टाइमस्टेप की शुरुआत में लागू किया जाता है और फिर टाइमस्टेप की अवधि के लिए उस वेग पर वस्तुओं को बहाव होता है।
मैं इस की व्युत्पत्ति पोस्ट करूँगा, लेकिन मैंने पाया है कि इस साइट पर कोई गणित मार्कअप समर्थित नहीं है। बू! आपको बस यह विश्वास करना होगा कि यह इष्टतम समाधान है, मेरे असर में है कि मुझे त्वरण दिशा पर कोई प्रतिबंध नहीं है, जो कि मिसाइल प्रकार की वस्तु के लिए नहीं है, इसलिए इसके लिए कुछ अतिरिक्त बाधाओं की आवश्यकता होगी।
कोड अजगर में है, लेकिन किसी भी भाषा की पृष्ठभूमि के साथ पठनीय होना चाहिए। सादगी के लिए, मुझे लगता है कि हर बार कदम 1 की लंबाई है और प्रतिबिंबित करने के लिए उपयुक्त इकाइयों में वेग और त्वरण व्यक्त करते हैं।
self.x = # current x co-ordinate
self.y = # current y co-ordinate
self.angle = # current angle of motion
self.current_speed = # current magnitude of the velocity
self.acc # Maximum acceleration player can exert on themselves
target_x = # x co-ordinate of target position or projection of it
target_y = # y co-ordinate of target position or projection of it
vx = self.current_speed * math.cos(self.angle) # current velocity x component
vy = self.current_speed * math.sin(self.angle) # current velocity y component
# Find best direction to accelerate
acc_angle = math.atan2(self.x + vx - target_x,self.y + vy - target_y)
ध्यान दें कि atan2 (ए, बी) फ़ंक्शन एक / बी के उलटा तन की गणना करता है, लेकिन यह सुनिश्चित करता है कि कोण एक सर्कल के सही चतुर्थांश में बैठता है, जिसे ए और बी दोनों के संकेत को जानने की आवश्यकता होती है।
मेरे मामले में, एक बार मेरे पास त्वरण है जो मैं लागू करता हूं कि वेग को अपडेट करने के लिए
vx_new = vx + self.acc * math.cos(acc_angle)
vy_new = vy + self.acc * math.sin(acc_angle)
self.current_speed = math.sqrt( vx_new**2 + vy_new**2)
self.angle = math.atan2(vy_new,vx_new)
मैं भी एक खिलाड़ी पर निर्भर अधिकतम गति के खिलाफ नई गति की जाँच करें और उस पर टोपी। एक मिसाइल, कार या अधिकतम मोड़ दर (टिक में डिग्री में) के साथ आप बस गति के वर्तमान कोण को देख सकते हैं, परिकलित आदर्श बनाम और यदि यह परिवर्तन अनुमति से अधिक है, तो कोण को इस प्रकार बदलें आदर्श के प्रति जितना संभव हो सके।
इसके व्युत्पत्ति में रुचि रखने वाले किसी भी व्यक्ति के लिए, मैंने शुरुआती स्थिति, वेग, त्वरण दर और त्वरण कोण के संदर्भ में, टाइमस्टेप के बाद खिलाड़ी और लक्ष्य के बीच की दूरी को लिखा, फिर त्वरण कोण के संबंध में व्युत्पत्ति को लिया। शून्य से सेटिंग करने पर त्वरक कोण के एक फ़ंक्शन के रूप में टाइमस्टेप के बाद खिलाड़ी-लक्ष्य दूरी की मिनीमा पाता है, जिसे हम जानना चाहते हैं। दिलचस्प बात यह है कि भले ही एक्सेलेरेशन रेट मूल रूप से समीकरणों में था, लेकिन यह इष्टतम दिशा को यह बताकर रद्द कर देता है कि आप वास्तव में कितनी तेजी लाने में सक्षम हैं।