- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定一个 3D 多面体,其边界由三角网格表示,我如何实现一种算法来确定给定的 3D 点是否属于多面体的内部?
最佳答案
有几种方法可以实现这个功能。
最简单的方法是创建一条从点开始指向任意方向的无限射线(或很长的线段),然后计算射线与三角形之间的交点数。如果交点的个数是奇数,则该点在多面体内部。
Inside(Polyhedron P, point q)
Segment S = [q, q+(0,0,1e30)]
count = 0
For each triangle T of P
If Intersect(S,T)
count = count + 1
End if
End for
return odd(count)
End
现在计算线段和三角形之间是否存在交集的函数:
Intersect([q1,q2],(t1,t2,t3))
s1 = orient3d(q1,t1,t2,t3)
s2 = orient3d(q2,t1,t2,t3)
// Test whether the two extermities of the segment
// are on the same side of the supporting plane of
// the triangle
If(s1 == s2)
return false
End if
// Now we know that the segment 'straddles' the supporing
// plane. We need to test whether the three tetrahedra formed
// by the segment and the three edges of the triangle have
// the same orientation
s3 = orient3d(q1,q2,t1,t2)
s4 = orient3d(q1,q2,t2,t3)
s5 = orient3d(q1,q2,t3,t1)
return (s3 == s4 AND s4 == s5)
End
最后,orient3d函数:
Orient3d(a,b,c,d)
// Computes the sign of the signed volume
// of the tetrahedron (a,b,c,d)
return Sign( dot(cross(b-a,c-a),d-a) )
End
现在有两个大陷阱:
如果浮点精度不够会发生什么情况计算 Orient3d ?
当所选线段恰好通过三角形的顶点还是边?
对于 1.,必须使用任意精度的算术 [1]。在 [2] 中,引用文献 [1] (Jonathan Shewchuk) 的作者公开了 orient3d() 的实现。我自己的编程库 [3] Geogram 中也有一个实现。
现在对于 2.,它更棘手,最好的方法是实现符号扰动 [4]。简而言之,这个想法是通过考虑点沿着由时间参数化的轨迹移动并在时间趋于零时取位置限制来“消除”orient3d() 返回零的配置(另一种说法:如果位置没有给出答案,请查看时间 t=0 时的“速度矢量”)。原始引用文献 [4] 给出了 orient2d() 的符号扰动,用于“多边形中的点”测试(问题的 2D 版本)。
注意:如果您很懒惰并且不想实现符号扰动,您可以在每次 orient3d() 测试之一返回零时选择一个随机方向(那么您不能保证它不会永远搜索,但在实践中它不太可能发生)。无论如何,我建议仅将其用于原型(prototype)制作,并在最后实现符号扰动。
[1] https://people.eecs.berkeley.edu/~jrs/papers/robustr.pdf
[2] https://www.cs.cmu.edu/~quake/robust.html
[3] http://alice.loria.fr/software/geogram/doc/html/index.html
关于triangulation - 测试 3D 点是否在 3D 多面体内部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44513525/
我目前正在使用 CGAL 执行一些 2D 三角测量任务,并且我也已经准备好了一些简单的工作。无论如何,我真的不知道如何对凹形进行三角剖分,因为现在我总是得到所有点的凸包。基本上我想在 mouseCli
假设我们有五个顶点: X = [0 1; 2 1; 4 1; 1 0; 3 0]; 三角测量: T = [1 4 2; 4 5 2; 5 3
用例: 给定一个已知的(模拟的)3D 场景,并且: 对应 2D 点 V、V' 的 2 个向量,其中 V' 表示 3D 点的投影,包括相对变换(使用 5 点算法提取)。 相机内在矩阵‘K’ 相对相机旋转
给定平面中的一组点和一个不完整的 triangulation of the convex hull of the points (只给出了一些边),我正在寻找一种算法来完成三角剖分(初始给定的边应该保
我是 CGAL 的新手,我确定我的问题很简单。 我正在尝试使用 CGAL 进行一些 Delaunay 三角剖分。我有一个球体上有 N 个 3D 点的网格,我想使用这些点作为三角形的顶点对球体进行三角测
在使用 Fade 库的 Delaunay 三角剖分中,可以访问站点的事件三角形并访问其邻居,如下所述:http://www.geom.at/example2-traversing/ 我不知道如何利用事
给定一个 3D 多面体,其边界由三角网格表示,我如何实现一种算法来确定给定的 3D 点是否属于多面体的内部? 最佳答案 有几种方法可以实现这个功能。 最简单的方法是创建一条从点开始指向任意方向的无限射
我试图通过他们的蓝牙强度(RSSI 值)找到用户。 我有 3 个 Raspberry PI,每个都收集用户的信号强度。假设返回的节点: node1 = 65 node2 = 70 node3 = 75
所以我目前有一个使用此设置的 2.5D Delaunay 三角剖分。 typedef CGAL::Exact_predicates_inexact_constructions_kernel K
我在 Ubuntu 11.04 上使用 NetBeans 7.1,并希望使用 OpenCV 从一组点中获取三角形。我按如下方式构建 Delaunay 三角剖分。 vector CTwoDTriangu
我想检测我的点集的边界。我从 scipy spatial 尝试了 Delaunay 三角剖分,但我得到了这个: 当我从这些三角形执行 alpha 形状时,我无法获得点集的边界。所以我认为我应该使用受约
我正在尝试使用matplotlib.tri.Triangulation为matplotlibsplot_trisurf生成三角形。我想指定三角形,而不是让 matplotlib.tri.Triangu
我得到了一个具有随机分布点的云和另一个具有相同点但随机移动的云。所以云A中的每个点在云B中都有对应的点。 现在我想用相同的三角形网格对两个云进行三角剖分,找到两个云中交叉点最少的网格。 有什么想法吗?
似乎 matplotlib.tri.Triangulation 使用了一个有缺陷且可能不正确的 Delaunay 三角剖分实现,该三角剖分将被 qHull 取代. 我正在尝试使用 mpl_toolki
有谁知道如何使用 World Magnetic Model 将来自 android 设备的磁场传感器的结果转换为坐标? ?是否有这样做的网络服务? 最佳答案 你不能这样做。首先,您需要坐标,这意味着
我是一名优秀的程序员,十分优秀!