Buscar punto de intersección de tres círculos programáticamente

Como dice el título, tengo 3 Circle .

Cada uno tiene un radio diferente . Conozco el radio de cada círculo.

También conoce los puntos centrales de cada círculo.

Ahora necesito saber cómo puedo calcular el punto de intersección de tres círculos programmatically, es allí es cualquier fórmula o algo?

Puede verse como debajo de la imagen Introduzca aquí la descripción de la imagen

Puedes obtener ayuda de este código C. Llevarlo a JAVA no debería ser un desafío. La explicación está aquí . Buscar / desplazarse a: intersección de dos círculos

Utilizando este método, encuentre la intersección de cualquier dos círculos .. digamos (x,y) . Ahora el tercer círculo se intersecará en el punto x,y sólo si la distancia entre su center y el punto x,y es igual a r .

case 1) Si distance(center,point) == r , entonces x,y es el punto de intersección.

case 2) Si distance(center,point) != r , entonces no existe tal punto.

Código (portado de [aquí todos los créditos al autor original]:

 private boolean calculateThreeCircleIntersection(double x0, double y0, double r0, double x1, double y1, double r1, double x2, double y2, double r2) { double a, dx, dy, d, h, rx, ry; double point2_x, point2_y; /* dx and dy are the vertical and horizontal distances between * the circle centers. */ dx = x1 - x0; dy = y1 - y0; /* Determine the straight-line distance between the centers. */ d = Math.sqrt((dy*dy) + (dx*dx)); /* Check for solvability. */ if (d > (r0 + r1)) { /* no solution. circles do not intersect. */ return false; } if (d < Math.abs(r0 - r1)) { /* no solution. one circle is contained in the other */ return false; } /* 'point 2' is the point where the line through the circle * intersection points crosses the line between the circle * centers. */ /* Determine the distance from point 0 to point 2. */ a = ((r0*r0) - (r1*r1) + (d*d)) / (2.0 * d) ; /* Determine the coordinates of point 2. */ point2_x = x0 + (dx * a/d); point2_y = y0 + (dy * a/d); /* Determine the distance from point 2 to either of the * intersection points. */ h = Math.sqrt((r0*r0) - (a*a)); /* Now determine the offsets of the intersection points from * point 2. */ rx = -dy * (h/d); ry = dx * (h/d); /* Determine the absolute intersection points. */ double intersectionPoint1_x = point2_x + rx; double intersectionPoint2_x = point2_x - rx; double intersectionPoint1_y = point2_y + ry; double intersectionPoint2_y = point2_y - ry; Log.d("INTERSECTION Circle1 AND Circle2:", "(" + intersectionPoint1_x + "," + intersectionPoint1_y + ")" + " AND (" + intersectionPoint2_x + "," + intersectionPoint2_y + ")"); /* Lets determine if circle 3 intersects at either of the above intersection points. */ dx = intersectionPoint1_x - x2; dy = intersectionPoint1_y - y2; double d1 = Math.sqrt((dy*dy) + (dx*dx)); dx = intersectionPoint2_x - x2; dy = intersectionPoint2_y - y2; double d2 = Math.sqrt((dy*dy) + (dx*dx)); if(Math.abs(d1 - r2) < EPSILON) { Log.d("INTERSECTION Circle1 AND Circle2 AND Circle3:", "(" + intersectionPoint1_x + "," + intersectionPoint1_y + ")"); } else if(Math.abs(d2 - r2) < EPSILON) { Log.d("INTERSECTION Circle1 AND Circle2 AND Circle3:", "(" + intersectionPoint2_x + "," + intersectionPoint2_y + ")"); //here was an error } else { Log.d("INTERSECTION Circle1 AND Circle2 AND Circle3:", "NONE"); } return true; } 

Llame a este método de la siguiente manera:

 calculateThreeCircleIntersection(-2.0, 0.0, 2.0, // circle 1 (center_x, center_y, radius) 1.0, 0.0, 1.0, // circle 2 (center_x, center_y, radius) 0.0, 4.0, 4.0);// circle 3 (center_x, center_y, radius) 

Además, defina EPSILON en un valor pequeño que sea aceptable para los requisitos de su aplicación

 private static final double EPSILON = 0.000001; 

Nota: Tal vez alguien debería probar y verificar si los resultados son correctos. No puedo encontrar ninguna manera fácil de hacerlo .. las obras para los casos básicos que he intentado

Puede utilizar la condición siguiente:

 (x - x0) ^ 2 + (y - y0) ^ 2 <= R ^ 2 

Donde x e y – coordenadas de su punto, x0 y y0 – coordenadas del centro del círculo, R – radio del círculo, ^ 2 – cuadrado. Si se cumple la condición, el punto está dentro (o en la circunferencia en el caso de igualdad de las partes izquierda y derecha). Si no está satisfecho, el punto está fuera del círculo.

 / / Point, which hit the circle is necessary to determine PointF p = ...; / / Center of the circle PointF center = new PointF (10, 10); / / The radius of the circle float r = 5F; / / "Normalize" the situation relative to the center point of the circle float dx = px - center.x; float dy = py - center.y; / / Compare the distance from the point to the center of a circle to its radius boolean result = ((r * r) <= (dx * dx + dy * dy))) ? true : false; 
  • Las clases siguientes no pudieron ser instanciadas: - android.support.v7.widget.Toolbar
  • ¿Por qué getActionView () devuelve null
  • Cómo encontrar el seguimiento de pila en Eclipse con Android
  • Botones redondeados
  • Reemplazar espacio a guión
  • Ejecutar archivo java en qt
  • Glide: registra cada solicitud
  • Apache Cordova CordovaActividad no se puede resolver
  • Incorporar detalles de la versión en android APK
  • Transmitir audio en vivo de Android al servidor
  • Listview getFirstVisiblePosition
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.