Ho un segmento (x1, y1, x2, y2) che interseca un cerchio di raggio r. Come posso determinare quale punto di intersezione è più vicino a (x1, y1)?Segmento segmento e intersezione cerchio
5
A
risposta
7
Per fare che prima trovare i punti di intersezione con il cerchio e poi prendere la più vicina al punto di partenza della linea
in modo da controllare questo codice
// cx, cy è il centro punto del cerchio
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;
}
}
Codice Intersezione modulo qui LINK
0.123.+1
L'ordine delle distanze non cambia di sqrt, quindi è meglio lasciarle al quadrato per una migliore velocità. – Preza8
Problemi correlati
- 1. Intersezione Linea e Segmento Linea
- 2. transcodifica e segmento con ffmpeg
- 3. Segmento circolare utilizzando CSS/CSS3
- 4. Segmenti segmento di movimento
- 5. Colore segmento HTML5?
- 6. nessun segmento * file trovato
- 7. Implementazione java albero segmento
- 8. Segmento condizionale tramite Storyboard
- 9. Segmento personalizzato in Swift
- 10. Bash, lista degli argomenti segmento
- 11. Segmento URI corrente in CodeIgniter
- 12. come riassemblare il segmento tcp?
- 13. Rimuovere ultimo segmento di Request.Url
- 14. Puntatori all'interno del segmento di memoria condivisa
- 15. iTunesConnect AppLoader valida problema di allineamento segmento
- 16. org.apache.lucene.index.IndexNotFoundException: nessun segmento * file trovato in org.apache.lucene.store.RAMDirectory
- 17. Distanza segmento inter utilizzando numba jit, Python
- 18. PHP Errori di segmento strani su mysqli_stmt_bind_result
- 19. Rendi scrivibile il segmento di testo, ELF
- 20. Come impostare UISegmentedControl Tinta per singolo segmento
- 21. Segmento URL che utilizza Laravel 4
- 22. Valgrind segnalare un overflow di segmento
- 23. Ember.js: transitionTo route, quindi al segmento dinamico
- 24. impostazione del segmento predefinito in UISegmentedControl
- 25. Android Tesseract OCR 7 cifre del segmento
- 26. Storno di segmento personalizzato con storyboard
- 27. Codice Igniter - Ottieni ultimo segmento URI
- 28. Modifica il colore del controllo segmento selezionato
- 29. mysql cerca segmento di nome tabella
- 30. cambia segmento segmentato da rotondo a piatto
Puoi spiegare cosa intendi per "il punto di intersezione più vicino" È un punto sul cerchio? Un punto sul segmento? Qualcosa non su entrambi? – andand
Questa è una domanda di matematica di base e tradurre la soluzione in C# è davvero semplice e non rende la domanda più pertinente. –
@e il punto di intersezione appartiene a entrambe le linee. – Dmitry