Ich habe ein Liniensegment (x1, y1, x2, y2), die einen Kreis mit dem Radius r schneiden. Wie kann ich feststellen, welcher Schnittpunkt am nächsten ist (x1, y1)?Liniensegment und Kreisschnittpunkt
5
A
Antwort
7
Um das zu tun zuerst die Schnittpunkte mit dem Kreis finden und dann die nächste zu der Linie Startpunkt nehmen
diesem Code
// cx So prüfen, ist cy Zentrum des Kreises
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;
}
}
Überschneidung-Code Form hier LINK
+1
Die Reihenfolge der Abstände ändert sich nicht um sqrt, daher ist es besser, sie für eine bessere Geschwindigkeit im Quadrat zu belassen. – Preza8
Verwandte Themen
- 1. Berechnen der durchschnittlichen Entfernung von Punkt zu Liniensegment und Liniensegment zu Liniensegment
- 2. Oberflächenkonstruktion mit zwei Liniensegment
- 3. Äquidistante Punkte in einem Liniensegment
- 4. Interview Puzzle auf einem Liniensegment auf Reisen
- 5. Bestimmen Sie, was Oktanten ein Liniensegment durchläuft
- 6. Wie man WPF Liniensegment von Pfad Abbildung
- 7. Wie überprüft man, ob das Liniensegment ein Rechteck schneidet?
- 8. Wie zeichne ein * einfaches * Liniensegment mit d3.js?
- 9. Entfernung von wgs Punkt von einem wgs definierten Liniensegment
- 10. Senkrecht auf ein Liniensegment von einem gegebenen Punkt
- 11. Den Schnittpunkt eines Dreiecks und einer Ebene bestimmen
- 12. Punkt auf Linie - Segment Entfernung von einem Punkt
- 13. Einen Punkt auf einer Linie finden
- 14. Wie Linie zeichnen nicht Segment OpenCV 2.4.2
- 15. Punkte, Linien und Polygone auf Kugeln mit C/C++
- 16. Suche und Analyse großer XML-Index von Tasker
- 17. Wie verschiebt man einen Kreis über eine Linie in der Verarbeitung?
- 18. SQL Server UND UND ODER UND UND
- 19. Zeichnen Sie eine parallele Linie
- 20. IsPointInsideSegment (pt, line) in Python
- 21. Wie füge ich eine Zeile über einem Balkendiagramm hinzu?
- 22. Farblinien durch Mittelwertpaare in ggplot2
- 23. Unterschied zwischen - und - oder 'und' oder "und"
- 24. SubSonic "Oder" und "UND"
- 25. "und" und Tail-Rekursion
- 26. Android: Wie man die Wege von zwei Formen kombiniert und Überlappung entfernt?
- 27. Zeichnen eines Pfeilendes auf einem Quadratischen Bezier-Segment mit Xaml
- 28. SOX und Ein- und Ausblenden
- 29. QOpenGLWidget und glReadPixels und Tiefenpuffer
- 30. Flasche und Skalierung und Gleichzeitigkeit
Können Sie erklären, was Sie mit dem "nächsten Schnittpunkt" meinen. Ist das ein Punkt auf dem Kreis? Ein Punkt auf dem Segment? Irgendwas nicht? – andand
Dies ist eine grundlegende mathematische Frage und die Übersetzung der Lösung in C# ist wirklich geradlinig und macht die Frage nicht relevanter. –
@andand Schnittpunkt gehört zu den beiden Linien. – Dmitry