असली समस्या यह पता लग रही है कि बुलेट लक्ष्य पथ को कैसे छेड़छाड़ कर सकता है। बुलेट की गति निरंतर है, इसलिए एक निश्चित मात्रा में यह उसी दिशा में यात्रा करेगा जिस पर हम इसे आग लगाते हैं। इसका मतलब है कि समय टी हमेशा एक क्षेत्र पर झूठ बोलने के बाद यह स्थिति है। यहाँ 2 डी में एक बदसूरत उदाहरण दिया गया है:
इस क्षेत्र के रूप में गणितीय व्यक्त किया जा सकता:
(x-x_b0)^2 + (y-y_b0)^2 + (z-z_b0)^2 = (bulletSpeed * t)^2 (eq 1)
x_b0, y_b0 और तोप की स्थिति को निरूपित z_b0।
targetPos+t*targetVelocityVec (eq 2)
(eq 2)
एक वेक्टर समीकरण है और तीन अलग-अलग समीकरणों में विघटित किया जा सकता है::
x = x_t0 + t * v_x
y = y_t0 + t * v_y
z = z_t0 + t * v_z
इन तीन आप टी के लिए इस समीकरण को हल समीकरण अपने प्रश्न में प्रदान की जाती का उपयोग करके समय टी पा सकते हैं समीकरणों (eq 1)
में डाला जा सकता:
(x_t0 + t * v_x - x_b0)^2 + (y_t0 + t * v_y - y_b0)^2 + (z_t0 + t * v_z - z_b0)^2 = (bulletSpeed * t)^2
इस समीकरण केवल ज्ञात चर होते हैं और टी के लिए हल किया जा सकता। स्थिरांक को द्विघात subexpressions की लगातार हिस्सा आवंटित करके हम गणना को आसान बनाने में कर सकते हैं:
c_1 = x_t0 - x_b0
c_2 = y_t0 - y_b0
c_3 = z_t0 - z_b0
(v_b = bulletSpeed)
(t * v_x + c_1)^2 + (t * v_y + c_2)^2 + (t * v_z + c_3)^2 = (v_b * t)^2
एक मानक द्विघात समीकरण के रूप में यह पुनर्व्यवस्थित करें:
(v_x^2+v_y^2+v_z^2-v_b^2)t^2 + 2*(v_x*c_1+v_y*c_2+v_z*c_3)t + (c_1^2+c_2^2+c_3^2) = 0
यह मानक सूत्र का उपयोग कर आसानी से व्याख्या करने योग्य है। इसका परिणाम शून्य, एक या दो समाधान हो सकता है। शून्य समाधान (जटिल समाधानों की गणना नहीं) का मतलब है कि बुलेट लक्ष्य तक पहुंचने का कोई संभावित तरीका नहीं है। एक समाधान शायद ही कभी होता है, जब लक्ष्य प्रक्षेपवक्र क्षेत्र के बहुत किनारे के साथ छेड़छाड़ करता है। दो समाधान सबसे आम परिदृश्य होंगे। एक नकारात्मक समाधान का मतलब है कि आप लक्ष्य को हिट नहीं कर सकते हैं, क्योंकि आपको बुलेट को अतीत में आग लगाना होगा। ये सभी शर्तें हैं जिनकी आपको जांच करनी होगी।
जब आप समीकरण हल कर लेते हैं तो आप उसे (eq 2)
में डालकर टी की स्थिति पा सकते हैं।छद्म कोड में:
# setup all needed variables
c_1 = x_t0 - x_b0
c_2 = y_t0 - y_b0
c_3 = z_t0 - z_b0
v_b = bulletSpeed
# ... and so on
a = v_x^2+v_y^2+v_z^2-v_b^2
b = 2*(v_x*c_1+v_y*c_2+v_z*c_3)
c = c_1^2+c_2^2+c_3^2
if b^2 < 4*a*c:
# no real solutions
raise error
p = -b/(2*a)
q = sqrt(b^2 - 4*a*c)/(2*a)
t1 = p-q
t2 = p+q
if t1 < 0 and t2 < 0:
# no positive solutions, all possible trajectories are in the past
raise error
# we want to hit it at the earliest possible time
if t1 > t2: t = t2
else: t = t1
# calculate point of collision
x = x_t0 + t * v_x
y = y_t0 + t * v_y
z = z_t0 + t * v_z
फेंकने पर विचार इस प्रकार एक सीधे प्रक्षेपवक्र तकनीकी तौर पर नहीं समस्या बहुत नीरस :-( – salva