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