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.
- Leer / escribir en etiqueta NFC con protección por contraseña
- CursorTreeAdapter con implementación de búsqueda
- Fusión de manifiesto de Gradle de Android: reemplaza el atributo 'uses-permission' procedente de una biblioteca
- RealmResult Muchas relaciones con el adaptador
- ¿Cuál es el tiempo de espera predeterminado de java.net.Socket en android?
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
- Bluetooth: falla en el descubrimiento del servicio
- Conectar a la red wifi de forma programática (primer acceso ssid)?
- Chromium WebView no existe
- Desactivar grupo de menús de Android
- Cómo obtener nombres de paquetes en ejecución para Android L
- IntelliJ IDEA con Junit 4.7 "!!! JUnit versión 3.8 o posterior esperado: "
- Ventana de superposición del sistema Android
- Usando el descompilador jd-gui de java y obteniendo // ERROR INTERNO //
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;
- No se pudo obtener el evento Touch para TYPE_SYSTEM_OVERLAY
- Android alinear el centro del texto superior