Geometry 线段滑动碰撞方程
我需要一个方程来找到点F。Geometry 线段滑动碰撞方程,geometry,collision-detection,Geometry,Collision Detection,我需要一个方程来找到点F。 点A、B和D是已知的。F点未知。点F在AB线上。AB线与DF线垂直。F的方程式是什么?首先,使用A和B的坐标,通过点斜率公式求出AB线的斜率: 然后,您可以找到b来完成直线AB的方程式: y=mx+b其中m是您已经找到的斜率,b是您刚刚找到的y截距 DF线的斜率为AB线斜率的负倒数。将其插入方程式: y=mx+b,其中m为AB线斜率的负倒数,b随后出现 现在,使用点D的x和y值求解b,并将其插入方程中 现在应该有一个DF线方程和一个AB线方程。现在通过将两个方程设置
点A、B和D是已知的。F点未知。点F在AB线上。AB线与DF线垂直。F的方程式是什么?首先,使用A和B的坐标,通过点斜率公式求出AB线的斜率: 然后,您可以找到b来完成直线AB的方程式:
y=mx+b
其中m是您已经找到的斜率,b是您刚刚找到的y截距
DF线的斜率为AB线斜率的负倒数。将其插入方程式:
y=mx+b,其中m为AB线斜率的负倒数,b随后出现
现在,使用点D的x和y值求解b,并将其插入方程中
现在应该有一个DF线方程和一个AB线方程。现在通过将两个方程设置为彼此相等并首先求解x,然后插入x并找到y来求解这两个方程的截距
这里有一个例子
A=(1,2)。B=(4,8)。D=(2,5)
AB行:
(y - y1) = m*(x - x1)
(1 - 4) = m*(2 - 8)
-3 = m*(-6)
0.5 = m
y = (0.5)*x + b
2 = (0.5)*1 + b
2 = (0.5) + b
1.5 = b
y = 0.5*x + 1.5
第DF行:
m = -(1/mAB)
m = -(1/0.5)
m = -2
y = -2*x + b
5 = -2*2 + b
5 = -4 + b
9 = b
y = -2*x + 9
AB和DF的交点(即点F的坐标)
您还没有指定点F沿DF线的确切位置,因此没有单一的答案。如果你只是想从点D开始沿着一条垂直于AB线的线找到一点,那么
F.x = D.x + (B.y - A.y)
F.y = D.y + (B.x - A.x)
将起作用。我假设您希望计算速度更快,因为您提到了“碰撞”,这就是堆栈溢出。首先,一个图表: 我们要计算AF的分量,我们将其标记为f=qi+pj。AFD形成一个三角形,所以我们可以从AD得到f的长度,我们将其标记为d。让我们用斜体标记长度,用粗体标记向量: f=d cos(θ) 但是trig在计算上很昂贵。那么让我们使用b(AB)和d之间的向量点积是: b·d=b d cos(θ) 角度是相同的,因为AF和AB在同一条线上。用in代替dcos(θ): b·d=b f f=(b·d)/b 现在我们有f,但我们需要它的分量p和q。调用水平φ的角度: q=f cos(φ) p=f sin(φ) 但我们还是要避免三叉戟。我们知道f是沿着b的,所以f=kb,事实上用b方向的单位向量: f=f(b/b) 将我们的表达式替换为f: f=[(b·d)/b](b/b) =[(b/b)·d](b/b) =[b·d]b/(b2) 定义两个组件共用的系数k: k=(bx dx+由dy)/b2 通过保持b2分开,我们可以避免平方根运算来获得沿b的单位向量 我们的组成部分,然后: q=k bx p=k乘以 最后,添加回点A的偏移量 Fx=Ax+q Fy=Ay+p 因此,伪代码:
var vbx = Bx - Ax; //vector b x component
var vby = By - Ay; //vector b y component
var dot = vbx*(Dx-Ax) + vby*(Dy-Ay); // dot product of b and d
var k = dot/(vbx*vbx + vby*vby); // inverse of square of vector b length
var fx = Ax + k*vbx
var fy = Ay + k*vby
没有平方根调用,没有三角,8个加法/减法,6个乘法,1个除法。我能看到的唯一不稳定性是:当A和B在同一位置时被零除,如果AB大,AD大,则可能溢出计算
dot
。F在AB线上,DF线垂直于AB。A、B和D都是2D平面上的已知点。F是AB和DF相交的地方,假设它们是垂直的。它是唯一的-DF是三角形ADB的“高度”,因为AB和DF是垂直的。这个问题的措辞并不精辟,如果有一个图表会更好。哎呀,现在让我们看看我是否能想出如何实现这一点。我可以看到AB是一条垂直线的情况,这将导致零的除法。。。我想我只需要写一个例子,用a或B的Y值和D的X值来求F。
var vbx = Bx - Ax; //vector b x component
var vby = By - Ay; //vector b y component
var dot = vbx*(Dx-Ax) + vby*(Dy-Ay); // dot product of b and d
var k = dot/(vbx*vbx + vby*vby); // inverse of square of vector b length
var fx = Ax + k*vbx
var fy = Ay + k*vby