在3d空间中找到一个点与三角形的距离

时间:2013-05-06 01:40:58

标签: c# math graphics 3d

想象一下笛卡尔空间中三角形的表面。如何从该三角形的表面找到给定点的距离?

第1点:[30,24,22]
第2点:[35,13,​​19]
第3点:[21,29,85]

在这种情况下,点[40,25,77]离上面定义的三角形表面有多远?

或具体而言 - 确定距离的公式是什么?

2 个答案:

答案 0 :(得分:1)

这一切都取决于你想要距离的来源(三角形的哪一部分?)。如果你知道三角形的起点(中心可能是?)那么,从数学的角度来看,公式是:

Point 1: [a1,b1,c1] (point on triangle)
Point 2: [a2,b2,c2] (point to find distance to)

distance vector = [a2-a1, b2-b1, c2-c1]
distance = the magnitude of above = sqrt((a2-a1)^2 + (b2-b1)^2 + (c2-c1)^2))

我不知道C#,但这将是它的伪代码(背后的数学)

修改:找到三角形的中心......

Point 1: [x1, y1, z1]
Point 2: [x2, y2, z2]
Point 3: [x3, y3, z3]
Centre = [(x1+x2+x3)/3, (y1+y2+y3)/3, (z1+z2+z3)/3]

答案 1 :(得分:1)

我会假设您的意思是最小距离。否则,距离会根据您选择的三角形上的哪个点而变化。要看到这一点,只需在桌子上画一个三角形并在它上方握笔。

简短的回答是,要找到最小距离,您需要构建一个每列一个点的矩阵,如下所示:

    [ 30 35 21 ]
A = [ 24 13 29 ]
    [ 22 19 85 ]

请阅读about projections了解详情。如果你研究过这种东西已经有一段时间了,不要被吓倒。这不是火箭科学(实际上,可能是火箭科学的介绍),但需要一些投资才能理解。为了帮助你,我先谈一下这个理论,然后谈谈实施。

为了给你一些直觉,请坚持使用那支钢笔。

让我们从最简单的情况开始:为了获得最小距离,请将笔完全垂直于桌子,并将笔的末端放在三角形的某个位置。将您的观点描绘为笔尖。您刚刚证明了最接近您的点的三角形中的点是该点在三角形中的三个点定义的空间上的投影。换句话说,笔的另一端。三角形中的任何其他点的距离必须长于笔长。

现在让我们看一下并发症。假设你想要的点并不完全在三角形的“上方”,而是在某个地方。说,完全离开桌子的表面。在这种情况下,最靠近该点的三角形中的点将是三个点本身之一,或者是连接三个初始点的三个线段上的一个点。

现在执行:瘦子是,如果你可以使用一个简单的线性代数库,你将为自己省去很多悲伤。最难的步骤是反转矩阵,并且反转3x3矩阵通常很容易,当点是共线时(即,考虑对齐的三个点),当幅度非常不同时(即,想到一个),它会变得复杂很长很瘦的三角形等等。

你可以为这个问题编写一个特定于问题的算法,因为它只有3x3,但是在一天结束时你需要解决投影系统,所以你的算法将基本上做同样的数学运算。在维基百科页面上。所以你最终可能会重新发现线性代数,这是浪费大量时间的可靠方法。

我的最后一个实施建议是检查游戏或3D库中的关键字“投影”。如果你很幸运,你可以打电话。否则得到一些不错的CLR线性代数库,构建矩阵,并在100行代码中高效地完成整个计算。