首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类似于Matlab卷积的Javascript三维凸壳算法

类似于Matlab卷积的Javascript三维凸壳算法
EN

Stack Overflow用户
提问于 2016-05-24 20:08:45
回答 1查看 487关注 0票数 3

我一直在努力寻找一个用于Javascript的凸壳库,它可以提供与Matlab convhulln函数相同的输出。

我正在将一些代码从Matlab转录到Javascript中,并且我需要找到组成一组顶点的凸包的三角形。Matlab使用convhulln (利用qhull函数)计算一些三维点的凸包。在这种情况下,当我将相同的顶点传递给每个人时,Matlab convhulln会输出一组与quickhull3d不同的三角形面。一些面孔重合,但通常大多数不重合。它们唯一的相似之处是它们都输出相同数量的面(尽管面的实际顶点不相同)。

http://www.mathworks.com/help/matlab/ref/convhulln.html

在Javascript中,我尝试了不同的库,每个库都给出了不同的输出。

在npm中,我尝试过:

quickhull3d - https://github.com/maurizzzio/quickhull3d

代码语言:javascript
复制
convex-hull

delaunay-triangulate

大多数其他算法都是为2D点设计的,所以我已经排除了它们。

如果您有任何想法、建议或反馈,我们将非常感谢!谢谢!

下面是我正在使用的顶点,以及MATlab的convhulln和quickhull3d的结果。请注意,我使用了一种排序算法,从第一个顶点到最后一个顶点对它们进行排序。这应该不会影响实际的三角面,因为我在MATlab和JS代码中对它们进行了完全相同的排序。

这是两个船体的曲线图。

注意那些洞。我已经和quickhull3d算法的开发者谈过了(感谢你的回复!!)他提出,他使用的三角测量过程可能与matlab使用的不同。

代码语言:javascript
复制
vertices = [ 
  [ 0.9510565162951535, -0.3090169943749474, 0 ],
  [ 0.5877852522924731, -0.8090169943749475, 0 ],
  [ 6.123233995736766e-17, -1, 0 ],
  [ -0.5591929034707466, 0.8290375725550418, 0 ],
  [ -0.9510565162951535, -0.3090169943749475, 0 ],
  [ -0.9510565162951536, 0.3090169943749473, 0 ],
  [ -0.5877852522924732, 0.8090169943749473, 0 ],
  [ -1.8369701987210297e-16, 1, 0 ],
  [ 0.5877852522924729, 0.8090169943749476, 0 ],
  [ 0.9510565162951535, 0.3090169943749476, 0 ],
  [ 0.984807753012208, 0, -0.17364817766693033 ],
  [ 0.30432233187297814, -0.9366078308002486, -0.17364817766693033 ],
  [ -0.796726208379082, -0.5788554735638644, -0.17364817766693033 ],
  [ -0.7967262083790821, 0.5788554735638641, -0.17364817766693033 ],
  [ 0.3043223318729779, 0.9366078308002487, -0.17364817766693033 ],
  [ 0.5000000000000001, -0.5, 0.7071067811865475 ],
  [ -0.5, -0.5000000000000001, 0.7071067811865475 ],
  [ -0.5000000000000001, 0.5, 0.7071067811865475 ],
  [ 0.4999999999999999, 0.5000000000000001, 0.7071067811865475 ],
  [ 6.123233995736766e-17, 0, 1 ] 
]

来自quickhull3d的三角形: dim = 36x3

代码语言:javascript
复制
    trianglesqh = [ 
  [ 0, 1, 11 ],
  [ 0, 9, 18 ],
  [ 0, 10, 9 ],
  [ 0, 11, 10 ],
  [ 0, 15, 1 ],
  [ 0, 18, 15 ],
  [ 1, 2, 11 ],
  [ 1, 15, 2 ],
  [ 2, 12, 11 ],
  [ 2, 15, 16 ],
  [ 2, 16, 12 ],
  [ 3, 6, 17 ],
  [ 3, 7, 14 ],
  [ 3, 13, 6 ],
  [ 3, 14, 13 ],
  [ 3, 17, 7 ],
  [ 4, 5, 13 ],
  [ 4, 12, 16 ],
  [ 4, 13, 12 ],
  [ 4, 16, 17 ],
  [ 4, 17, 5 ],
  [ 5, 6, 13 ],
  [ 5, 17, 6 ],
  [ 7, 8, 14 ],
  [ 7, 17, 18 ],
  [ 7, 18, 8 ],
  [ 8, 9, 10 ],
  [ 8, 10, 14 ],
  [ 8, 18, 9 ],
  [ 10, 11, 12 ],
  [ 10, 12, 14 ],
  [ 12, 13, 14 ],
  [ 15, 18, 19 ],
  [ 15, 19, 16 ],
  [ 16, 19, 17 ],
  [ 17, 19, 18 ] 
]

来自MATlab的三角形: dim = 36x3

代码语言:javascript
复制
trianglesm = [
  [ 0, 1, 11 ],
  [ 0, 9, 18 ],
  [ 0, 10, 9 ],
  [ 0, 11, 10 ],
  [ 0, 15, 1 ],
  [ 0, 18, 15 ],
  [ 1, 2, 11 ],
  [ 1, 18, 2 ],
  [ 2, 3, 11 ],
  [ 2, 15, 16 ],
  [ 2, 16, 3 ],
  [ 3, 4, 12 ],
  [ 3, 12, 11 ],
  [ 3, 16, 4 ],
  [ 4, 5, 12 ],
  [ 4, 17, 5 ],
  [ 5, 8, 13 ],
  [ 5, 13, 12 ],
  [ 5, 16, 17 ],
  [ 5, 17, 6 ],
  [ 6, 7, 14 ],
  [ 6, 14, 13 ],
  [ 6, 17, 7 ],
  [ 7, 8, 14 ],
  [ 7, 17, 18 ],
  [ 7, 18, 8 ],
  [ 8, 9, 10 ],
  [ 8, 10, 14 ],
  [ 8, 18, 9 ],
  [ 10, 11, 14 ],
  [ 11, 12, 13 ],
  [ 11, 13, 14 ],
  [ 15, 18, 19 ],
  [ 15, 19, 16 ],
  [ 16, 19, 17 ],
  [ 17, 19, 18 ]
]
EN

回答 1

Stack Overflow用户

发布于 2016-05-24 22:17:32

您可以尝试鲍耶-沃森算法,但使用的是外接球面和四面体:https://en.m.wikipedia.org/wiki/Bowyer%E2%80%93Watson_algorithm

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37413131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档