2014-04-11 12 views
5

मेरे पास रेखा सेगमेंट (x1, y1, x2, y2) त्रिज्या आर के एक चक्र को छेड़छाड़ कर रहा है। मैं कैसे निर्धारित कर सकता हूं कि कौन सा चौराहे बिंदु निकटतम है (x1, y1)?रेखा सेगमेंट और सर्किल छेड़छाड़

circle-line

+1

क्या आप समझा सकते हैं कि "निकटतम चौराहे बिंदु" से आपका क्या मतलब है सर्कल पर एक बिंदु है? सेगमेंट पर एक बिंदु? कुछ भी नहीं है? – andand

+4

यह एक बुनियादी गणित प्रश्न है और सी # के समाधान का अनुवाद वास्तव में सीधे आगे है और सवाल को और अधिक प्रासंगिक नहीं बनाता है। –

+0

@andand छेड़छाड़ बिंदु दोनों लाइनों से संबंधित है। – Dmitry

उत्तर

7

कि पहले चक्र के साथ चौराहे अंक खोजने के लिए और उसके बाद लाइन प्रारंभ बिंदु के सबसे करीब एक

तो यह कोड

// cx चेक ले करने के लिए, cy केंद्र है वृत्त की बात

 public PointF ClosestIntersection(float cx, float cy, float radius, 
      PointF lineStart, PointF lineEnd) 
     { 
      PointF intersection1; 
      PointF intersection2; 
     int intersections = FindLineCircleIntersections(cx, cy, radius, lineStart, lineEnd, out intersection1, out intersection2); 

     if (intersections == 1) 
      return intersection1;//one intersection 

     if (intersections == 2) 
     { 
      double dist1 = Distance(intersection1, lineStart); 
      double dist2 = Distance(intersection2, lineStart); 

      if (dist1 < dist2) 
       return intersection1; 
      else 
       return intersection2; 
     } 

     return PointF.Empty;// no intersections at all 
    } 

    private double Distance(PointF p1, PointF p2) 
    { 
     return Math.Sqrt(Math.Pow(p2.X - p1.X, 2) + Math.Pow(p2.Y - p1.Y, 2)); 
    } 

    // Find the points of intersection. 
    private int FindLineCircleIntersections(float cx, float cy, float radius, 
     PointF point1, PointF point2, out PointF intersection1, out PointF intersection2) 
    { 
     float dx, dy, A, B, C, det, t; 

     dx = point2.X - point1.X; 
     dy = point2.Y - point1.Y; 

     A = dx * dx + dy * dy; 
     B = 2 * (dx * (point1.X - cx) + dy * (point1.Y - cy)); 
     C = (point1.X - cx) * (point1.X - cx) + (point1.Y - cy) * (point1.Y - cy) - radius * radius; 

     det = B * B - 4 * A * C; 
     if ((A <= 0.0000001) || (det < 0)) 
     { 
      // No real solutions. 
      intersection1 = new PointF(float.NaN, float.NaN); 
      intersection2 = new PointF(float.NaN, float.NaN); 
      return 0; 
     } 
     else if (det == 0) 
     { 
      // One solution. 
      t = -B/(2 * A); 
      intersection1 = new PointF(point1.X + t * dx, point1.Y + t * dy); 
      intersection2 = new PointF(float.NaN, float.NaN); 
      return 1; 
     } 
     else 
     { 
      // Two solutions. 
      t = (float)((-B + Math.Sqrt(det))/(2 * A)); 
      intersection1 = new PointF(point1.X + t * dx, point1.Y + t * dy); 
      t = (float)((-B - Math.Sqrt(det))/(2 * A)); 
      intersection2 = new PointF(point1.X + t * dx, point1.Y + t * dy); 
      return 2; 
     } 
    } 

चौराहे कोड यहाँ प्रपत्र LINK

0,123,
+1

दूरी का क्रम sqrt द्वारा नहीं बदला जाता है, इसलिए बेहतर गति के लिए उन्हें स्क्वायर छोड़ना बेहतर होता है। – Preza8

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