2010-07-22 13 views
26

के साथ 2 अंकों के बीच की डिग्री की गणना करना मैं जावास्क्रिप्ट/कैनवास में एक साधारण 2 डी गेम बना रहा हूं। मुझे अपनी स्थिति के सापेक्ष किसी निश्चित वस्तु के कोण को समझने की आवश्यकता है।व्यस्त वाई अक्ष

तो: कहें कि मैं (10,10) पर हूं और ऑब्जेक्ट (10,5) पर है - जिसके परिणामस्वरूप 90 डिग्री (सकारात्मक वाई नीचे है, नकारात्मक वाई ऊपर है) (10,10) बनाम (10,15) 270 डिग्री होगा।

मैं इसके बारे में कैसे जाऊं?

+0

कोण से कहाँ देखा गया? –

+0

मैं उलझन में हूं कि आप कोण को कैसे निर्धारित कर रहे हैं ... क्या आप पूरे समय एक निश्चित दिशा में सामना कर रहे हैं? – rownage

+0

@ डरावना: जब तक मैंने गलत समझा नहीं है, तो बिंदु वेक्टर के उन्मुखीकरण को निर्धारित करना है जो एक स्थिति से दूसरी स्थिति में इंगित करता है। –

उत्तर

37

मान लीजिए कि आप (ए, बी) पर हैं और ऑब्जेक्ट (सी, डी) पर है। फिर आपके लिए ऑब्जेक्ट की सापेक्ष स्थिति (x, y) = (सी - ए, डी - बी) है।

फिर आप रेडियंस में कोण प्राप्त करने के लिए Math.atan2() function का उपयोग कर सकते हैं।

var theta = Math.atan2(-y, x); 

ध्यान दें कि परिणाम रेंज [-π, π] में है। आप गैर नकारात्मक संख्या की जरूरत है, तो आप डिग्री

if (theta < 0) 
    theta += 2 * Math.PI; 

जोड़ सकते हैं और परिवर्तित रेडियंस, 180/Math.PI से गुणा करना होगा।

6

अपने निर्देशांक (xMe, yMe) और उनके निर्देशांक तो आप सूत्र का उपयोग कर सकते हैं, कर रहे हैं (xThem, yThem) हैं:

arctan((yMe-yThem)/(xThem-xMe))

सामान्य रूप से इसे arctan((yThem-yMe)/(xThem-xMe)) होगा, लेकिन इस मामले में वाई-अक्ष का संकेत उलट दिया गया है।

परिणाम को रेडियंस से डिग्री में 180/पीआई से गुणा करने के लिए परिवर्तित करने के लिए।

तो जावास्क्रिप्ट में, इस विचार करेंगे की तरह: Math.atan((yThem-yMe)/(xThem-xMe))*180/Math.PI

atan -pi/2 और pi/2 के बीच कोई मान देता है (कि -90 और 90 डिग्री के बीच, है)। लेकिन आप देख सकते हैं कि आपका क्वाड्रंट (xThem - xMe, yMe - yThem) वेक्टर तदनुसार है और समायोजित करता है।

+2

मुझे वास्तव में केनीटीएम के उत्तर को बेहतर पसंद है। Math.atan2 आपको पता चलेगा कि आप कौन से चतुर्भुज में हैं, इसलिए आप अंतिम चरण से बच गए हैं। –

+0

मुझे अभी भी यह जवाब उपयोगी पाया गया है, यह एक अच्छा विकल्प है क्योंकि मैं अपने स्वयं के चौराहे को नियंत्रित करना चाहता हूं। – Partack

4

आम आदमी की दृष्टि में:

function pointDirection(x1, y1, x2, y2) { 
    return Math.atan2(y2 - y1, x2 - x1) * 180/Math.PI; 
} 
1

एचटीएमएल 5 में कैनवस मूल ऊपरी बाएं कोने इसलिए y अक्ष ऊपर से नीचे तक बढ़ता है। इसलिए आप जहां भी इकाई वृत्त केन्द्र (सी) के लिए बिंदु A का कोण की गणना करने के लिए कर रहे हैं की परवाह किए बिना आप वास्तव में क्या करना चाहिए

तरह

angle = Math.atan2(Cy-Ay,Ax-Cx)

और आप [की रेंज में अपने परिणाम मिलेगा - π, π]।

मुझे नहीं पता कि उन्होंने कैनवास मूल को नीचे बाएं कोने क्यों नहीं बनाया है।

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