我寻找圆线碰撞解决方案的功能可能有什么问题?

What could be wrong with my function for finding a solution for circle-line collision?

所以我正在研究一个简单的函数,在该函数中,您提供一个点和一个角度以及圆的半径,直线相交,然后您返回其中一个交点。由于一些非常未知的原因,我没有得到预期的 x 位置? 我对 x 位置的计算基于:http://mathworld.wolfram.com/Circle-LineIntersection.html

如果你们中的任何人都可以做同样的事情,我会非常满意,但是根据您的函数,在这种情况下吐出 x 位置的预期结果是一个解决方案为 -27.386,另一个解决方案为 27.386 Desmos 图形计算器。

点为(-70, -40.415),角度PI/6,圆半径为sqrt(1000)。使用此信息,您应该能够获得两个 x 解决方案。

我的代码:

function sgn(x) {
    return x < 0 ? -1 : 1;
}

function findPointOfCollision(p, t, r) { // p -> point, t -> theta, r -> radius
    p2 = [p[0] + 200*Math.cos(t), p[1] + 200*Math.sin(t)]; // Another point in the line given by point and angle

    let x1 = p[0];
    let y1 = p[1];

    let x2 = p2[0];
    let y2 = p2[1];

    let dx = x2 - x1;
    let dy = y2 - y1;

    let dr = Math.sqrt(dx*dx + dy*dy);
    let D = x1*y2 - x2*y1;

    let x = (D*dy + sgn(dy)*dx*Math.sqrt(r*r*dr*dr - D*D))/dr*dr;

    return [x]; // Only need the x position for the collision point atm
}



function start () {
    console.log(findPointOfCollision([-70, -40.415], Math.PI/6, 31.6227766017));
}

你的算法是正确的,但是当你除以dr²时,你在最后一个公式中有错误:A/dr*dr意味着(A/dr)*dr,这实际上抵消了除法。您必须在此处将分母括起来:A/(dr*dr).

当我将 x 的公式更改为:

    let x = (D*dy + sgn(dy)*dx*Math.sqrt(r*r*dr*dr - D*D)) / (dr*dr);

我得到的期望值约为 27.386。