Geometry 沿法线延伸到另一点的直线查找点
给定线段AB,如何找到AB的法线通过点p的点Pn?我还需要知道是否没有穿过该点的法线(例如,点Q) 如果Geometry 沿法线延伸到另一点的直线查找点,geometry,line,point,normals,Geometry,Line,Point,Normals,给定线段AB,如何找到AB的法线通过点p的点Pn?我还需要知道是否没有穿过该点的法线(例如,点Q) 如果R是通过p的法线上的任何点(不同于p),则Pn是AB和PR相交的点 生成点R的一种方法是将段AB旋转90度,然后将其平移,使A与p一致。翻译后的B是您的R: Rx = Px + (By - Ay) Ry = Py - (Bx - Ax) 一旦你得到了你的点R,它就变成了一个简单的点,它将给出你的Pn(对于垂直线的特定情况,公式可以简化) 然后您可以轻松检查Pn是否介于A和B之间 p.S.请注
R
是通过p
的法线上的任何点(不同于p
),则Pn
是AB
和PR
相交的点
生成点R
的一种方法是将段AB
旋转90度,然后将其平移,使A
与p
一致。翻译后的B
是您的R
:
Rx = Px + (By - Ay)
Ry = Py - (Bx - Ax)
一旦你得到了你的点R
,它就变成了一个简单的点,它将给出你的Pn
(对于垂直线的特定情况,公式可以简化)
然后您可以轻松检查Pn
是否介于A
和B
之间
p.S.请注意,@MBo的答案中提供的解决方案更直接、更有效(如果你结合并简化/优化我的答案所需的公式,你最终会得到同样的结果)。如果你已经有了一个计算两条直线相交的基本函数,那么我上面所描述的可能很有意义
find_intersection(Ax, Ay, Bx, By, Cx, Cy, Dx, Dy)
// Intersect AB and CD
在这种情况下,查找Pn
就变成了一个简单的单行程序
Pn = find_intersection(Ax, Ay, Bx, By, Px, Py, Px + (By - Ay), Py - (Bx - Ax))
但是,如果您没有这样的基本功能可供使用和/或不关心如何提高代码的效率,那么您可能需要选择一个更直接的专用计算序列,如@MBo的答案中的序列。如果R
是通过p
(不同于p
)的法线上的任何点,然后,Pn
是AB
和PR
相交的点
生成点R
的一种方法是将段AB
旋转90度,然后将其平移,使A
与p
一致。翻译后的B
是您的R
:
Rx = Px + (By - Ay)
Ry = Py - (Bx - Ax)
一旦你得到了你的点R
,它就变成了一个简单的点,它将给出你的Pn
(对于垂直线的特定情况,公式可以简化)
然后您可以轻松检查Pn
是否介于A
和B
之间
p.S.请注意,@MBo的答案中提供的解决方案更直接、更有效(如果你结合并简化/优化我的答案所需的公式,你最终会得到同样的结果)。如果你已经有了一个计算两条直线相交的基本函数,那么我上面所描述的可能很有意义
find_intersection(Ax, Ay, Bx, By, Cx, Cy, Dx, Dy)
// Intersect AB and CD
在这种情况下,查找Pn
就变成了一个简单的单行程序
Pn = find_intersection(Ax, Ay, Bx, By, Px, Py, Px + (By - Ay), Py - (Bx - Ax))
但是,如果您没有这样的原始函数可供使用和/或不关心如何提高代码的效率,那么您可能希望选择更直接的专用计算序列,如@MBo的答案中的序列。查找向量
AB = (B.X-A.X, B.Y-A.Y)
AP = (P.X-A.X, P.Y-A.Y)
p到AB的投影为:
APn = AB * (AB.dot.AP) / (AB.dot.AB);
哪里,多特。是标量积
在坐标中:
cf = ((B.X-A.X)*(P.X-A.X)+(B.Y-A.Y)*(P.Y-A.Y))/((B.X-A.X)^2+(B.Y-A.Y)^2)
if cf < 0 or cf > 1 then projection lies outside AB segment
Pn.X = A.X + (B.X-A.X) * cf
Pn.Y = A.Y + (B.Y-A.Y) * cf
cf=((B.X-A.X)*(P.X-A.X)+(B.Y-A.Y)*(P.Y-A.Y))/(B.X-A.X)^2+(B.Y-A.Y)^2)
如果cf<0或cf>1,则投影位于AB段之外
Pn.X=A.X+(B.X-A.X)*cf
Pn.Y=A.Y+(B.Y-A.Y)*cf
查找向量
AB = (B.X-A.X, B.Y-A.Y)
AP = (P.X-A.X, P.Y-A.Y)
p到AB的投影为:
APn = AB * (AB.dot.AP) / (AB.dot.AB);
哪里,多特。是标量积
在坐标中:
cf = ((B.X-A.X)*(P.X-A.X)+(B.Y-A.Y)*(P.Y-A.Y))/((B.X-A.X)^2+(B.Y-A.Y)^2)
if cf < 0 or cf > 1 then projection lies outside AB segment
Pn.X = A.X + (B.X-A.X) * cf
Pn.Y = A.Y + (B.Y-A.Y) * cf
cf=((B.X-A.X)*(P.X-A.X)+(B.Y-A.Y)*(P.Y-A.Y))/(B.X-A.X)^2+(B.Y-A.Y)^2)
如果cf<0或cf>1,则投影位于AB段之外
Pn.X=A.X+(B.X-A.X)*cf
Pn.Y=A.Y+(B.Y-A.Y)*cf
您有两个答案,愿意接受吗?您有两个答案,愿意接受吗?