这是基本的图形几何图形和/或触发器,我对它的问题感到哑巴,但我不记得这是怎么回事。所以:找到一条直线与已知直线相交,给定一个点
- 我有一个由两点(x1,y1)和(x2,y2)定义的直线。
- 我有第三个点(xp,yp)位于别的地方。
我想计算点(x“ y”)的该介于沿着线在#1,使得当与从#2的点接合,创建一个新的垂直线到所述第一线。
谢谢。
这是基本的图形几何图形和/或触发器,我对它的问题感到哑巴,但我不记得这是怎么回事。所以:找到一条直线与已知直线相交,给定一个点
我想计算点(x“ y”)的该介于沿着线在#1,使得当与从#2的点接合,创建一个新的垂直线到所述第一线。
谢谢。
您可以考虑先一般点(x, y)
沿线从(x1, y1)
到(x2, y2)
发现这一点:
x = x1 + t*(x2 - x1)
y = y1 + t*(y2 - y1)
和计算的(平方)距离这一点从(xp, yp)
E = (x - xp)**2 + (y - yp)**2
代替x
和y
的定义给出
E = (x1 + t*(x2 - x1) - xp)**2 +
(y1 + t*(y2 - y1) - yp)**2
然后找到这个距离而变化t
最低,我们对于获得E
到t
dE/dt = 2*(x1 + t*(x2 - x1) - xp)*(x2 - x1) +
2*(y1 + t*(y2 - y1) - yp)*(y2 - y1)
,经过一些计算给出
dE/dt = 2*((x1 - xp)*(x2 - x1) + (y1 - yp)*(y2 - y1) +
t*((x2 - x1)**2 + (y1 - y2)**2))
寻找时,该导数为零,我们得到明确公式为t
t = ((xp - x1)*(x2 - x1) + (yp - y1)*(y2 - y1))/
((x2 - x1)**2 + (y2 - y1)**2)
所以最后一点可以用的定义中t
的值来计算。
使用矢量的符号,这正是通过加雷建议相同的公式...
t = <p - p1, p2 - p1>/<p2 - p1, p2 - p1>
其中符号<a, b>
表示点积操作ax*bx + ay*by
。
还要注意,同样的公式在n维空间中起作用。
您可以解决连接(x1, y1)
和(x2, y2)
的线的斜率。然后你知道垂直线的斜率是负的。
要找到y截距,请使用斜率来查看线条在y
从x=0
到x1
的行进距离。
b + (x1 - x0) * m = y1
b + (x1 - 0) * m = y1
b + (x1 * m) = y1
b = y1 - x1 * m
然后,您可以得到该行的公式的两个点,并从(xp, yp)
上述坡线之间。对于给定的x,它们具有相等的y,所以你可以解决这个问题,然后将其插入到y
的公式中。
m = slope_from_1_to_2 = (y2 - y1)/(x2 - x1)
n = slopePerpendicular = (-1)/m
b = intercept_for_1_to_2 = y1 - x1 * m
c = intercept_for_p = yp - xp * n
因此,对于线路中的方程的形式是 y = mx + b
点1和2:
y(x) = mx + b
点P:
y(x) = nx + c
一套自己的等于找到X'y
mx' + b = nx' + c
(m-n)x' = c - b
x' = (c - b)/(m - n)
并因此请使用公式计算Y”
y' = mx' + b
谢谢。在方程y(x)= mx + y2'中,为什么你用'y2'代替'b'? –
好点,'b'应该是y轴截距,线在y轴上。 'y2'不一定是这样,让我看看我的数学。 –
对于一个真正的二维问题,使用公式'y = m * x + q'意味着寻找麻烦。用这种方法你不能处理垂直线;改用参数方程'x = x(t),y = y(t)'代替。 – 6502
答案行是:
y=ax+b
where a=(x1-x2)/(y2-y1)
b=yp-(x1-x2)*xp/(y2-y1)
如何结果得到:
1) slope for the original line: (y2-y1)/(x2-x1)
2) slope for the answer: -1/((y2-y1)/(x2-x1)) = (x1-x2)/(y2-y1)
3) Plug this into (xp,yp) we can have the result line.
只需计算出此后的答案(这太长了...我饿了)。
这不适用于'y1 = y2'(除以零)。事实上,在处理真正的二维问题时,不应该使用基于“斜率”的公式。当你处理1.5维问题(即图形为y = y(x)')时,公式'y = mx + q'只能很好地工作。 – 6502
@ 6502嗯。感谢您为我节省未来的错误,因为我不可能再次忘记它。 –
在这种计算几何中有用的经验法则是,只要可以,就应该使用向量,只能作为最后手段切换到笛卡尔坐标。所以让我们用矢量代数来解决这个问题。假设您的线路从p到p + r,另一点是q。现在
,就行了,包括你正在努力寻找的任何点(称之为小号),可表现为小号 = p +λ[R一个标量参数λ。
现在从q到小号载体必须垂直于ř。因此
(q - (p +λř))·ř = 0
凡·是dot product operator。扩大产品:
(q - p)·ř =λ(ř·ř)
和除法:
λ =(q - p)·[R/[R·[R
当你来实现它,你需要检查是否[R·[R = 0,以避免被零除。
感谢向导中的启发性思维。 –
谢谢你。作为你的答案给予你的接受答案是唯一一个以我所知道的(笛卡尔坐标)并给了我一个实际的公式来插入它们。 (我喜欢矢量思想,但是提出的问题比给出几何记忆的答案要多。) –
这是@ 6502的一个英雄努力,但是这个答案显示了为什么我有关于向量的经验法则! –
@gareth:当我遇到一个几何问题时,我总是在向量中思考(这就是为什么我高举了你的答案),但是我知道大多数程序员对他们感觉不舒服。 – 6502