2012-01-10 13 views
6

necesito el tamaño de la pieza negro de esta imagen:
ImageCómo obtener el tamaño de la parte de intersección en un círculo en Java

que he hecho algunas investigaciones sobre cómo llegar a ella en matemáticas normales y me señaló a este sitio web: Website

la respuesta final en conseguir que era pict http://mathworld.wolfram.com/images/equations/Circle-CircleIntersection/Inline41.gif

donde r es el radio del primer círculo, R el radio del segundo círculo, y D la distancia entre los dos centros.

El código He intentado utilizar para obtener el tamaño de ello fue la siguiente:

float r = getRadius1(); 
float R = e.getRadius1(); 
float deltaX = Math.abs((getX() + getRadius()) - (e.getX() + e.getRadius())); 
float deltaY = Math.abs((getY() + getRadius()) - (e.getY() + e.getRadius())); 
float d = (float) Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); 

float part, part2, part3; 
//Chopping it in parts, because it's easier. 

part = (float) (Math.pow(r,2) * Math.acos(
     Math.toRadians((Math.pow(d, 2) + Math.pow(r, 2) - Math.pow(R, 2))/(2*d*r)))); 

part2 = (float) (Math.pow(R,2) * Math.acos(
     Math.toRadians((Math.pow(d, 2) + Math.pow(R, 2) - Math.pow(r, 2))/(2*d*R)))); 

part3 = (float) (0.5 * Math.sqrt((-d + r + R) * (d+r-R) * (d-r+R) * (d+r+R))); 

float res = part + part2 - part3; 

Main.log(res + "  " + part + " " + part2 + " " + part3+ "  " 
     + r + " " + R + " " + d); 
//logs the data and System.out's it 

Hice algunas pruebas, y la salida fue la siguiente:

1345.9663  621.6233 971.1231 246.78008  20.0 25.0 43.528286 

Para que indica que el tamaño de la parte superpuesta fue mayor que el círculo en sí (que es r^2 * PI).

¿Qué hice mal?

+1

Usaría 'double' en lugar de' float' ya que tendrá menos error de representación, pero no lo suficiente como para explicar el suyo. ;) –

+1

¿Puede mostrarnos la fórmula para deltaX y Y porque no se ven bien? ¿Cuál es la diferencia entre getRadius() y getRadius1()? –

+0

¿Por qué tiene getRadius1() y e.getRadius1()? ¿Olvidas obtener el radio de r? – Max

Respuesta

5

Solo una suposición (como se indica en mi comentario): intente eliminar la conversión Math.toRadians(...).

Dado que no existen grados implicados en la fórmula, sino más bien radios, supongo que el parámetro a cos -1 (...) ya es un valor en radianes.

Si quito la conversión y ejecutar el código, me sale el siguiente tamaño de solapamiento de áreas: 11.163887023925781 que parece plausible, ya que la longitud del segmento de solapado en la línea entre los dos centros es 20 + 25 - 43.5 = 1.5 (aproximado)

Editar:

Si fijo la distancia a 5 (el círculo más pequeño está completamente contenida en el más grande, pero toca su borde) consigo el tamaño del área de superposición 1256.63 que es exactamente el área del círculo más pequeño (20 * Π) . El cálculo no parece funcionar si la distancia es menor que la diferencia de los radios (es decir, en su caso es menor que 5), pero eso podría ser solo un problema de representación numérica (los tipos de datos normales podrían no ser capaces de representar algunos de los resultados intermedios).

+1

'Math.acos (Math.toRadians (...))' es definitivamente incorrecto, ya que el argumento de 'Math.acos()' no es un ángulo. El argumento para 'Math.acos()' debe ser un valor entre -1 y 1, y devolverá un valor en radianes. –

+0

Esto lo hizo, gracias. – Lolmewn

+0

Hola, ¿cómo conseguir los puntos de intersección? Sugiera la solución aquí http://stackoverflow.com/questions/38177728/how-to-get-the-intersecting-points-from-shape-in-elasticsearch –

Cuestiones relacionadas