找回密码
 注册
Simdroid-非首页
查看: 79|回复: 3

[二次开发及其理论] 一个几何问题

[复制链接]
发表于 2012-7-30 10:19:02 | 显示全部楼层 |阅读模式 来自 北京
悬赏10仿真币已解决
请问,怎样判断一个已知坐标的节点是否在一个已知的四面体单元内部(面上也算)。希望能有一个比较通用的算法。
已知点P(x0,y0,z0),四面体顶点A(x1,y1,z1)、B(x2,y2,z2)、C(x3,y3,z3)和D(x4,y4,z4)。

最佳答案

查看完整内容

每一个顶点的坐标减去待判断点的坐标,得到四组向量,如果待判断点在四面体内部,至少会有一组向量在某一坐标方向上的投影与其他各组向量在该坐标轴上的投影异号。
发表于 2012-7-30 10:19:03 | 显示全部楼层 来自 浙江嘉兴
Simdroid开发平台
每一个顶点的坐标减去待判断点的坐标,得到四组向量,如果待判断点在四面体内部,至少会有一组向量在某一坐标方向上的投影与其他各组向量在该坐标轴上的投影异号。
回复

使用道具 举报

 楼主| 发表于 2012-7-30 10:23:04 | 显示全部楼层 来自 北京
自己顶一下
刚才找到一种方法:如何判定一个空间点在四面体内部?
假定四面体的四个顶点为:
V1 = (x1, y1, z1) V2 = (x2, y2, z2) V3 = (x3, y3, z3) V4 = (x4, y4, z4)
你测试的空间点为:
P = (x, y, z)
如果下面的5个行列式有相同的符号,则点P在四面体内:
             |x1 y1 z1 1|
        D0 = |x2 y2 z2 1|
             |x3 y3 z3 1|
             |x4 y4 z4 1|

             |x  y  z  1|
        D1 = |x2 y2 z2 1|
             |x3 y3 z3 1|
             |x4 y4 z4 1|

             |x1 y1 z1 1|
        D2 = |x  y  z  1|
             |x3 y3 z3 1|
             |x4 y4 z4 1|

             |x1 y1 z1 1|
        D3 = |x2 y2 z2 1|
             |x  y  z  1|
             |x4 y4 z4 1|

             |x1 y1 z1 1|
        D4 = |x2 y2 z2 1|
             |x3 y3 z3 1|
             |x  y  z  1|

需要注意的一些情况:
如果正好 D0=0, 则该四面体是退化的四面体(比如退化成三角形,此时四点共面)。
如果 Di=0(i 不等于0),则P位于四面体的边界面i上 (边界面i是指和Vi相对应的其它三个顶点形成的面)。
如果Di的符号和D0不同,则Di位于边界面i的外边。
如果所有Di的符号都和D0相同,则P 位于边界面i之内(在四个边界面内,就是在四面体之内)。
等式D0 = D1+D2+D3+D4成立。
这个公式能够扩展到任何维的单纯形 (在2D情况下是三角形,在3D情况下是四面体)。
注意:bi = Di/D0 就是通常的重心坐标。
注意:比较Di 和D0的符号仅是判定P和Vi是否在边界面i的同一边。
回复

使用道具 举报

 楼主| 发表于 2012-7-31 22:20:20 | 显示全部楼层 来自 北京
chilin503 发表于 2012-7-30 10:19
每一个顶点的坐标减去待判断点的坐标,得到四组向量,如果待判断点在四面体内部,至少会有一组向量在某一坐 ...

看起来可行哈,谢谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-5-9 00:09 , Processed in 0.028784 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表