Разрешение столкновений - точка за пределами круга
В моделировании на основе временного шага - столкновение между точечной частицей p(x,y) со скоростью v(x,y), которое началось изнутри круга (xa)^2 + (yb)^2 = r^, с этим кругом, произошедшим между двумя временными шагами, так что точечная частица уже покинула круг, когда столкновение будет обнаружено.
Поэтому я хочу переместить частицу назад на величину вне Depth(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;
}
}
РЕДАКТИРОВАТЬ Попытка решения Ян, заменить 2 и 3 в 1 и изменить порядок для t, а затем определить p и q следующим образом:
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;
// ???
2 ответа
Одновременно решить (простой код)
(xa)^2 + (yb)^2 = r^2
а также
х = р (х) - v(х)* т
y = p(y) - v(y)*t
для некоторых т. Может быть ноль, одно или два решения в зависимости от дискриминанта (используйте условные выражения на b^2 - 4ac). Если два решения (b^2 > 4ac) выбирают t, который минимизирует размер (p (x,y) - t (x,y)) (используйте пифаг). Вернуть.
Вы хотите, чтобы новая точка находилась под тем же углом, что и исходная точка (x, y), но была перемещена внутрь. Чтобы переместить точку "in" к границе круга, отрегулируйте ее координату x, вычитая
(х-а) * р / ди ваша координата у вычитая
(у - б) * р / дот х и у соответственно.