5 votos

¿Cómo encontrar los puntos de intersección entre dos círculos?

Tenemos dos puntos (centros de dos circunferencias) y sus radios en metros, esos radios forman la circunferencia. Necesitamos encontrar los puntos de intersección. Por ejemplo tenemos lat1 = 55.685025, lng1 = 21.118995, r1 = 150 y lat2 = 55.682393, lng2 = 21.121387, r2 = 250. A continuación puedes encontrar nuestra fórmula actual:

// Find a and h.
$a = ($circle_1_r * $circle_1_r - $circle_2_r * $circle_2_r + $distance * $distance) / (2 * $distance);
$h = sqrt($circle_1_r * $circle_1_r - $a * $a);

// Find P2.
$circle_3_x = $circle_1_x + $a * ($circle_2_x - $circle_1_x) / $distance;
$circle_3_y = $circle_1_y + $a * ($circle_2_y - $circle_1_y) / $distance;

// Get the points P3.
$intersection_1 = $this->newLatLngPoint(
    ($circle_3_x + $h * ($circle_2_y - $circle_1_y) / $distance),
    ($circle_3_y - $h * ($circle_2_x - $circle_1_x) / $distance)
);

$intersection_2 = $this->newLatLngPoint(
    ($circle_3_x - $h * ($circle_2_y - $circle_1_y) / $distance),
    ($circle_3_y + $h * ($circle_2_x - $circle_1_x) / $distance)
);

Encontramos esos puntos de intersección (marcadores amarillos), sin embargo esas ubicaciones no coinciden en el mundo real.

enter image description here

¿Alguien puede ayudar a encontrar el problema y cómo solucionarlo?

P.D. ¿Afecta la altitud (altura sobre el nivel medio del mar) al resultado final? Yo no lo utilizo, pero tal vez debería hacerlo.

2voto

Nikola Puntos 21

En primer lugar, como el radio está expresado en metros, es necesario convertir/transformar los datos en un sistema de coordenadas proyectadas. Por ejemplo, si lat y lon son coordenadas geográficas en WGS84, podría utilizar el UTM WGS84 ...algo. Entonces, usaría esta solución: https://math.stackexchange.com/a/256123

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X