Atan2 () से डिग्री 0-360 तक का नक्शा कैसे देखें


108

atan2(y, x) 180 ° पर यह असंतोष है, जहां यह -180 ° .. 0 ° दक्षिणावर्त घूम रहा है।

मैं मानों की श्रेणी को 0 ° ..360 ° पर कैसे दर्ज करूँ?

यहाँ मेरा कोड है:

CGSize deltaPoint = CGSizeMake(endPoint.x - startPoint.x, endPoint.y - startPoint.y);
float swipeBearing = atan2f(deltaPoint.height, deltaPoint.width);

मैं एक स्वाइपिंग टच इवेंट की दिशा की गणना कर रहा हूँ startPointऔर endPoint, दोनों XY पॉइंट स्ट्रक्चर्स। कोड iPhone के लिए है, लेकिन समर्थन करने वाली कोई भी भाषा atan2f()करेगी।


नोट: पोस्ट की गई अपडेट पद्धति शून्य डिग्री नहीं लौटाएगी, लेकिन मान 0 से 360.0 के ऊपर है।
chux -

2
> [2 पदों से कोण कैसे प्राप्त करें] [1] [१]: stackoverflow.com/questions/9457988/…
MAnoj Sarnaik

यह फ़ंक्शन बहुत अच्छा काम करता है, हालांकि "बियरिंगड्रीज" गणना का कोण फ़्लिप किया जाता है। उदाहरण के लिए, 45 डिग्री आम तौर पर 1 चतुर्थांश द्वारा, हालांकि यह 4 चतुर्थांश में होता है। 135 डिग्री आम तौर पर 2 चतुर्थांश में होता है, लेकिन यह फ़ंक्शन इसे 3 जी चतुर्थांश में देता है। मैं बस फंक्शन रिटर्न वैल्यू x ले सकता हूं और यह मानकर कि 360 से सही एंगल वैल्यू प्राप्त कर सकता हूं लेकिन मैं यह जानने के लिए उत्सुक हूं कि यह पहली बार क्यों हो रहा है?
गोवेल

जवाबों:


66
(x > 0 ? x : (2*PI + x)) * 360 / (2*PI)

6
शायद x = 0 केस के लिए भी x> = 0 चाहते हैं।
bpw1621

13
उन लोगों के लिए जो इस संकेतन के साथ सहज नहीं हैं, और बिना बनाए गए डिग्रियों में रूपांतरण के बिना: यदि (x> 0) {रेडियन = x;} और {रेडियंस = 2 * PI + x;} तो हम केवल परिणाम में 2PI जोड़ रहे हैं: यह 0. से कम है
डेविड डोरिया

1
या (x >= 0 ? x : (2*PI + x)) * 180/PIजैसे(x < 0 ? 2*PI + x : x) * 180/PI
user3342816

97

मोदुलो का उपयोग कर समाधान

एक सरल समाधान जो सभी मामलों को पकड़ता है।

degrees = (degrees + 360) % 360;  // +360 for implementations where mod returns negative numbers

व्याख्या

पॉजिटिव: 1 से 180

यदि आप 1 और 180 के बीच 360 में से किसी भी सकारात्मक संख्या को मॉडिफाई करते हैं, तो आपको वही नंबर मिलेगा, जिसे आप यहाँ पर लिख रहे हैं। यहाँ पर यह सुनिश्चित करता है कि इन सकारात्मक संख्याओं को उसी मान के रूप में लौटाया जाए।

ऋणात्मक: -180 से -1

यहां मॉड का उपयोग करने से 180 और 359 डिग्री के मान वापस आ जाएंगे।

विशेष मामले: 0 और 360

मॉड का उपयोग करने का मतलब है कि 0 लौटा दिया गया है, जिससे यह एक सुरक्षित 0-359 डिग्री समाधान है।


3
जबरदस्त उपाय :)
कादिर हुसैन

5
मुझे विश्वास नहीं है कि यह 360 जोड़ना आवश्यक है। -1% 360 अभी भी 359 है :)
pleasemorebacon

11
मुझे नहीं लगता कि यह सभी भाषाओं में सही है। जावास्क्रिप्ट में-1 % 360 = -1
Startec

