Разрешение столкновений - точка вне круга - PullRequest
3 голосов
/ 11 ноября 2011

В моделировании на основе временного шага - столкновение между точечной частицей 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 ]

1 голос
/ 11 ноября 2011

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

(х-а) ^ 2 + (у-б) ^ 2 = г ^ 2

и

x = p (x) - v (x) * t

y = p (y) - v (y) * t

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

0 голосов
/ 11 ноября 2011

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

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