【发布时间】:2014-10-20 03:29:57
【问题描述】:
我需要一个快速算法的例子,可以计算一个点是否位于 3D 三角形上。我的意思是如果这个点在包含给定三角形的平面上的投影在这个三角形的内部。
我需要计算一个点和一个三角形之间的距离(如果它的投影位于三角形内部,则它在一个点和这个三角形的面之间,或者如果它的投影位于三角形之外,它就在一个点和一个三角形的边缘之间)。
我希望我说得足够清楚。我找到了一些使用重心坐标的 2D 示例,但找不到 3D 示例。有没有比计算点的投影、将此投影点和给定三角形投影到 2D 并解决标准“三角形中的点”问题更快的方法?
【问题讨论】:
-
您需要多快?投影实际上并不涉及很多计算。我将表示平面坐标系中的点(其法线是一个主轴),这可以通过三个点积来实现。如果您忽略深度轴,您将返回 2D。
-
从第一句话开始:说你会接受下面的结束是准确的吗?下面仍将在投影内。编辑:另外,如果优化是问题的焦点,你能告诉我们这些东西有多少依赖于运行时常量,有多少依赖于变量吗?即可以预先支付哪些费用?
-
@Nico Schertler,聪明,我没想过。我想没有几何的时间太长了。汤米,我将尝试为定义的网格计算一次这些值,然后在运行时使用三线性或三次三次近似对其进行近似。无论如何,我希望它尽可能快地工作。
-
@Nico Schertler,我现在觉得自己非常愚蠢,但我不知道如何使用 3 点积来转换这些点。假设我有一个点
P(x, y, z)和一个平面Ax + By + Cz + D = 0。正常 n 是例如n = [A, B, C]所以它将是我们的 z(深度)轴。下一步是什么? -
你需要任何原点
O(可以是三角形的质心)。然后你需要另外两个垂直于n的轴。这些可以用叉积计算,例如y = cross(n, (1, 0, 0)); x = cross(y, n)。那么你的点在本地系统中的坐标是(dot(x, p-O), dot(y, p-O), dot(n, p-O))。如果n与(1, 0, 0)平行,则需要另一个方向。
标签: algorithm 3d geometry point