इसके अलावा जावा में एक व्यवहार्य दृष्टिकोण नहीं
हल्क

1
@pleasemorebacon गलत है। कुछ भाषाओं में -1% 360 -1 है।
फराप

40

बस 360 ° जोड़ें अगर atan2 से उत्तर 0 ° से कम है।


6
यदि आप उन दिनों में से एक हो तो "बस 2 * PI जोड़ें" जैसा ही है ।
क्रिस ओ

33

या अगर आपको ब्रांचिंग पसंद नहीं है, तो बस दो मापदंडों को नकारें और उत्तर में 180 ° जोड़ें।

(रिटर्न वैल्यू में 180 ° जोड़कर इसे 0-360 रेंज में अच्छी तरह से रखा जाता है, लेकिन कोण को फ़्लिप करता है। दोनों इनपुट पैरामीटर्स को नकारने से यह वापस आ जाता है।)


2
धन्यवाद, यह वही है जो मैं देख रहा था।
जेरेमी हेरमैन

2
मैं अपने कोड को असामान्य कोणों (<0,> = 360) का उपयोग करने के लिए संशोधित करूंगा, लेकिन हमेशा लगता है कि कोई व्यक्ति उस नकली "अनुकूलित" अनुभव के लिए लक्ष्य बना रहा है; इसलिए मैं इसे जोड़ना चाहता था। (या यह इसलिए था क्योंकि यह कुछ अस्थायी डिबग कोड का उपयोग करने के लिए तेज तरीका था? हम्म)
ऐब

1
निश्चित रूप से खांचे के लिए सीधा नहीं, जैसा कि मैं 2+ वर्षों के बाद रख सकता हूं। तो: रिटर्न वैल्यू में 180 ° जोड़कर इसे 0-360 रेंज में अच्छी तरह से रखा जाता है, लेकिन कोण को फ़्लिप करता है। दोनों इनपुट मापदंडों की उपेक्षा करने से यह वापस आ जाता है।
ऐब

जब $ x = 0 $ और $ y> 0 $ iirc
त्रिनिदाद

22

@erikkallen करीब है लेकिन काफी सही नहीं है।

theta_rad = atan2(y,x);
theta_deg = (theta_rad/M_PI*180) + (theta_rad > 0 ? 0 : 360);

यह C ++ में काम करना चाहिए: (fmod कैसे लागू किया जाता है, इसके आधार पर, यह सशर्त अभिव्यक्ति की तुलना में तेज़ या धीमा हो सकता है)

theta_deg = fmod(atan2(y,x)/M_PI*180,360);

वैकल्पिक रूप से आप ऐसा कर सकते हैं:

theta_deg = atan2(-y,-x)/M_PI*180 + 180;

चूंकि (x, y) और (-x, -y) कोणों में 180 डिग्री से भिन्न होते हैं।


अगर मैं आपको फोरट्रान में सही ढंग से समझ गया तो यह atan2 (-y, -x) * 180 / PI + 180 है। क्या यह सही है?
गन्सब

क्षमा करें, मुझे पता नहीं है। लेकिन आपका गणित सही लगता है।
जेसन एस

11

मेरे पास 2 समाधान हैं जो सकारात्मक और नकारात्मक x और y के सभी संयोजनों के लिए काम करते हैं।

1) दुरुपयोग atan2 ()

डॉक्स के अनुसार atan2 उस क्रम में पैरामीटर y और x लेता है। हालाँकि यदि आप उन्हें उल्टा करते हैं तो आप निम्न कार्य कर सकते हैं:

double radians = std::atan2(x, y);
double degrees = radians * 180 / M_PI;
if (radians < 0)
{
    degrees += 360; 
}

2) atan2 का उपयोग करें () सही ढंग से और बाद में परिवर्तित करें

double degrees = std::atan2(y, x) * 180 / M_PI;
if (degrees > 90)
{
    degrees = 450 - degrees;
}
else
{
    degrees = 90 - degrees;
}

आप सर, एक जीवन रक्षक हैं। बस एकता में इस दृष्टिकोण का इस्तेमाल किया और एक आकर्षण की तरह काम करता है।
porfiriopartida

