【问题标题】:projection of point on line in 3D点在线上的 3D 投影
【发布时间】:2011-08-11 08:54:27
【问题描述】:

我对 x,y,z 有意见

和线方向x,y,z

如何得到这条线上的点投影

我试过这段代码

http://www.zshare.net/download/93560594d8f74429/

例如在我得到的代码中使用函数交集时 线方向是 (1,0,0),点 (2,3,3) 将有投影(x , 0, 0 中的值),这是错误的值

任何建议 最好的问候

【问题讨论】:

  • 我试图得到线和包含点的平面之间的角度,结果卡住了
  • 你能给我你的邮件给你发送示例代码
  • 如果不是 NDA 的一部分,您可以在此处公开您当前的代码。
  • @AMH:你能把相关代码作为问题的一部分发布吗?
  • @AMH 你也知道你可以在问题中包含代码(在这种情况下不应该那么多),而不是使用一些愚蠢的共享网站来下载它,对吗?

标签: c# algorithm graphics geometry 3d


【解决方案1】:

您想将向量 (x,y,z) 投影到方向为 (a,b,c) 的线上。

如果 (a,b,c) 是单位向量,那么结果就是 (x,y,z).(a,b,c) (a,b,c) = (ax+by+cz) (a,b,c)

如果它不是单位向量,则将其设为一个,然后除以它的范数。


编辑:一点理论:

设 E 为 N 维向量空间:

设 F 为向量 a 指向的直线。与 F 正交的超计划是:

现在让我们在 E 中选择一个向量 x,x 可以写成: 其中xF是x在F方向上的坐标,一个x正交是正交超平面上的坐标。

你要找xF:(和我上面写的公式一模一样)

您应该仔细查看orthogonal projections 上的维基百科文章,并尝试在网络上找到更多内容。

你可以将它推广到任何 F,如果它不再是一条线而是一个计划,那么取 F 正交并以相同的方式分解 x...等等。

【讨论】:

  • 我需要投影后的点,我更新了我的问题,我的意思是线上的新点位置
  • @AMH 线上的新点位置(由单位向量 a,b,c 指向)将是: (ax+by+cz) 。整个空间上的新点坐标将是 (((ax+by+cz)*a , (ax+by+cz)*b , (ax+by+cz)*c)。是你需要的吗?
  • @AMH 请注意,如果您仅按方向定义一条线,我假设它通过 0,0,0(就像在矢量空间而不是仿射空间中)
  • @jean 我努力解决问题,并发布了代码,然后根据 ricky 的建议更新它,但仍然面临错误,这让我问
  • 如果遇到错误,请在问题中说明错误是什么,将相关代码(不一定是整个代码)发布到问题,并说出代码的哪一行给出了错误。没有人愿意下载 zip 文件来完成其他人的工作。
【解决方案2】:

这个话题显然很老,我认为原始海报的意思是矢量而不是线条。但对于 Google 而言:

与向量不同,一条线(不一定)有其原点(0,0,0)。所以不能只用一个方向来描述,它也需要一个起源。这是线的零点;这条线可以延伸到此点之外和之前,但是当你说你沿着这条线零米时,这就是你的意思。

因此,要将一个点投影到一条线上,您首先需要将该点转换为局部坐标系,您可以通过从该点减去原点来执行此操作(例如,如果栅栏柱是“线”您从 GPS 坐标转到“向北 5 米,在栅栏柱底部上方 1 米”)。现在在这个局部坐标系中,直线只是一个向量,所以我们可以使用普通的点积方法得到点的投影。

pointLocalFrame = point– origin

projection = dotProduct(lineDirection, pointLocalFrame)

注意:这里假设直线的长度是无限的,如果投影大于实际的直线长度则没有投影

注意:lineDirection 必须标准化;即它的长度必须是 1

NB:两个向量 (x1,y1,z1) 和 (x2,y2,z2) 的点积是 x1*x2+y1*y2+z1*z2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-03
    • 2011-06-03
    • 2019-02-01
    • 1970-01-01
    • 2017-04-10
    • 2019-03-20
    • 2019-06-09
    • 1970-01-01
    相关资源
    最近更新 更多