algorithm - 确定点相对于给定 3D 表面的位置

标签 algorithm vector 3d convex

我正在尝试实现用于计算 3D 凸包的 Quick hull 算法。 问题是我需要知道一个点是否可以“看到”给定的表面。

表面有顺时针或逆时针方向。

我编写了一个小的 opengl 程序来以图形方式说明算法操作。

我尝试了我看到其他算法使用的各种方程式(归一化叉积,点与平面的距离)

它们都导致了算法中的错误步骤。 这意味着他们确定某个表面从该点可见(您可以在图形上看到它不是)

表面或“面孔”的示例。

e1 = 0, 0, 0 to 10, 0, 0
e2 = 10, 0, 0 to 10, 10, 0
e3 = 10, 10, 0 to 0, 10, 0
e4 = 0, 10, 0 to 0, 0, 0

<---------/\
||        ||
||        ||
||        ||
\/--------->

假设我有两个点,我想知道它们位于表面的哪一侧。

p1 = -1, -1, -1 p2 = 1, 1, 1

如有任何帮助,我们将不胜感激。

最佳答案

第一步是确定平面的法线。这可以通过叉积来实现。例如:

normal = cross(e2 - e1, e3 - e1);

然后你需要一个向量来比较法线:

compare = point - e1

并且两个向量的点积描述,如果两个向量指向相同的法线方向:

side = dot(normal, compare)

如果 side > 0,则该点位于法线指向的平面的一侧。如果它 < 0,则它在对面。如果=0,则正好在平面上。

重要的一步是定义法线,使其指向正确的描述。只有多边形,您可以通过角点的顺序定义法线。例如。上侧是点顺时针方向的一侧。如果您需要不同的东西,则必须提供更多信息。

关于algorithm - 确定点相对于给定 3D 表面的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11428051/

相关文章:

image - Matlab 中图像的 3D 图

opengl - 为什么模型和 View 矩阵特别经常组合在一起?

algorithm - 分而治之 Delaunay 三角剖分 - 合并时获得第一个(aka "base")边缘

php - php中的锦标赛算法

c++ - 2D 射弹 - 速度和位置 vector

c++ - 添加 vector 时出现段错误。 (C++)

c++ - OpenGL 旋转 - 本地轴与全局轴

algorithm - 使用伴随矩阵求根

algorithm - 多少个长度为N的数字连续K个数字D

c++ - vector.insert(...) 调用构造函数还是赋值运算符?