7

@ जैसन एस: आपका "फमोड" संस्करण मानकों के अनुरूप कार्यान्वयन पर काम नहीं करेगा। C मानक स्पष्ट और स्पष्ट है (7.12.10.1, "fmod फ़ंक्शन"):

यदि y nonzero है, तो परिणाम में x के समान चिन्ह है

इस प्रकार,

fmod(atan2(y,x)/M_PI*180,360)

वास्तव में सिर्फ एक क्रिया है:

atan2(y,x)/M_PI*180

हालाँकि, आपका तीसरा सुझाव हाजिर है।


5

यह वही है जो मैं आमतौर पर करता हूं:

float rads = atan2(y, x);
if (y < 0) rads = M_PI*2.f + rads;
float degrees = rads*180.f/M_PI;

2
angle = Math.atan2(x,y)*180/Math.PI;

मैंने 0 से 360 में कोण बनाने के लिए फॉर्मूला बनाया है

angle + Math.ceil( -angle / 360 ) * 360;

2

एक वैकल्पिक समाधान के रूप में परिभाषित मॉड () फ़ंक्शन का उपयोग करना है :

function mod(a, b) {return a - Math.floor (a / b) * b;}

फिर, निम्नलिखित फ़ंक्शन के साथ, ini (x, y) और अंत (x, y) बिंदुओं के बीच का कोण प्राप्त किया जाता है। कोण को 0, 360] डिग्री के सामान्यीकृत डिग्री में व्यक्त किया जाता है। और उत्तर संदर्भित 360 डिग्री।

    function angleInDegrees(ini, end) {
        var radian = Math.atan2((end.y - ini.y), (end.x - ini.x));//radian [-PI,PI]
        return mod(radian * 180 / Math.PI + 90, 360);
    }

1

आर संकुल जियोस्फीयर बियरिंग रंब की गणना करेगा, जो कि एक निरंतर असर लाइन है जिसे एक मूल बिंदु और ईस्टिंग / नॉर्थिंग दिया जाता है। Easting और northing एक मैट्रिक्स या वेक्टर में होना चाहिए। एक पवन गुलाब के लिए मूल बिंदु 0,0 है। निम्नलिखित कोड समस्या को आसानी से हल करने के लिए लगता है:

windE<-wind$uasE
windN<-wind$vasN
wind_matrix<-cbind(windE, windN)
wind$wind_dir<-bearingRhumb(c(0,0), wind_matrix)
wind$wind_dir<-round(wind$wind_dir, 0)

1
theta_rad = Math.Atan2(y,x);
if(theta_rad < 0)
  theta_rad = theta_rad + 2 * Math.PI;    //if neg., add 2 PI to it
theta_deg = (theta_rad/M_PI*180) ;        //convert from radian to degree

//or
theta_rad = Math.Atan2(y,x);
theta_rad = (theta_rad < 0) ? theta_rad + 2 * Math.PI : theta_rad;
theta_deg = (theta_rad/M_PI*180) ;

-1 डिग्रेड (-1 + 360) = 359 डिग्री
-179 डिग्री हो जाता है (-179 + 360) = 181 डिग्री


क्या है Math.PI? क्या यह वैसा ही है M_PI?
पेंग

1
double degree = fmodf((atan2(x, y) * (180.0 / M_PI)) + 360, 360);

यह 0 ° -360 ° प्रति-घड़ी से डिग्री लौटाएगा, 0 ° 3 बजे है।


1

0 से 360 डिग्री तक मानों की श्रेणी रखने का सूत्र।

f (x, y) = 180-90 * (1 + साइन (x)) * (1-साइन (y ^ 2)) - 45 * (2 + साइन (x)) * साइन (y)

     -(180/pi())*sign(x*y)*atan((abs(x)-abs(y))/(abs(x)+abs(y)))

क्या आप कृपया बता सकते हैं कि यह प्रश्न से कैसे संबंधित है?
क्लॉस गटर

1

यहाँ कुछ जावास्क्रिप्ट है। बस इनपुट x और y मान।

var angle = (Math.atan2(x,y) * (180/Math.PI) + 360) % 360;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.