Как я могу ограничить набор координат круговой областью? - PullRequest
0 голосов
/ 11 декабря 2011

Я делаю небольшую игру, и у меня есть персонаж, который может двигаться во всех направлениях (x и y), и его скорость сохраняется просто в двух целых числах, vx и vy. Теперь я хочу ограничить его заданной областью, но эта область должна быть не квадратной, а круглой. Я могу легко определить, когда персонаж находится за пределами круга, с помощью простого применения формулы расстояния, но это не проблема. Я не уверен, что делать тогда. Как рассчитать ближайшую точку внутри круга к координате за пределами границ? И что еще более важно, как мне выяснить, как изменить переменные скорости, чтобы соответствовать этой границе?

Пока что я определил, что могу найти ближайшую точку на круге с помощью простой тригонометрии:

double angle = Math.atan2(posX, posY);
posX = (int)(Math.cos(angle)/radius);
posY = (int)(Math.sin(angle)/radius);

Но, похоже, это можно улучшить. Я полностью потерян о другом элементе. Помогите пожалуйста?

Ответы [ 2 ]

2 голосов
/ 11 декабря 2011

Точные значения на самом деле работают очень хорошо, если предположить, что центр круга находится в (0,0).

Когда персонаж выходит за границы, мы возвращаем персонажа к границе, масштабируястарые значения на r/D, где D=sqrt(x^2+y^2):

x*=r/D
y*=r/D

Примечание: это фактически эквивалентно вашему способу использования трига, потому что

r*cos(tan(y/x))=r*x/sqrt(x^2+y^2)

Вы можетезатем установите скорость на ноль или смоделируйте столкновение с границей, установив vx*=k и vy*=k, где k - постоянная демпфирования между -1 и 0.

Какдополнительное прикосновение позволяет замедлить движение персонажа возле границы на

vx*=k*[(r-D)/r]

Этот дополнительный термин необходим, поскольку масштабный коэффициент зависит от положения: ближе к границе мы хотим, чтобы скорость былауменьшено намного больше.Здесь k находится между 0 и 1, так как мы только замедляемся, а не разворачиваемся.

0 голосов
/ 11 декабря 2011

Исходя из вашего вопроса, я понял, что вы хотите выяснить, представляет ли данная позиция объекта граничную позицию, то есть, например, определить, не может ли он двигаться влево от этой позиции.

Я думаю, что простым способом было бы иметь функцию проверки перед любым движением.То есть посмотрите, допустимо ли перемещение по отношению к заданной позиции - это можно сделать, посмотрев, приведет ли результат этого действия к тому, что объект выйдет за границу.Если проверка возвращает true - вы можете выполнить это действие.Если проверка возвращает ложь - не разрешайте этот ход.

...