2013-02-12 5 views
2

Я разрабатываю Java-игру (но на самом деле язык разработчика не имеет значения), включая округленные объекты, такие как шары или шайбы, и теперь работает над столкновениями. Я использую таймер, поэтому на каждом кадре я проверяю, произошло ли столкновение.Обнаружение столкновений: закругленный объект

Вот график, представляющий собой верхний правый объект.

enter image description here

В центре объекта представлена ​​в точке [0,0], его радиус 10px и блоки пикселей.

Теперь, если мой объект (например, obj_1) квадратный/ромбовидный (синяя линия), чтобы найти, если другой (obj_2) сталкивается его я просто получить их координаты и проверяя Math.abs(obj_1.x - obj_2.x) + Math.abs(obj_1.y - obj_2.y) <= radius я знаю, если есть столкновение.

Но проблема более сложная с формой круга (красная линия), поскольку она занимает больше места, и занятое пространство не ограничено прямой линией. Конечно, мне придется округлять некоторые значения (например, на предыдущем графике, если я хочу проверить столкновение на x = 2, мне придется округлить значение y, которое выглядит как 9.5-10). Но я просто понятия не имею, как получить эту формулу. Любая помощь будет очень оценена.

ответ

2

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

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

Предположим, у вас есть два круга c1 и c2. Предположим, что соответствующие радиусы c1.r и c2.r, а центры (c1.x, c1.y) и (c2.x, c2.y), то следующая функция будет сказать, являются ли c1 и c2 в столкновении

boolean areColliding(Circle c1, Circle c2){ 

    center_distance = sqrt((x1-x2)^2 +(y1-y2)^2); //this is the distance between the centers of the two circles. 

    if((c1.r+c2.r) < center_distance) 
      return false; 
    else 
      return true; 

} 

Эта функция псевдо-код будет возвращать правда если круги сталкиваясь, иначе ложь.

В основном, что делает функция, проверяется, больше ли расстояние между центрами окружностей, чем сумма их соответствующего радиуса.

+1

Отлично, очень хорошо, он идеально подходит. Большое спасибо! – Rob

2

В Java у вас есть java.awt.Polygon.

Класс Polygon содержит несколько методов и методов пересечения.

Определение круга как Polygon - это боль, в зависимости от того, насколько точна ваша цель. Но как только вы определили все свои объекты как Polygon s, вы можете использовать определенные методы для обнаружения коллизий.

1

вы можете установить закругленную форму в ограничительной рамке. Это даст менее точные коллизии, но имеет большие преимущества в производительности от других методов.

1

Дополнение к @ решения ANKIT в:

boolean areColliding(Circle c1, Circle c2){ 

    center_distance = (x1-x2)^2 +(y1-y2)^2; //this is the distance between the centers of the two circles. 

    if((c1.r+c2.r)^2 < center_distance) 
     return false; 
    else 
     return true; 
} 

Это просто сравнивает квадраты расстояний. Результат тот же, но без квадратного корня и огромной производительности.

Смежные вопросы