c++ - 如何知道线段是否与 3d 空间中的三角形相交?

标签 c++ math 3d polygon

我有一个由 3d 空间中的 3 个点定义的三角形。我还有一个由 3d 空间中的 2 个点定义的线段。我想知道它们是否相交。我真的不需要知道交点。

我不懂微积分,但我懂一些三角函数。我知道一些关于矩阵的知识,但我很了解 vector (特别是 3d vector )。请保持简单。

你能帮我解决一下示例问题吗:

三角形:

一个:-4、3、0

b: 4, 3, 0

c: -3, -5, 4

线段:

d: 1, -2, 0

e: -2, 6, 2

编辑:

我将在 C++ 物理引擎中使用它。

一个答案涉及从 4 个顶点计算四面体体积。请提供公式或在代码中显示。

更新:

正如 meowgoesthedog 指出的那样,我可以尝试使用 Moller-Trumbore交集算法。请参阅下面我的回答以获取替代解决方案。

最佳答案

这是解决您的问题的一种方法。计算四面体的体积 Td = (a,b,c,d) 和 Te = (a,b,c,e)。如果 Td 或 Te 的体积为零,则 线段 de 位于包含三角形 (a,b,c) 的平面上。如果 Td 和 Te 的体积具有相同的符号, 那么de严格偏向一侧,没有交集。如果 Td 和 Te 取反 符号,然后 de 穿过包含 (a,b,c) 的平面。

从那里有几种策略。一种是计算 de 交叉点 p 那架飞机然后投影到二维,求解二维的三角点问题。

另一种方法是计算四面体 (a,b,d,e)、(b,c,d,e) 和 (c,a,d,e) 的体积。然后只有当三个符号都相同时,才与三角形 (a,b,c) 相交。

如何根据角坐标计算四面体的体积 网络,也在Computational Geometry in C .

关于c++ - 如何知道线段是否与 3d 空间中的三角形相交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53962225/

相关文章:

c++ - 克服 "fixing it later"的坏习惯

bash - 如何在 Ubuntu 控制台中评估数学?

java - 在 Java 中绘制/可视化 3D 对象?

3d - 如何在网络浏览器中绘制硬件加速的3D图形?

java - 如何使用 ARToolkit for Android 在 java(非 native c++)中加载 3d 模型

c++ - CMake with AUTOMOC 正在删除我的实现

c++ - 编程面试中的错误暴露了吗?

java - 碰撞处理......困惑去哪里

javascript - 在javascript中将 float 转换为近似分数

c++ - 无效的指针转换 C++