从一组相邻三角形创建多边形的算法

Algorithm for creating a polygon from a group of adjacent triangles

假设你有一组三角形,如下图所示,其中黑色是三角形边,红色是三角形点,绿色是需要找到的多边形,蓝色是多边形的点.

所描述的多边形可能是也可能不是凹面。其中的三角形将始终相邻(与集合中的其他三角形共享所有三个点)。 存在什么样的算法来生成这样一组三角形描述的多边形?多边形应采用按顺时针或逆时针顺序排列的点列表的形式。

假设你有 N 个不同的点 Pi 和 M 个三角形。我们通过点的 3 个索引 i、j 和 k 定义每个三角形。每个三角形都有 3 条边,定义为 E(i,j)、E(j,k) 和 E(i,k)。 "polygon"的查找方法如下:

1) 遍历所有三角形。对于每个三角形,将 3 条边添加到一个集合中。具有两个相同点索引的边应被视为相同的边。即,E(i,j) = E(j,i)。一旦遇到这种情况,从集合中删除 E(i,j) 和 E(j,i),因为它们是内部边缘。
2)集合中的剩余边应该是形成多边形的边。
3)按点索引对集合中的边进行排序,如下所示:

(3a) 从集合中选取任意一条边,比如 E(i,j)。
(3b) 将索引 i 和 j 添加到 std::vector,然后从集合中删除 E(i,j)。
(3c) 从集合中找到共享 std::vector 中最后一个点索引(现在是 j)的边。将这条边表示为 E(j,k)。将索引 k 添加到 std::vector 并从集合中删除 E(j,k)。
(3d) 重复步骤(3c),直到集合中没有边。 std::vector 中的点索引将是多边形的点顺序。

如果你只有 M 个三角形和三角形顶点的 3*M (x, y) 值,那么你需要做一些预处理以删除相同的点并根据如上所述的点指数。

如何遵循一个简单的 GrahamScan 算法...这应该可以解决问题。