我需要一个等式来找到F点。 A,B和D点是已知的。 F点未知。 F点在AB线上。线AB垂直于线DF。 F的等式是什么?
答案 0 :(得分:1)
我假设你想要一些计算速度快的东西,因为你提到'碰撞',这就是Stack Overflow。首先,图表:
我们想要计算 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)
会奏效。