Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Geometry 沿法线延伸到另一点的直线查找点_Geometry_Line_Point_Normals - Fatal编程技术网

Geometry 沿法线延伸到另一点的直线查找点

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.请注

给定线段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.请注意,@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)
pAB的投影为:

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)
pAB的投影为:

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

您有两个答案,愿意接受吗?您有两个答案,愿意接受吗?