आप किसी भी समय तीर का कोण चाहते हैं। आपको याद है कि एक कोण की गणना करने के लिए, एक स्पर्शरेखा है। लेकिन यहां आपकी सोच गलत होने लगी है:
- आप जो चाहते हैं वह डेल्टा y / डेल्टा x है, क्योंकि ढलान परिवर्तन की दर है (अन्य उत्तरों में से एक में उल्लिखित)। ध्यान दें कि x केवल वह स्थिति है जहाँ आप किसी भी समय, dx नहीं हैं।
ठीक है, इसलिए यदि आप वायु घर्षण की उपेक्षा करते हैं, तो तीर का एक्स-वेग एक स्थिर है।
सबसे पहले, x और y घटकों में वेग को विघटित करें। आप 45 डिग्री या 60 डिग्री के कोण पर शूटिंग कर सकते हैं। तो आपको लॉन्चवैलोसिटी और एक कोण की आवश्यकता है, यह एक स्केलर नहीं है।
दूसरा, सब कुछ डबल के रूप में गणना करें, फ्लोट नहीं। जब आप राउंडऑफ़ त्रुटि को नहीं मारेंगे, तो आप यह जानने के लिए पर्याप्त रूप से परिष्कृत नहीं होंगे कि आप प्रयास न करें। यह किसी भी मामले में एक महान समय बचाने वाला नहीं है।
तीसरा, Math.pow का उपयोग न करें, यह धीमा है और पूर्णांक शक्तियों के लिए गुणा के रूप में सटीक नहीं है। इसके अलावा आप हॉर्नर के फॉर्म का उपयोग करके बहुत समय बचा सकते हैं (नीचे देखें)
final double DEG2RAD = Math.PI/180;
double ang = launchAngle * DEG2RAD;
double v0x = launchVelocity * cos(ang); // initial velocity in x
double v0y = launchVelocity * sin(ang); // initial velocity in y
double x = (v0x * time);
// double y = (v0y * time) + (0.5 * g * (float)Math.Pow(time, 2));
double y = (0.5 * g * time + v0y) * time
यदि आप प्रदर्शन के लिए बेताब हैं, तो आप 0.5 * g को भी रोक सकते हैं, लेकिन उपरोक्त कोड आपको 90% तक ले जाएगा, बिना कुछ पागल किए। यदि आप चाहें तो बेंचमार्क 10 मिलियन बार कर रहे हैं, यह वास्तव में समय की एक बड़ी राशि नहीं है, लेकिन प्रतिशत-वार यह बहुत बड़ा है - पुस्तकालयों जावा में बहुत धीमी हैं
तो, यदि आप कोण चाहते थे जिस पर तीर जाना चाहिए, तो आप क्या चाहते हैं
atan(dy/dx)
और इस मामले में, यह काम करेगा क्योंकि dx एक स्थिर है। लेकिन सामान्य तौर पर, dx शून्य हो सकता है, इसलिए आप आमतौर पर उपयोग करना चाहते हैं:
atan2(dy, dx)
जो इस कार्य के लिए विशेष रूप से डिज़ाइन किया गया एक फ़ंक्शन है।
लेकिन जैसा कि मैंने कहा, जावा में लाइब्रेरी फ़ंक्शंस छिपे हुए धीमी गति से होते हैं, और इस मामले में ऊपर @FxIII द्वारा आबंटित किए बिना इसे करने का एक बेहतर तरीका है।
यदि क्षैतिज वेग हमेशा v0x है, और ऊर्ध्वाधर वेग है:
double vy = v0y - 0.5 * g * time;
फिर आपका डेल्टा है: vx, vy
आपको कोण की आवश्यकता नहीं है। यदि आप एक तीर खींचना चाहते हैं, तो नाममात्र का उपयोग करें:
प्लॉट (x, y, x + vx, y + vy);
मुझे नहीं पता कि आप क्या ड्राइंग कर रहे हैं, इसलिए यदि आपको इसे घुमाने के लिए कोण की आवश्यकता है (जैसे आप JOGL का उपयोग कर रहे हैं) तो निश्चित रूप से, कोण का उपयोग करें।
यदि आप कोण को वापस डिग्री में बदलने के लिए opengl का उपयोग कर रहे हैं, तो यह न भूलें कि ATAN2 रिटर्न रेडियंस:
final double RAD2DEG = 180 / Math.PI;
double ang = Math.atan2(vy,vx); // don't forget, vy first!!!
double deg = ang * RAD2DEG;