2013-08-04 8 views
5

के साथ (0,0) के अलावा अन्य स्थिति से समन्वय (x, y) हिट करने के लिए आवश्यक कोण की गणना करें, मैं एक विशिष्ट समन्वय को हिट करने के लिए प्रोजेक्ट को आग लगाने के लिए आवश्यक कोण की गणना करने का प्रयास कर रहा हूं।अलग-अलग ऊंचाई

मेरा प्रोजेक्ट एक यादृच्छिक समन्वय और एक स्थिर समन्वय पर मेरा लक्ष्य समन्वय स्थित है। कुछ प्रयास

मैं बना दिया है:

मैं कोण हिट करने के लिए (0,0) से (एक्स, वाई) में समन्वय की आवश्यकता की गणना के लिए विकिपीडिया पर निम्न समीकरण भर में चल रहा समाप्त हो गया इस और अन्य सूत्र को समझने के लिए और निम्नलिखित कार्यान्वयन का प्रयास किया (मैं सी # और एक्सएनए का उपयोग कर रहा हूं)।

double y = source.Y - target.Y; 
double x = Vector2.Distance(source, target); 
double v = 1440; //velocity 
double g = 25; //gravity 
double sqrt = (v*v*v*v) - (g*(g*(x*x) + 2*y*(v*v))); 
sqrt = Math.Sqrt(sqrt); 
double angleInRadians = Math.Atan(((v*v) + sqrt)/(g*x)); 

मैंने निम्नलिखित का भी प्रयास किया है, जिसके परिणामस्वरूप एक समान कोण है जहां वी और जी के मान समान रहते हैं।

double targetX = target.X - source.X; 
double targetY = -(target.Y - source.Y); 
double r1 = Math.Sqrt((v*v*v*v) - g*(g*(target.X*target.X) + ((2*target.Y)*(v*v)))); 
double a1 = ((v*v) + r1)/(g*target.X); 
angleInRadians = -Math.Atan(a1); 
if (targetX < 0) 
{ 
    angleInRadians -= 180/180*Math.PI; 
} 

मेरे अनुमान है कि यहां तक ​​कि मेरी (कल्पित) को शून्य करने की कोशिश में स्रोत समन्वय, कि मैं अभी भी एक गैर (0,0) स्रोत और विभिन्न ऊँचाइयों साथ निर्देशांक के लिए सही ढंग से गणना प्रदर्शन नहीं कर रहा हूँ।

नीचे एक छवि है जो मेरी समन्वय प्रणाली को दर्शाती है। यह एक्सएनए के लिए डिफ़ॉल्ट है।

+1

मुझे लगता है कि आप (0,0) आधारित प्रणाली के लिए अपने वास्तविक पदों का अनुवाद होना चाहिए, वहाँ समारोह में प्रदर्शन और से एक अंतिम अनुवाद प्रदर्शन (0,0) वास्तविक प्रणाली के लिए ... मानते हैं कि गुरुत्वाकर्षण के अलावा कोई कारक नहीं हैं, कोण गणना किसी भी स्रोत से समान होनी चाहिए ... –

+0

प्रोजेक्टाइल पथ को प्रभावित करने वाले अन्य पैरामीटर (इनपुट) क्या हैं, जैसे वेग और गुरुत्वाकर्षण स्थिरांक या अन्य चर क्या हैं? –

+0

गुरुत्वाकर्षण नकारात्मक नहीं होना चाहिए? अगर मैं सही ढंग से याद करता हूं तो यह -9.8 मीटर/एस है। –

उत्तर

2

इस कोण को खोजने के लिए समाधान टिप्पणी में मदद के लिए धन्यवाद की आवश्यकता होती है कि पदों एक (0,0) आधारित प्रणाली के लिए अनुवाद किया जा समाप्त हो गया। किसी को भी एक ही परिदृश्य की तलाश के लिए अंतिम काम कर समाधान किया गया था:

double x = -(source.x - target.x); 
double y = (source.y - target.y); 
double v = 1440; //m/s 
double g = 25; //m/s 
double sqrt = (v*v*v*v) - (g*(g*(x*x) + 2*y*(v*v))); 
sqrt = Math.Sqrt(sqrt); 
angleInRadians = Math.Atan(((v*v) + sqrt)/(g*x)); 

फिर एक वेक्टर कि XNA के साथ काम करता में रेडियंस कन्वर्ट करने के लिए, नीचे दिए गए रूपांतरण करते हैं:

Vector2 angleVector = new Vector2(-(float)Math.Cos(angleInRadians), (float)Math.Sin(angleInRadians)); 
+0

रिकॉर्ड के लिए, यदि कोई और इस पर आता है और इसे उपयोगी पाता है: वापसी मूल्य एक सामान्यीकृत वेक्टर है। मेरे मामले में, मुझे केवल प्रोजेक्टाइल थूथन वेग के साथ इसे स्केल करना पड़ा। जावा/libgdx का उपयोग कर: 'return angleVector.scl ((float) RifleBullet.projectileSpeed);' – Jarmund

1

मैं वास्तविक समस्या लगता है आर्कटान के उपयोग में निहित है। क्योंकि सीमा सीमित है -पीआई/2. पीआई/2 परिणाम केवल दाएं आधे विमान में हैं।

उपयोग arctan2 उचित निर्देशांक पाने के लिए:

angleInRadians = Math.Atan2(((v*v) + tmp), (g*x)); 
संबंधित मुद्दे