Así que aparentemente el cálculo de las raíces cuadradas no es muy eficiente, lo que me deja preguntándome cuál es la mejor manera de averiguar la distancia (que he llamado rango más abajo) entre dos círculos?¿La manera más eficiente de encontrar la distancia entre dos círculos en Java?
Así que normalmente me gustaría trabajar:
a^2 + b^2 = c^2
dy^2 + dx^2 = h^2
dy^2 + dx^2 = (r1 + r2 + range)^2
(dy^2 + dx^2)^0.5 = r1 + r2 + range
range = (dy^2 + dx^2)^0.5 - r1 - r2
Tratando de evitar la raíz cuadrada funciona bien cuando sólo se observa para la situación en la "gama" es 0 para las colisiones:
if ((r1 + r2 + 0)^2 > (dy^2 + dx^2))
Pero si estoy tratando de calcular esa distancia de rango, termino con una ecuación difícil de manejar como:
range(range + 2r1 + 2r2) = dy^2 + dx^2 - (r1^2 + r2^2 + 2r1r2)
que no va a ningún lado. Por lo menos yo no sé cómo resolverlo para el rango de aquí ...
La respuesta obvia es, pues, trignometry y primer hallazgo theta:
Tan(theta) = dy/dx
theta = dy/dx * Tan^-1
A continuación, el encontrar el hypotemuse Sin (theta) = dy/h h = dy/Sin (theta)
último funciona de la gama gama + r1 + r2 = dy/Sin (theta) rango = dy/sen (theta) - r1 - r2
So th a es lo que he hecho y tengo un método que tiene este aspecto:
private int findRangeToTarget(ShipEntity ship, CircularEntity target){
//get the relevant locations
double shipX = ship.getX();
double shipY = ship.getY();
double targetX = target.getX();
double targetY = target.getY();
int shipRadius = ship.getRadius();
int targetRadius = target.getRadius();
//get the difference in locations:
double dX = shipX - targetX;
double dY = shipY - targetY;
// find angle
double theta = Math.atan( (dY/dX));
// find length of line ship centre - target centre
double hypotemuse = dY/Math.sin(theta);
// finally range between ship/target is:
int range = (int) (hypotemuse - shipRadius - targetRadius);
return range;
}
Así que mi pregunta es, es el uso de bronceado y el pecado más eficiente que la búsqueda de una raíz cuadrada?
Podría ser capaz de refactorizar parte de mi código para obtener el valor theta de otro método (donde tengo que resolverlo) ¿valdría la pena hacerlo?
¿O hay otra manera en total?
Por favor, discúlpeme si estoy preguntando lo obvio, o cometer errores elementales, que ha sido un largo tiempo desde que he utilizado las matemáticas de secundaria para hacer cualquier cosa ...
Cualquier consejo o consejos de bienvenida!
**** **** EDITAR
Específicamente Estoy tratando de crear un dispositivo de "scanner" en un juego que detecta cuando los enemigos/obstáculos se están acercando a/ir lejos, etc. El escáner transmitir esta información a través de un tono de audio o una barra gráfica o algo así. Por lo tanto, aunque no necesito números exactos, idealmente me gustaría saber:
- objetivo está más cerca/más lejos que antes
- objetivo A está más cerca/más allá de objetivo B, C, D ...
- Una relación (¿con suerte lineal?) Que expresa qué tan lejos está un objetivo del barco en relación con 0 (colisión) y rango máximo (alguna constante)
- algunos objetivos serán muy grandes (¿planetas?) Así que tengo que tener en cuenta el radio
Tengo la esperanza de que hay algo de optimización inteligente/aproximación posible (dx + dy + (más larga de dx, dy?), Pero con todos estos requisitos, tal vez no ...
¡Me divierte tu hipotenusa! –
no use 'toDegrees':' Math.sin' usa radianes (al igual que todas las funciones trigonométricas en Matemáticas) –
¿Ha perfilado su código con 'sqrt'? – siamii