2011-06-06 40 views

回答

0

首先,找到线AB的使用A和B的坐标点斜式的斜率: 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) 
+0

aight,现在让我看看我能不能找出如何实现这一点。我可以看到一个情况,其中AB是一条垂直线,这将导致一个零的分解......我想我只需要写一个情况,其中只需要A或B的Y值和X的值D找到F. – GreenFox 2011-06-06 10:43:31

0

您还没有确切位置指定F点沿着DF线,因此没有单个答案。如果您只是试图沿着与AB线垂直的线从D点找到某点,那么

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

将起作用。

+0

F在AB线上,而DF线垂直于AB。 A,B和D是2D平面上的所有已知点。 F是AB和DF相交的地方,因为它们是垂直的。 – GreenFox 2011-06-06 10:20:53

+0

它是唯一的 - DF是三角形ADB的“高度”,因为AB和DF是垂直的。这个问题不是出色的措辞,用图表会更好。 – 2011-06-06 11:11:59

1

我假设你想要的东西计算速度快,因为你提到'碰撞',这是堆栈溢出。首先,图:

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

我们要计算的组件AF,我们将标签˚F = Q + P Ĵ。 AFD形成三角形,所以我们可以从AD得到f的长度,我们将标签。我们用斜体标出长方体与斜体:

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,但是w e想要它的组件p和q。调用与水平面倾斜φ:

Q = ˚F COS(φ)

P = ˚F罪(φ)

但同样我们避免TRIG。我们知道,˚F是沿b,所以˚F = K b,实际上使用的的方向的单位矢量b

˚F = ˚Fb/ b

代我们对表达式f

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

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

= [b·d] b /( b

定义因子k,其是常见的两种组分:

K =(B X d X + b y d y)/ b

通过保持 b 分开的,我们能够避免平方根操作,以沿着b

我们的组件获得的单位矢量,则:

Q = KB X

p = KB ý

最后,加回在点A

Fx的=斧+ 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