Самый эффективный способ найти расстояние между двумя кругами в java?

Таким образом, очевидно, вычисление квадратных корней не очень эффективно, что заставляет меня задаться вопросом, как лучше всего узнать расстояние (которое я назвал диапазоном ниже) между двумя кругами?

Find range between two circles

Так что обычно я бы работал:

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****

В частности, я пытаюсь создать «сканер» в игре, который определяет, когда враги/препятствия приближаются/уходят и т. д. Сканер будет передавать эту информацию через звуковой тон или графическая панель или что-то в этом роде. Поэтому, хотя мне и не нужны точные цифры, в идеале хотелось бы знать:

  1. цель ближе/дальше, чем раньше
  2. цель A ближе/дальше цели B, C, D...
  3. A (надеюсь, линейное?) соотношение, которое выражает, насколько далеко цель находится от корабля относительно 0 (столкновение) и максимальной дальности (некоторая константа)
  4. некоторые цели будут очень большими (планеты?), поэтому мне нужно принять во внимание радиус

Я надеюсь, что возможна какая-то хитрая оптимизация/аппроксимация (dx + dy + (длиннее dx, dy?), но со всеми этими требованиями, возможно, нет...

15
задан kiman 20 May 2012 в 16:02
поделиться