परवलयिक चाप में लक्ष्य को हिट करने के लिए आवश्यक प्रक्षेप्य के न्यूनतम वेग की गणना


20

अगर मेरे पास एक बिंदु है जिसे मैं अंत में या एक परवलयिक आर्क के दौरान हिट करना चाहता हूं, तो मैं आवश्यक x और y वेग की गणना कैसे करूंगा?


जवाबों:


15

परवलयिक ट्रेक्टोरी फ़ंक्शन को निम्न के रूप में परिभाषित किया गया है:

   Fx = Vox*t + Ox;
   Fy = -0.5 * g * t * t + Voy*t + Oy;      
  • ज्ञात मूल्य:

    P: the target point.
    O: the origin point.
    g: gravity.
    t: time needed to impact.
  • अज्ञात मान:

    Vo: Initial Velocity
  • 'Vo' की गणना करने के लिए, हम F फ़ंक्शन को मान दे सकते हैं:

    't' = flight time  'duration' 
    'F' = target point 'P'        
    
          (Px-Ox)
    Vox = --------
          duration
    
          Py + 0.5* g * duration * duration - Oy 
    Voy = ---------------------------------------
                     duration
  • अब आप एफ समीकरण में टी को मान देने वाले मूल से लक्ष्य तक पहुंचने के लिए सभी मूल्य प्राप्त कर सकते हैं:

     When t = 0         => F == O (Origin)
     When t = duration  => F == P (Target)      

बहुत बढ़िया जवाब। बस एहसास है कि जी हस्ताक्षरित नहीं है। जैसे-जैसे जी बढ़ता है, वॉय को भी बढ़ना चाहिए।
दूधप्लस

टी (प्रभाव के लिए आवश्यक समय) को कैसे जाना जाता है?
देवलद स्वानपेल

13

मुझे हाल ही में इसी तरह की समस्या को हल करना था, मैं दो समाधानों के साथ आया था, विकिपीडिया पृष्ठ 'डैन द मैन' में पाए गए सूत्र के आधार पर पहले ही उल्लेख किया गया है: प्रक्षेपवक्र का प्रक्षेपवक्र

इस समाधान में आपको निश्चित रूप से लॉन्च कोण तय या एक्स वेग की आवश्यकता होती है। वाई वेग की जरूरत नहीं है क्योंकि हम एक विशिष्ट कोण में प्रक्षेप्य को लॉन्च करते हैं।

समाधान 1, लॉन्च कोण तय हो गया है, वेग की गणना करें:

g = 9.81; // gravity
x = 49; // target x
y = 0; // target y
o = 45; // launch angle
v = (sqrt(g) * sqrt(x) * sqrt((tan(o)*tan(o))+1)) / sqrt(2 * tan(o) - (2 * g * y) / x); // velocity

समाधान 2, वेग तय हो गया है, लॉन्च कोण की गणना करें:

g = 9.81; // gravity
v = 40; // velocity
x = 42; // target x
y = 0; // target y
s = (v * v * v * v) - g * (g * (x * x) + 2 * y * (v * v)); //substitution
o = atan(((v * v) + sqrt(s)) / (g * x)); // launch angle

मेरे मामले में इस समाधान ने काफी अच्छा काम किया।


2

यदि आप इसकी परवाह नहीं करते हैं कि यह गणितीय रूप से सही है, केवल यह कि यह काफी सही लग रहा है, तो सीधे पथ की गणना करें और अपने प्रक्षेप्य को उस पथ का अनुसरण करें, लेकिन उस पंक्ति के सामान्य के साथ "पुश अप" करें, यह फ़ंक्शन के रूप में दूर है। लाइन सेगमेंट, इसलिए यह उगता है क्योंकि यह सेगमेंट के बीच में आता है और लाइन सेगमेंट के बीच से दूर चला जाता है।

इसके लिए आप एक साइन वेव का उपयोग कर सकते हैं, -90 से +90 तक की सीमा का उपयोग करते हुए (जहां -90 लाइन सेगमेंट पर बाएं बिंदु है, 90 दाएं बिंदु है, और आप बीच में लेरप करते हैं), और परिणाम को गुणा करें इसे स्थिर करने के लिए एक निरंतरता से।

यदि आपको विशुद्ध रूप से सही गणितीय / भौतिक उत्तर की आवश्यकता है तो यह मदद नहीं करेगा। यदि आप नहीं करते हैं, तो यह संभवतः आपके लिए बहुत अच्छा काम कर सकता है!

मत भूलो, गेम प्रोग्रामिंग भ्रम के उपयोग के बारे में है जो यथार्थवाद के बजाय सही (और गणना करने के लिए सस्ता है)।


7
पुन :: "भ्रम का उपयोग करना जो सही दिखते हैं (और गणना करने के लिए सस्ता हैं)", मैं सामान्य रूप से सहमत हूं, लेकिन इस मामले में यह थोड़े मूर्खतापूर्ण लगता है कि गणितीय रूप से सही पैराबोलिक चाप का उपयोग करना कितना आसान और सस्ता है।
नाथन रीड

1
यह सच है कि यह एक अनावश्यक सरलीकरण लगता है, लेकिन मुझे नहीं लगता कि यह उत्तर बुरे अर्थों में बुरा है, और यह डाउनवोट के लायक नहीं है (भले ही यह कई अपवित्रों को योग्यता न दे)।
विल

वास्तव में यदि आप साइन वेव का उपयोग करने जा रहे हैं, तो यह 0 से 180 (या रेडियन में पीआई) होना चाहिए
डैनियल कापलान

2

यदि आपको बस कुछ की आवश्यकता है जो सिर्फ सही के बारे में है और एक निश्चित वेग है तो आप इस बहुत ही सरल तरीके का उपयोग कर सकते हैं।

distance = to.x - from.x;
angleToPoint = atan2(to.y - from.y, to.x - from.x);
distanceFactor = 1/1000;
angleCorrection = (PI*0.18) * (distance * distanceFactor);
velocity.X = cos(angleToPoint+angleCorrection) * power;
velocity.Y = sin(angleToPoint+angleCorrection) * power;

दूरी नकारात्मक हो सकती है लेकिन यह अभी भी काम करेगा क्योंकि कोण दूरी पर भी निर्भर करता है। यदि दूरी ऋणात्मक है तो जिस कोण को जोड़ना है वह नकारात्मक भी है।

आपको सही मान खोजने के लिए दूर-दराज के साथ खेलने की आवश्यकता होगी। यह प्रक्षेप्य के गुरुत्वाकर्षण और शक्ति पर निर्भर करता है। यह 1 के पास होना चाहिए, जो अधिकतम दूरी के माध्यम से विभाजित हो सकता है।


1
सचेत। जब मैंने आपका कोड आज़माया, तो आपके पास कॉस और पाप पीछे की ओर था। मैंने आपका कोड संपादित कर दिया है, इसलिए यह सही होना चाहिए।
MrValdez
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.