2013-04-19 3 views
0

У меня есть шар и прямоугольник. Шарик может двигаться, прямоугольник фиксирован (масса = бесконечный).Решите пересечение между шаром и прямоугольником

Мяч имеет положение, скорость, радиус, массу.

Прямоугольник имеет положение, ширину и высоту.

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

http://i.stack.imgur.com/Xq5Vk.png

Я использую Java.

EDIT: решаемый с помощью этого алгоритма:

  1. Вычислить ближайшую точку (я называю это P) между Прямоугольные и мячом (легко сделать с помощью функции Clamp)
  2. Вычислить вектор (Я называю это n), которые связывают центральную точку шара (я называю это C) и P (компоненты вектора (Px - Cx, Py - Cy))
  3. Рассчитать «длину» пересечения (я звоню он смещен) (ball.radius - n.len gth)
  4. Нормализовать n и умножить на смещение.
  5. Вычесть n на вектор положения шарика.

в Java-код:

private void resolveIntersectionWith(Ball ball){ 
     double closestX = clamp(ball.position.x, left(), right()); 
     double closestY = clamp(ball.position.y, top(), bottom()); 

     Vector n = new Vector(closestX - ball.position.x, closestY - ball.position.y); 
     double offset = ball.radius - n.length; 
     n.normalize().multiply(offset); 
     ball.position.subtract(n); 
    } 
+1

Это похоже? [Расчет столкновения для движущегося круга без перекрытия границ] (http://stackoverflow.com/q/2751377/427192) –

+0

Да похоже, но решение не будет работать для меня .. Я буду делать другие тесты – VanDir

+0

Я думаю, что решение не работает, потому что мяч в вашей ссылке находится внутри прямоугольника. В моей проблеме мяч снаружи! – VanDir

ответ

0

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

Простой способ сделать это, чтобы вычислить точку Q в rektangle ближе к центру шара P. Затем переместите мяч подальше от этой точки, как

P=P+(P-Q)*(r/abs(P-Q)-1) 

где R- радиус. Alternative вы можете шаг с меньшими временными шагами, чтобы избежать пересечений

EDIT: Missclick

+0

Я также попробую ваше решение, спасибо – VanDir

+0

Также ваше решение не работает. – VanDir

+0

Хорошо, может быть, я неправильно понял ваш вопрос. – Xale

0

Проблемы, вероятно, вызван тем, как вы обнаружили столкновение. Я предполагаю, что вы проверяете, включен ли шар или в границах прямоугольника или нет. В этой ситуации вы уже обновили позицию, чтобы быть внутри прямоугольника. Однако, если вы проверите, произойдет ли столкновение после добавления скорости в ее положение (x += v * dt), вы сможете определить точное время столкновения, что означало бы, что мяч переместит оставшееся время этой итерации в новое направление.

+0

Спасибо за ответ, но я решил свою проблему по-другому. – VanDir

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