LineSegments的滑动碰撞方程

时间:2011-06-06 09:36:38

标签: geometry collision-detection

我需要一个等式来找到F点。 A,B和D点是已知的。 F点未知。 F点在AB线上。线AB垂直于线DF。 F的等式是什么?

3 个答案:

答案 0 :(得分:1)

我假设你想要一些计算速度快的东西,因为你提到'碰撞',这就是Stack Overflow。首先,图表:

perpendicular intersection of AB and DF, with F the intersection point

我们想要计算 AF 的成分,我们将标记 f = q i + p j 。 AFD形成一个三角形,因此我们可以从 AD 获得 f 的长度,我们将标记 d 。让我们用斜体标记长度与粗体向量:

f = d cos(θ)。

但是trig的计算成本很高。因此,让我们使用 b (AB)和 d 之间的向量点积的事实:

b · d = b d cos(θ)

角度相同,因为AF和AB在同一条线上。代入 d cos(θ):

b · d = b f

f =( b · d )/ b

现在我们有 f ,但我们想要它的组件p和q。将角度调到水平φ:

q = f cos(φ)

p = f sin(φ)

但我们再次避免触发。我们知道 f 沿着 b ,所以 f = k b ,实际上使用单位向量 b的方向

f = f b / b

将我们的表达式替换为 f

f = [( b · d )/ b ]( b / b'/ I>)

= [( b / b )· d ]( b / b

= [ b · d ] b /( b 2

定义两个组件共有的因子k:

k =(b x d x + b y d y )/ b < / I> 2

通过将 b 2 分开,我们可以避免使用平方根操作来获取单位向量 b

我们的组件,然后:

q = k b x

p = k b y

最后,添加回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

答案 1 :(得分:0)

首先,使用A和B的坐标找到具有点 - 坡度公式的AB线的斜率: Point Slope Formula

然后你可以找到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的坐标)

Line DF: y = -2*x + 9
Line AB: y = 0.5*x + 1.5

    -2*x + 9 = 0.5*x + 1.5
    9 = 2.5*x + 1.5
    7.5 = 2.5*x
    x = 3

    y = -2*x + 9
    y = -2*3 + 9
    y = -6 + 9
    y = 3

F = (3, 3)

答案 2 :(得分:0)

你没有准确指定F沿着DF线的确切位置,所以没有单一的答案。如果您只是想沿着与AB线垂直的直线找到某个点,那么从D点开始,那么

F.x = D.x + (B.y - A.y)
F.y = D.y + (B.x - A.x)

会奏效。