检测任意形状

时间:2011-01-10 12:19:06

标签: geometry computational-geometry

问候,

我们有一组点代表3d体和水平面的交点。我们想要检测代表身体横截面的2D形状。可以有一个或多个这样的形状。我们找到了讨论如何使用Hough变换对图像进行操作的文章,但是我们可能有数千个这样的点,因此转换为图像非常浪费。有更简单的方法吗?

谢谢

2 个答案:

答案 0 :(得分:5)

在将3D模型转换为一组点时,您已丢弃了查找交点形状所需的信息。走一下3D模型的边 - 面连通图,按顺序找到边平面交点。

假设您拥有或可以构建三维模型地形(一些顶点,顶点之间的边,边缘边界):

  1. 遍历边缘列表,直到找到与测试平面相交的边缘列表,将其添加到列表中
  2. 选择一个共享此边缘的面孔
  3. 遍历该面的其他边缘以找到下一个交叉点,将其添加到列表中
  4. 重复另一个共享该边缘的面,直到您回到起始边缘
  5. 你已经构建了一个与平面相交的有序边缘列表 - 按顺序线性插值每条边以按顺序找到形成交叉点形状的交点是微不足道的。请注意,此过程假定面多边形是凸的,在您的情况下它们是凸的。 如果您的体积是凹的,那么您将拥有多个离散的交叉形状,因此您需要重复此过程,直到检查完所有边。

    有一些java代码可以执行此操作here,还有一个非常漂亮的测试应用程序here

    控制:

    • 1-5更改测试卷
    • q和w来改变查询平面的数量
    • a,s和d来改变查询平面的扫描速度
    • 左键单击并拖动以旋转视图
    • 右键单击并拖动以旋转查询平面

答案 1 :(得分:0)

当平面与凹面的某些顶点相交时,来自接受的答案的算法/代码不适用于复杂的特殊情况。在这种情况下" walking"边缘面连接图贪婪地可以在时间之前关闭一些多边形。

所发生的事情是,因为平面与顶点相交,所以在走图时的一个点上,下一个边有两种可能性,选择哪一个很重要。

一种可能的解决方案是实现图遍历算法(例如深度优先搜索),并选择包含起始边的最长循环。