Так что, по-видимому, вычисление квадратных корней не очень эффективно, что оставляет мне интересно, что лучший способ узнать расстояние (которое я назвал диапазоном ниже) между двумя кругами?
Как обычно, я бы выработал:
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
Попытка избежать квадратного корня отлично работает, когда вы просто ищете ситуацию, когда "диапазон" равен 0 для коллизий:
if ( (r1 + r2 + 0 )^2 > (dy^2 + dx^2) )
Но если я пытаюсь разобраться в дальности дальности, я получаю какое-то громоздкое уравнение вроде:
range(range + 2r1 + 2r2) = dy^2 + dx^2 - (r1^2 + r2^2 + 2r1r2)
который никуда не денется. По крайней мере, я не знаю, как его решить для диапазона отсюда...
Очевидным ответом тогда является тригнометрия и сначала найдите theta:
Tan(theta) = dy/dx
theta = dy/dx * Tan^-1
Затем найдем гипотезу Грех (тета) = dy/h h = dy/Sin (theta)
Наконец, определите диапазон диапазон + r1 + r2 = dy/Sin (theta) range = dy/Sin (theta) - r1 - r2
Итак, что я сделал и получил метод, который выглядит так:
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;
}
Итак, мой вопрос заключается в том, что использование tan и sin более эффективно, чем поиск квадратного корня?
Возможно, я смогу реорганизовать часть моего кода, чтобы получить значение theta из другого метода (где я должен его обработать), что стоит делать?
Или существует другой способ?
Пожалуйста, извините меня, если я прошу очевидного или совершу какие-либо элементарные ошибки, это было давно, так как я использовал математику средней школы, чтобы что-то сделать...
Любые советы или рекомендации приветствуются!
**** **** EDIT
В частности, я пытаюсь создать устройство "сканер" в игре, которая обнаруживает, когда враги/препятствия приближаются/уходят и т.д. Сканер будет передавать эту информацию через звуковой тон или графическую панель или что-то в этом роде. Поэтому, хотя мне не нужны точные цифры, в идеале я хотел бы знать:
- цель ближе/дальше, чем раньше
- цель A ближе/дальше цели B, C, D...
- A (линейное, надеюсь,?) отношение, которое выражает, насколько далеко цель находится от корабля относительно 0 (столкновение) и максимального диапазона (некоторые константы)
- некоторые цели будут очень большими (планеты?), поэтому мне нужно учитывать радиус
Я надеюсь, что возможна какая-то умная оптимизация/аппроксимация (dx + dy + (дольше dx, dy?), но со всеми этими требованиями, возможно, не...