Geometry 线段滑动碰撞方程

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线方程。现在通过将两个方程设置

我需要一个方程来找到点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线方程。现在通过将两个方程设置为彼此相等并首先求解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