根据circle1的速度计算两个圆接触的点
Calculating the point where two circles touch based on circle1's velocity
我们有两个圆圈,Circle1 和 Circle2,Circle2 是静止的,Circle1 是运动的。
圆 1 = C1,圆 2 = C2。
C1 的速度和方向会使其在某一点接触 C2。
v 是描述 C1 速度的向量。
d为C1中心点到C2中心点的距离
我们也知道两个圆的半径。
第 1 帧:
C1 尚未与 C2 发生碰撞,但我们可以看到它会在下一帧发生碰撞。
第 2 帧:
C1 现在与 C2 相交。
第2帧(计算后):
C1 现在已经定位到它第一次接触 C2 的点。
所以问题是,我们如何计算(最好在 js 中)沿 v 的点 C1 应该停止?
当前代码:
// x^2 + B * x + C = 0
// x= v'
// B = 2 * (d.x * v.x + d.y*v.y)/Math.sqrt(v.x*v.x + v.y*v.y)
// C = (d.length()^2 - rs^2)
// get distance from ri to ri2 as a vector.
var d = new Vector(ri2.x - ri.x, ri2.y - ri.y);
// get sum of radiuses.
var rs = ri.r + ri2.r;
var A = 1;
var B = 2 * (d.x * v.x + d.y*v.y)/Math.sqrt(v.x*v.x + v.y*v.y);
var C = (d.length()^2 - rs^2);
var x1 = (-B + Math.sqrt(Math.pow(B, 2) - 4 * A * C)) / 2 * A;
var x1 = (-B - Math.sqrt(Math.pow(B, 2) - 4 * A * C)) / 2 * A;
// and then we get the lowest positive of x1 & x2.
触摸瞬间的中心距为
R12 = R1 + R2
所以使用余弦定理:
R122 = v'2 + d2 - 2*d*v '*余弦(dv)
对v'求解此二次方程得到更小的正解值(如果存在2种情况)。
你可以通过向量d和v
的标量积求出Cos(dv)
Cos(dv) = d * v / (|d||v|)
所以最终的二次方程是
v'2 - v' * 2 * (d * v) / |v| + (d2 - R122) = 0
对于标准形式
x^2 + B * x + C = 0
x= v'
B = -2 * (d.x * v.x + d.y*v.y)/Sqrt(v.x*v.x + v.y*v.y)
C = (d^2 - R12^2)
检查简单情况:以(0,0)为中心的圆半径2,向右移动(v = (10,0));以 (6,3) 为中心的静态圆半径 3。结果应该是 v'=2
B = -2*(6*10+3*0)/10= -12
C=45-(2+3)^2=20
Determinant = B*B - 4*C = 144-80 = 64
v'= (12 +- 8)/2
smaller value v'=2
对于 V 线上的每个 x,y
计算 C1 和 C2 中心之间的距离。
如果距离等于 r1+r2 那么圆圈永远接触。
P2(x2,y2) 是 C2 的中心
P1(x1,y1) 是 C1 在 V
上移动的计算中心
P1P2距离为:
SQuare Root of: (x2-x1)^2+(y2-y1)^2
一旦这等于 r1+r2 你应该停止
javascript 的距离函数是:
var d = Math.sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) );
或者如果您愿意:
var dist = Math.sqrt( Math.pow((x1-x2), 2) + Math.pow((y1-y2), 2) );
你需要解决几个步骤
设置equation of motion并施加圆圈接触的标准
| P1 + v * t - P2 | = R1 + R1
其中 P1 和 P 2分别为圆1和2的初始位置,t是时间。
对方程求平方并使用 quadratic equation
求解相交时间
利用交点时间求解圆1的交点位置
一旦知道圆 1 在相交时刻的位置,并且由于圆 2 是静态的,解决 circle-circle intersection 问题
我们有两个圆圈,Circle1 和 Circle2,Circle2 是静止的,Circle1 是运动的。
圆 1 = C1,圆 2 = C2。
C1 的速度和方向会使其在某一点接触 C2。
v 是描述 C1 速度的向量。 d为C1中心点到C2中心点的距离
我们也知道两个圆的半径。
第 1 帧:
C1 尚未与 C2 发生碰撞,但我们可以看到它会在下一帧发生碰撞。
第 2 帧:
C1 现在与 C2 相交。
第2帧(计算后):
C1 现在已经定位到它第一次接触 C2 的点。
所以问题是,我们如何计算(最好在 js 中)沿 v 的点 C1 应该停止?
当前代码:
// x^2 + B * x + C = 0
// x= v'
// B = 2 * (d.x * v.x + d.y*v.y)/Math.sqrt(v.x*v.x + v.y*v.y)
// C = (d.length()^2 - rs^2)
// get distance from ri to ri2 as a vector.
var d = new Vector(ri2.x - ri.x, ri2.y - ri.y);
// get sum of radiuses.
var rs = ri.r + ri2.r;
var A = 1;
var B = 2 * (d.x * v.x + d.y*v.y)/Math.sqrt(v.x*v.x + v.y*v.y);
var C = (d.length()^2 - rs^2);
var x1 = (-B + Math.sqrt(Math.pow(B, 2) - 4 * A * C)) / 2 * A;
var x1 = (-B - Math.sqrt(Math.pow(B, 2) - 4 * A * C)) / 2 * A;
// and then we get the lowest positive of x1 & x2.
触摸瞬间的中心距为
R12 = R1 + R2
所以使用余弦定理:
R122 = v'2 + d2 - 2*d*v '*余弦(dv)
对v'求解此二次方程得到更小的正解值(如果存在2种情况)。
你可以通过向量d和v
的标量积求出Cos(dv)Cos(dv) = d * v / (|d||v|)
所以最终的二次方程是
v'2 - v' * 2 * (d * v) / |v| + (d2 - R122) = 0
对于标准形式
x^2 + B * x + C = 0
x= v'
B = -2 * (d.x * v.x + d.y*v.y)/Sqrt(v.x*v.x + v.y*v.y)
C = (d^2 - R12^2)
检查简单情况:以(0,0)为中心的圆半径2,向右移动(v = (10,0));以 (6,3) 为中心的静态圆半径 3。结果应该是 v'=2
B = -2*(6*10+3*0)/10= -12
C=45-(2+3)^2=20
Determinant = B*B - 4*C = 144-80 = 64
v'= (12 +- 8)/2
smaller value v'=2
对于 V 线上的每个 x,y 计算 C1 和 C2 中心之间的距离。 如果距离等于 r1+r2 那么圆圈永远接触。
P2(x2,y2) 是 C2 的中心 P1(x1,y1) 是 C1 在 V
上移动的计算中心P1P2距离为:
SQuare Root of: (x2-x1)^2+(y2-y1)^2
一旦这等于 r1+r2 你应该停止
javascript 的距离函数是:
var d = Math.sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) );
或者如果您愿意:
var dist = Math.sqrt( Math.pow((x1-x2), 2) + Math.pow((y1-y2), 2) );
你需要解决几个步骤
设置equation of motion并施加圆圈接触的标准
| P1 + v * t - P2 | = R1 + R1
其中 P1 和 P 2分别为圆1和2的初始位置,t是时间。
对方程求平方并使用 quadratic equation
求解相交时间
利用交点时间求解圆1的交点位置
一旦知道圆 1 在相交时刻的位置,并且由于圆 2 是静态的,解决 circle-circle intersection 问题