2010-06-30 15 views
7

मैं जानना चाहता हूं कि क्षैतिज अक्ष एक्स से रेखा ए-बी का कोण कैसे प्राप्त करें। SO में अन्य प्रश्न केवल दो पंक्तियों के बीच करते हैं। मुझे पता है कि मैं हमेशा दूसरी पंक्ति ए-सी खींच सकता हूं और गणना कर सकता हूं लेकिन मुझे आश्चर्य है कि कोई तेज विधि है या नहीं।क्षितिज से एक रेखा का कोण प्राप्त करें

संपादित करें: मुझे पूरा यकीन है कि मैं समयपूर्व अनुकूलन नहीं कर रहा हूं।

+2

समयपूर्व अनुकूलन से सावधान रहें। क्या आपने कोड प्रोफाइल किया है? –

+1

मैं नीचे वोट नहीं समझ सकता। क्या यह एक मूर्ख सवाल है? या अगर आपत्तिजनक है? हम्म .. – VOX

+1

@VOX - अपने प्रोफाइलिंग परिणाम पोस्ट करें। अपने आप को साबित करें कि आपको एक तेज समाधान की आवश्यकता है। –

उत्तर

9

आप इसके लिए atan का उपयोग कर सकते हैं।

angle = atan((By-Ay)/(Bx-Ax)) 
0

x- अक्ष वास्तव में समीकरण के साथ एक पंक्ति है

y = 0

ताकि आप समाधान आपके पास पहले से इस्तेमाल कर सकते हैं।

+0

यदि कोई है तो मैं तेज़ (कम सीपीयू) विधि की तलाश में था। – VOX

1

तो

  1. कोण छोटा है,
  2. आप छोटे अशुद्धियों के साथ रह सकते हैं, और
  3. आप डिग्री रेडियन में कोण का उपयोग करें और नहीं कर सकते,

तो एक तेज़ समाधान होता है: इन परिस्थितियों में, आप मान सकते हैं कि तन (ए) = ए = एटान (ए), और इसलिए केवल एटान() कॉल को छोड़ दें।

+0

एक अच्छे बिंदु के लिए धन्यवाद। – VOX

+0

"तन (ए) = ए = एटान (ए)" एह ... क्या? –

+0

@ बार्ट वैन हेकुलोम: हां, जैसा कि मैंने लिखा है, यह सटीक नहीं है, लेकिन छोटे कोणों के लिए एक अच्छा अनुमान है। ई जी। तन (0.1) = 0.1003, तन (0.2) = 0.203 तो इस श्रेणी में कोणों के लिए, यदि आपको पूर्ण परिशुद्धता की आवश्यकता नहीं है, तो आप कुछ गणना प्रयासों को बचा सकते हैं। – Frank

1

यदि आप अपनी लाइन [r_x,r_y] रूप में हैं, तो r_x एक्स और r_y में परिवर्तन वाई में परिवर्तन है, तो आप आर्ककोसाइन का भी उपयोग कर सकते हैं।

angle = arccos(r_x/(r_x*r_x + r_y*r_y)) 

यह थोड़ा अधिक अपारदर्शी है, लेकिन यह मूल रूप से डॉट उत्पाद कानून है:

angle = arccos (r . v) 

कहाँ r और v दोनों इकाई वैक्टर हैं (लंबाई 1 से वैक्टर)। हमारे मामले में, v वेक्टर [1,0] है, और आर

[r_x,r_y]/(r_x^2+r_y^2) 

है ताकि इसे एक इकाई वेक्टर बनाने के लिए है।

6
private double Angulo(int x1, int y1, int x2, int y2) 
    { 
     double degrees; 

     // Avoid divide by zero run values. 
     if (x2 - x1 == 0) 
     { 
      if (y2 > y1) 
       degrees = 90; 
      else 
       degrees = 270; 
     } 
     else 
     { 
      // Calculate angle from offset. 
      double riseoverrun = (double)(y2 - y1)/(double)(x2 - x1); 
      double radians = Math.Atan(riseoverrun); 
      degrees = radians * ((double)180/Math.PI); 

      // Handle quadrant specific transformations.  
      if ((x2 - x1) < 0 || (y2 - y1) < 0) 
       degrees += 180; 
      if ((x2 - x1) > 0 && (y2 - y1) < 0) 
       degrees -= 180; 
      if (degrees < 0) 
       degrees += 360; 
     } 
     return degrees; 
    } 
0

यदि आपको सभी चार चौकों की आवश्यकता है, तो एटान 2 अतान से अधिक उपयुक्त है।

public static int GetAngleBetweenPoints(PointF pt1, PointF pt2) 
{ 
    float dx = pt2.X - pt1.X; 
    float dy = pt2.Y - pt1.Y; 

    int deg = Convert.ToInt32(Math.Atan2(dy, dx) * (180/Math.PI)); 
    if (deg < 0) { deg += 360; } 

    return deg; 
} 
संबंधित मुद्दे