ubiquitour.com

Cómo calcular la intersección de círculos en C++

Calcular los puntos de intersección de dos círculos es un problema algo complicado en geometría, pero la solución es sencilla y fácil de implementar en C++. Se necesita a cierta clase de punto disponible que puede manejar la aritmética básica, tales como suma y resta de puntos 2-dimensional. Si usted no tiene uno, puede utilizar un std::vector < flotador > de la biblioteca de plantillas estándar de la misma manera.

Instrucciones

Verificación de casos especiales

1 Calcular la distancia entre centros de los círculos:

Punto delta = p2 - p1;Float distanceSquared = delta. X delta. X + delta. Y delta. Y;Float distancia = sqrt(distanceSquared);

2 Compruebe si los círculos están completamente separados entre sí. En este caso, la distancia entre los centros de los círculos será mayor que la suma de sus radios, por lo que no hay manera puede intersectar. Si este es el caso, manejar el error en cualquier manera que funciona mejor para su programa.

Si (distSquared > (r1 + r2) * (r1 + r2))volver noIntersections;

3 Comprobar si un círculo es totalmente dentro de la otra. En este caso, también no habrá soluciones.

Si (distSquared < (r1 - r2) * (r1 - r2))volver noInersections;

4 Compruebe si los círculos son idénticos. Esto significa que hay un número infinito de soluciones - uno para cada punto en el círculo.

Si (distSquared == 0 & & r1 == r2)volver infiniteIntersections;

Encontrar las intersecciones

5 Calcular la distancia desde el centro del primer círculo al acorde conectando los puntos de intersección.

Float chordDistanceSquared = (r1 r1 - r2 r2 - distSquared) (r1 r1 - r2 r2 - distSquared) / (4 distSquared);Float chordDistance = sqrt(chordDistanceSquared);

6 Calcular la mitad de la longitud del acorde:

Float halfChordLength = sqrt (r1 * r1 - chordDistanceSquared);

7 Encontrar el punto en el centro del acorde:

Punto chordMidpoint = p1 + chordDistance * delta / sqrt(distSquared);

8 Calcular la ubicación de los puntos de intersección con la información que has calculado hasta ahora:

Intersection1.x = chordMidpoint.x + chordDistance (p2.y - p1.y) / distancia;Intersection1.y = chordMidpoint.y + chordDistance (p2.x - p1.x) / distancia;Intersection2.x = chordMidpoint.x - chordDistance (p2.y - p1.y) / distancia;Intersection2.y = chordMidpoint.y - chordDistance (p2.x - p1.x) / distancia;