मेरे पास रेखा सेगमेंट (x1, y1, x2, y2) त्रिज्या आर के एक चक्र को छेड़छाड़ कर रहा है। मैं कैसे निर्धारित कर सकता हूं कि कौन सा चौराहे बिंदु निकटतम है (x1, y1)?रेखा सेगमेंट और सर्किल छेड़छाड़
5
A
उत्तर
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
संबंधित मुद्दे
- 1. रेखा और रेखा सेगमेंट चौराहे
- 2. सर्किल लाइन छेड़छाड़ अंक
- 3. एक-आयामी रेखा-सेगमेंट/रेंज छेड़छाड़ टेस्ट: समाधान का नाम?
- 4. सीजीएएल: सेगमेंट और बहुभुज के बीच छेड़छाड़?
- 5. बिंदु से रेखा खंड और लाइन सेगमेंट तक लाइन सेगमेंट
- 6. सर्किल
- 7. एक स्पलीन और रेखा
- 8. सीएसएस सर्किल सीमा
- 9. मंडल-सर्किल टक्कर भविष्यवाणी
- 10. कैसे जांचें कि रेखा खंड आयत को छेड़छाड़ करता है या नहीं?
- 11. एक सर्किल
- 12. एक रेखा और एक QPainterPath
- 13. ट्रैवर्सिंग लाइन सेगमेंट
- 14. UIBezierPath छेड़छाड़
- 15. अप्रलेखित VBA विशेष कीवर्ड सर्किल और स्केल
- 16. रेखा आरेखण + स्वयं के साथ कि रेखा के चौराहे और यह भी कि खींची गई रेखा
- 17. को न काटने रेखा खंड जबकि संचयी लंबाई
- 18. Django में संघ और छेड़छाड़
- 19. पावरशेल में संघ और छेड़छाड़?
- 20. आईओएस ड्रा सर्किल
- 21. सर्किल पेजर इंडिकेटर
- 22. ग्रेट सर्किल आर
- 23. मेट्रो सर्किल बटन पृष्ठभूमि
- 24. एचटीएमएल 5 कैनवास और रेखा चौड़ाई
- 25. कैसे जांचें कि 2 लाइन सेगमेंट छेड़छाड़ करते हैं या नहीं?
- 26. एक बहुभुज और रेखा
- 27. % और * निर्भरता रेखा
- 28. नियुक्तियां और रेखा वस्तुएं
- 29. आयत और रेखा
- 30. कीवर्ड छेड़छाड़
क्या आप समझा सकते हैं कि "निकटतम चौराहे बिंदु" से आपका क्या मतलब है सर्कल पर एक बिंदु है? सेगमेंट पर एक बिंदु? कुछ भी नहीं है? – andand
यह एक बुनियादी गणित प्रश्न है और सी # के समाधान का अनुवाद वास्तव में सीधे आगे है और सवाल को और अधिक प्रासंगिक नहीं बनाता है। –
@andand छेड़छाड़ बिंदु दोनों लाइनों से संबंधित है। – Dmitry