2013-07-08 8 views
5

यह उत्तर दिया गया है, क्षमा करें अगर यह है। मुझे मूल रूप से कोण से बिंदु तक कोण प्राप्त करने की आवश्यकता है। तो मान लें कि उत्पत्ति है (0, 0) और मेरा लक्ष्य बिंदु (3, 0) है।बिंदु और उत्पत्ति के बीच कोण प्राप्त करें

3 बजे = 90 अंश

6 बजे = 180 डिग्री

9 बजे = 270 डिग्री

12 बजे = 0 डिग्री


किसी भी तरह, मुझे कुछ गणित जादू करना होगा, और पता लगाएं कि कोण 90 डिग्री (शीर्ष 0 है) है। उत्पत्ति भिन्न हो सकती है, इसलिए मुझे दो पैरामीटर, उत्पत्ति और लक्ष्यपॉइंट के साथ एक विधि की आवश्यकता है, जो डिग्री में डबल कोण देता है।

हां, मैं इस छोटे से और nonconstructive लग रहा है एहसास है, लेकिन मैं प्रश्न के रूप में सरल और संभव के रूप में समझा जा सकता बना दिया। अन्य सभी सवालों के बंद कर दिया गया -.-

धन्यवाद

+3

एक कोण दो पंक्तियों के बीच है ... दो बिंदु नहीं, जब तक आप एक पंक्ति के कोण की बात नहीं कर रहे हैं, दुनिया की तुलना में? यह भी ... क्या यह होमवर्क के लिए है? – LightStriker

+0

नहीं, मुझे मूल और बिंदु के बीच कोण की आवश्यकता है। इसे घड़ी के रूप में सोचें, उत्पत्ति (केंद्र) के बारे में 3 बजे 90 डिग्री है। नहीं, मैं एक खेल पर काम कर रहा हूं। – Dave

+1

@LightStriker लोगों को इस सवाल को समझने में इतनी परेशानी क्यों है? ** कोर्स ** में आप दो बिंदुओं के बीच एक कोण नहीं कर सकते हैं, लेकिन यह समझना इतना मुश्किल क्यों है कि बहुत से प्रोग्रामर इसे सिखाया नहीं गया है? वे सभी जानते हैं कि वे 0 डिग्री ऊपर हैं और उन्हें एक कोण खोजने की जरूरत है जो एक और स्प्राइट पर एक स्प्राइट प्वाइंट बना देगा। अधिकांश प्रोग्रामर जो इस प्रश्न से पूछते हैं, उनके पास कोण के लिए तीन बिंदुओं (या दो लाइनों, यदि आप चाहें) की आवश्यकता की अवधारणा को समझने के लिए गणित पृष्ठभूमि नहीं है। [/ rant] – Clonkex

उत्तर

11

दो अंक ए और बी के बीच वेक्टर बी एक = (B.x-A.x, B.y-A.y) है। दो वैक्टरों के बीच कोण की गणना dot product या atan2 के साथ की जा सकती है।

var vector2 = Target - Origin; 
var vector1 = new Point(0, 1) // 12 o'clock == 0°, assuming that y goes from bottom to top 

double angleInRadians = Math.Atan2(vector2.Y, vector2.X) - Math.Atan2(vector1.Y, vector1.X); 

भी Finding Signed Angle Between Vectors

+1

तो: 'Math.Atan2 (Origin.Y - Target.Y, Origin.X - Target.X); '? और यह रेडियंस है, है ना? – Dave

+0

@ user2544245: आपको ** ** ** ** की आवश्यकता है। दूसरा वेक्टर उस दिशा में इंगित करता है जिसे आप 0 डिग्री का प्रतिनिधित्व करना चाहते हैं। घड़ी की दिशा में, हाँ। आपका सूत्र गलत है, यद्यपि। –

+0

आपके सूत्र में, क्या इससे कोई फर्क पड़ता है कि उत्पत्ति कौन सा है और कौन सा लक्ष्य है? – Dave

1

देखें इस तरह मान लिया जाये कि x सकारात्मक है, कुछ:

angle = Math.Atan(y/x) * 180/Math.PI + 90 

संपादित नकारात्मक x मूल्यों के लिए अनुमति देने के लिए: यह नकारात्मक हो सकता है, तो

, बस करो यह मामला है। कुछ इस तरह:

if (x < 0) { 
    angle = 270 - (Math.Atan(y/-x) * 180/Math.PI); 
} else { 
    angle = 90 + (Math.Atan(y/x) * 180/Math.PI); 
} 
+0

वैसे एक्स और वाई सकारात्मक या नकारात्मक हो सकते हैं। – Dave

+2

उसे मत छोड़ो, वह सिर्फ मदद करने की कोशिश कर रहा है। – Dave

0
public static double GetAngleDegree(Point origin, Point target) { 
    var n = 270 - (Math.Atan2(origin.Y - target.Y, origin.X - target.X)) * 180/Math.PI; 
    return n % 360; 
} 

static void Main(string[] args) 
{ 
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(0, 3)));//0 
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(3, 0)));//90 
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(0, -3)));//180 
    Console.WriteLine(GetAngleDegree(new Point(0, 0), new Point(-3, 0)));//270 
} 
+1

ऐसा लगता है कि यह काउंटरक्लॉक वार जा रहा है, ** (0, 3) ** 0 डिग्री होने के साथ। – Dave

+0

यह कोण द्वारा अंक क्रमबद्ध करने के लिए एकदम सही समाधान है। –

0

असल में वहाँ तथ्य यह है कि मूल है (0,0) की वजह से बिंदु और मूल के बीच के कोण पता लगाने के लिए कोई रास्ता नहीं है। हम 2 बिंदुओं के बीच कोण की गणना कर सकते हैं, वे वैक्टर की तरह व्यवहार करते हैं और इस तरह उनके पास एक दिशा होती है, लेकिन मूल की कोई दिशा नहीं होती है। इसी कारण से, यदि आप घड़ी के उदाहरण का उपयोग करके कोण खोजना चाहते हैं तो आप बिंदु के बीच कोण की गणना कर सकते हैं और (1,0) उदाहरण के लिए उस बिंदु 0 डिग्री पर हो।

मैं माफी चाहता हूँ मैं सी # में निपुण नहीं कर रहा हूँ, लेकिन आप इस जावा कोड जो इसी तरह की है पर एक नजर है कर सकते हैं:

double getAngle2PointsRad(double p1_x, double p1_y, double p2_x, double p2_y) { 
    return Math.acos((((p1_x * p2_x) + (p1_y * p2_y))/(Math.sqrt(Math.pow(p1_x, 2) + Math.pow(p1_y, 2)) * Math.sqrt(Math.pow(p2_x, 2) + Math.pow(p2_y, 2))))); 
} 

double getAngle2PointsDeg(double p1_x, double p1_y, double p2_x, double p2_y) { 
    return Math.acos((((p1_x * p2_x) + (p1_y * p2_y))/(Math.sqrt(Math.pow(p1_x, 2) + Math.pow(p1_y, 2)) * Math.sqrt(Math.pow(p2_x, 2) + Math.pow(p2_y, 2))))) * 180/Math.PI; 
} 

आप उपयोग कर की गणना के लिए (0,0) का प्रयास करते हैं आप मिल जाएगा NaN beacuse यह शून्य से विभाजित करने की कोशिश करता है।

संबंधित मुद्दे