Таким образом, очевидно, вычисление квадратных корней не очень эффективно, что заставляет меня задаться вопросом, как лучше всего узнать расстояние (которое я назвал диапазоном ниже) между двумя кругами?
Так что обычно я бы работал:
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)
, которое никуда не денется. По крайней мере, я не знаю, как решить это для диапазона отсюда...
Очевидный ответ тогда — тригнометрия и сначала найти тета:
Tan(theta) = dy/dx
theta = dy/dx * Tan^-1
Затем найти гипотемузу Sin(тета) = dy/h h = dy/Sin(theta)
Наконец определите диапазон диапазон + r1 + r2 = dy/Sin(тета) 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 более эффективно, чем поиск квадратный корень?
Возможно, я смогу реорганизовать часть своего кода, чтобы получить тета-значение из другого метода (где я должен это обработать), стоит ли это делать?
Или есть совсем другой путь?
Пожалуйста, извините меня, если я спрашиваю очевидное или делаю какие-то элементарные ошибки, я уже давно не использовал школьную математику, чтобы что-то сделать...
Приветствуются любые советы и рекомендации!
****EDIT****
В частности, я пытаюсь создать «сканер» в игре, который определяет, когда враги/препятствия приближаются/уходят и т. д. Сканер будет передавать эту информацию через звуковой тон или графическая панель или что-то в этом роде. Поэтому, хотя мне и не нужны точные цифры, в идеале хотелось бы знать:
Я надеюсь, что возможна какая-то хитрая оптимизация/аппроксимация (dx + dy + (длиннее dx, dy?), но со всеми этими требованиями, возможно, нет...