c++ - 碰撞解决 - 圆外点

标签 c++ collision-detection geometry

在基于时间步长的模拟中,点粒子 p(x,y) 与速度 v(x,y) 之间的碰撞从圆 (x-a)^2 + (y-b)^2 = r^ 和那个圆圈发生在两个时间步长之间,这样当检测到碰撞时点粒子已经离开圆圈。

因此我想将粒子向后移动 outsideDepth(x,y) 的量,使其正好位于圆上。

现在的问题是:如何确定点 p 与速度 vector 与圆的交点之间的距离 l?

在代码中:

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;
    }
}

编辑尝试 Ian 的解决方案,将 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;

// ???

最佳答案

同时求解(简单代码)

(x-a)^2 + (y-b)^2 = r^2

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

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

对于一些 t。根据 discriminant 的不同,可能有零个、一个或两个解决方案。 (在 b^2 - 4ac 上使用条件)。如果两个解决方案 (b^2 > 4ac) 选择最小化 size(p(x,y) - t(x, y)) 的 t(使用 pythag)。返回。

关于c++ - 碰撞解决 - 圆外点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8096831/

相关文章:

带有扫弧的android可绘制圆圈

grid - 给定简单的二维笛卡尔坐标,在等边三角形网格中进行索引

c++ - 在几何中使用 boost rtree 查找结果点

c++ - mt19937 生成的重复值

c++ - 你能制作一个带参数的函数 vector 吗?

C++17:泛型(基于多重继承?)检查参数包中的模板

c++ - unordered_map::insert vs operator []= 函数给出错误

geometry - 圆-矩形碰撞检测(交叉点)

javascript - 矩形碰撞

c++ - 基本碰撞问题