我寻找圆线碰撞解决方案的功能可能有什么问题?
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。
所以我正在研究一个简单的函数,在该函数中,您提供一个点和一个角度以及圆的半径,直线相交,然后您返回其中一个交点。由于一些非常未知的原因,我没有得到预期的 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。