Mam odcinek Line (x1, y1, x2, y2) przecinający okrąg o promieniu r. Jak ustalić, który punkt przecięcia jest najbliższy (x1, y1)?Segment linii i przecięcie okręgu
5
A
Odpowiedz
7
Aby to zrobić najpierw znaleźć punkty przecięcia z okręgu, a następnie podjąć najbliższy jeden do punktu początkowego linii
więc sprawdzić ten kod
// cx, cy jest centrum punkt okręgu
formularz tutaj 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;
}
}
kod Przecięcie LINK
+1
Porządek odległości nie zmienia się przez sqrt, dlatego lepiej zostawić je w kwadracie dla lepszej prędkości. – Preza8
Powiązane problemy
- 1. Jak sprawdzić przecięcie linii i prostokąta?
- 2. Przecięcie dwóch linii na współrzędnych
- 3. Union i Przecięcie w Django
- 4. Przecięcie linii nD z wypukłym kadłubem w Pythonie
- 5. Jak uzyskać segment przecięcia prostokątnego prostokąta w matlab
- 6. Przecięcie UIBezierPath
- 7. Trwałe dane i przygotuj się na segment
- 8. CGPathRef przecięcie
- 9. Przecięcie obszaru w Pythonie
- 10. Rozwiń segment dla UINavigationController
- 11. Bash, lista Segment argumentem
- 12. Usuń ostatni segment Request.Url
- 13. three.js - przecięcie promienia i położenie kuli
- 14. Centrum tekst i pojemnik wewnątrz okręgu
- 15. Przecięcie list w R
- 16. Lista Przecięcie wraca null
- 17. Przecięcie dwóch posortowanych tablic
- 18. Przecięcie w SQL Server
- 19. Przenoszenie cienia wokół okręgu
- 20. Rysowanie niedoskonałego okręgu
- 21. Uzyskiwanie granicy okręgu
- 22. QT rysowanie okręgu
- 23. Utwórz segment tekstowy zapisywalny, ELF
- 24. Przycisk niestandardowego okręgu
- 25. Pobierz przecięcie listy zestawów
- 26. Przenoszenie oznacza na okręgu
- 27. transkodowanie oraz segment z ffmpeg
- 28. Crop w okręgu (php)
- 29. Obraz SVG wewnątrz okręgu
- 30. Owijanie listów wokół okręgu
Czy możesz wyjaśnić, co masz na myśli przez "najbliższy punkt przecięcia" Czy to jest punkt na kole? Punkt w segmencie? Coś nie ma na sobie? – andand
To jest podstawowe pytanie matematyczne, a przetłumaczenie rozwiązania na język C# jest bardzo proste i nie sprawia, że pytanie staje się bardziej aktualne. –
@i punkt przecięcia należy do obu linii. – Dmitry