2011-11-11 2 views
3

В моделировании, основанном на методе timestep, столкновение между точечной частицей p (x, y) со скоростью v (x, y), которая начиналась изнутри круга (xa)^2 + (yb)^2 = r ^, с этой окружностью, произошло между двумя временными интервалами, так что точечная частица уже покинула круг, когда обнаружено столкновение.Устранение столкновений - точка за пределами круга

Поэтому я хочу переместить частицу обратно на величину outsideDepth (x, y) так, чтобы она находилась точно на круге.

Теперь возникает вопрос: как определить расстояние l между точкой p и пересечением вектора скорости с кругом?

В коде:

Vector2 circleCollision(double a, double b, double r, double x, double y){ 

    double s = sqrt(pow((x-a),2) + pow((y-b),2)); 

    if (s>r) { 
     Vector2 outsideDepth = {0,0}; 

     // determine depth by which point lies outside circle as vector (x,y) 

     return outsideDepth; 
    } 
} 

EDIT Покушение на решение Яна, заменить 2 и 3 в 1 и rearange для т, а затем определить р и д следующим образом:

p = 1/(pow(v.x,2) + pow(v.y,2)) * (-2*x*v.x + 2*v.x*a - 2*y*v.y + 2*v.y*b); 
q = 1/(pow(v.x,2) + pow(v.y,2)) * (-2*x*a -2*y*b + x*x + y*y + a*a + b*b - r*r); 

root = sqrt(pow((p/2),2) - q); 
t1 = -p/2 + root; 
t2 = -p/2 - root; 

// ??? 

ответ

1

Одновременно решить (простой код)

(Xa)^2 + (Yb)^2 = R^2

и

х = р (х) - у (х) * т

у = р (у) - v (у) * т

для некоторого т. Может быть нуль, одно или два решения в зависимости от discriminant (используйте условные обозначения на b^2 - 4ac). Если два решения (b^2> 4ac) выбирают t, который минимизирует размер (p (x, y) - t (x, y)) (используйте pythag). Вернуть.

+0

Я обновил свой вопрос с попыткой вашего решения. Не могли бы вы объяснить, как найти минимум более подробно, пожалуйста. – Ben

+0

Вышеуказанные уравнения дадут вам вектор смещения v1 (x, y), скажем, для некоторого t1 (представляет собой точку на окружности с центром в (a, b)). Найдите вектор смещения между точкой частицы и точкой на круге, используя векторное сложение (вычесть). т. е. diffv = p - v1. Затем вычислим величину этого вектора ((x^2 + y^2)^1/2). Сделайте то же самое для другого решения t2. Найдите минимальную величину вектора смещения между ними, и, предположив, что частица ближе к точке, она вышла из круга (истинная для константной скорости). Это будет определять точку выхода. –

+0

Thx, проблема решена. – Ben

0

Вы хотите, чтобы новый точка должна быть под тем же углом, что и исходная точка (x, y), но перемещена. Чтобы переместить вашу точку «в» на границу круга, отрегулируйте ее координату x, вычитая

(x -a) * r/d
, а координату y вычитая
(y - b) * r/d
от x и y соответственно.

+0

Ваш д? – Ben

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