使用四点相交的线段
我有四个点 p0 、 p1 、p1' 、 p2' ,每个点由 x,y,z 分量定义,并且全部位于一条线上,如图
我想从四个点之间的交点获得线段(虚线部分)结果
任何建议,或使用 C# 的示例代码
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我有四个点 p0 、 p1 、p1' 、 p2' ,每个点由 x,y,z 分量定义,并且全部位于一条线上,如图
我想从四个点之间的交点获得线段(虚线部分)结果
任何建议,或使用 C# 的示例代码
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(2)
这或多或少与 Howard 给出的答案相同,但被压入 C# 中......我希望这对您的代码库有所帮助。
这段代码片段应该可以解决这个问题(从 4 个点中找到中点,但前提是所有点都是共线的) - 另请注意,我不检查真正的交点,您可以通过检查答案和您的点来轻松地自己完成此操作。
我没有花时间以合理的方式实现 Vector3D 结构(运算符,...) - 您也可以轻松做到这一点。
另请注意,这不仅适用于 4 点,而且请牢记您的图表。
This is more or less the same answer as Howard gave but pressed into C# ... I hope this helps with your code-base.
This code snippet should do the trick (finding the mid-points from your 4, but only if all are colinear) - also note I don't check for real intersection, you can do this easily youself by inspecting the answer and your points.
I did not take the time and implement the Vector3D struct in a sensible manner (operators, ...) - you can do this easily too.
Also note that this will work for not only 4 points but keep your diagram in mind.
您可以按如下方式进行:
步骤 1:转换为一维问题
t(P) = (P-P0).(P1-P0) / (P1-P0).(P1-P0)
其中点表示标量积t
是通过P1
和P0
的直线上的线性度量,t(P0)=0
,t(P1)=1
步骤 2:解决一维问题
t(P0') <= t( P1')
(否则交换以下行中的P0'
和P1'
)t(P0') <= 0 <= t(P1') <= 1
=>交集是线段(P0,P1')
t(P0') <= 0 < 1 < t(P1')
=>交集是线段(P0,P1)
0 <= t(P0') <= t(P1') <= 1
=>交集是线段(P0',P1')
(P0',P1)
t
值感兴趣,则交集由t0 = max 之间的线段给出(0, t(P0'))
和t1 = min(1, t(P1'))
ifft0 <= t1
You may proceed as follows:
Step 1: Transformation into a 1D-problem
t(P) = (P-P0).(P1-P0) / (P1-P0).(P1-P0)
where the dot denotes the scalar productt
is a linear measure on the line throughP1
andP0
t(P0)=0
,t(P1)=1
Step 2: Solve the problem in 1D
t(P0') <= t(P1')
(otherwise swapP0'
andP1'
in the following lines)t(P1') < 0
=> no intersection1 < t(P0')
=> no intersectiont(P0') <= 0 <= t(P1') <= 1
=> intersection is segment(P0,P1')
t(P0') <= 0 < 1 < t(P1')
=> intersection is segment(P0,P1)
0 <= t(P0') <= t(P1') <= 1
=> intersection is segment(P0',P1')
0 <= t(P0') <= 1 < t(P1')
=> intersection is segment(P0',P1)
t
-values, the intersection is given by the line segment betweent0 = max(0, t(P0'))
andt1 = min(1, t(P1'))
ifft0 <= t1