【问题标题】:Matlab: what is the correct way to get the convex hullMatlab:获得凸包的正确方法是什么
【发布时间】:2016-01-11 18:08:50
【问题描述】:

我有一个 3D 数据数组,其中显示了一个凹形图形。我想找到所有不属于图形但在凸包内的点。我该怎么做?

我知道我应该使用convhull 函数,但我不确定如何使用(输入是一个大小为m by n 的数组,其中m 是点数,n 是点数尺寸,所以在我的情况下为 3)。另外,我不确定如何处理这个函数的输出——它与输入矩阵的大小相同。

如果有任何示例,我将不胜感激。

【问题讨论】:

  • 等一下,你有一个数据图,让我们说构成凸包的点的 file1.txt 和那个包的点(内部或外部)的 file2.txt?

标签: matlab image-processing convex-hull


【解决方案1】:
[K, V] = convhull(YourArray);

K 是与凸包上的点相对应的点的索引,V 只是该凸包跨越的体积。因此,您可以使用此行索引在YourArray 中找到您的点。

使用下面的例子:

YourArray= rand(1e3,3);
[K, V] = convhull(YourArray);

K 给了我一个 140x3 'double' 包含我的点的索引和V=0.9291,我的凸包跨越的体积。您可以通过简单地调用从YourArray 获取凸包上的点

YourArray(K)

Documentation link

不出所料,越来越多的人一直在努力获取凸包内的点,并为此编写了代码,请参阅 MathWorks Central,John D'Errico 的代码。

【讨论】:

  • 根据文档,我的数组“大小为 mpts-by-ndim,其中 mpts 是点数,ndim 是点所在空间的维度”。那么为什么它适用于一个数组,比如说,32 x 32 x 32?我需要找到所有在凸包内但在我的身材之外的点。我该怎么做?
  • @DailyInformation - 这可能会有所帮助:stackoverflow.com/questions/33110501/reshaping-arrays-in-matlab/…
  • 大小为 [32x32x32] 的数组基本上是一个均匀分布的 3D 网格,即每个方向上有 32 个网格点,因此可以使用 @rayryeng 告诉你的内容重新调整为 Nx3 数组
  • @DailyInformation 您问题的另一部分还没有内置到 MATLAB 中。对于 2D 情况,有 inpolygon,但在 3D 中,您必须使用 delaunay 并检查一个点是否在每个三角形的正确一侧。 MATLAB 还没有内置此功能的原因是因为这样做非常困难,尤其是以一种有效的方式。
猜你喜欢
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多