在平面图中绘制最大三角形的算法

时间:2015-03-22 03:38:37

标签: algorithm graph max

我有一个随机数量的顶点随机分布在平面上。

我需要一个算法告诉我如何绘制图形如下: 图表必须具有最大三角形面数。 边缘不得相互交叉(平面图)。

我需要知道我想要绘制的图形的名称是什么,然后我需要知道是否有一个好的算法或库来帮助我绘制它。


将结果打印到stdout就像下面这样绰绰有余:

  

(v =顶点; e =边缘; k =面部总数)

     

e0:v0 v1

     

e1:v0 v2

     

e2:v0 v3

     

e3:v1 v2

     

e4:v1 v3

     

K:4

这应该是这样一个简单图形的输出:

graph

但算法应该支持具有更多顶点数的图形。

1 个答案:

答案 0 :(得分:1)

你想要一个三角测量,任何这样的人都会这样做:他们都有相同数量的面孔。

一种方法是:

  • 找到顶点的凸包。说v[1]...v[n]顺时针绕着凸包。将此凸包三角化为v[1]v[2]v[3]v[1]v[3]v[4]v[1]v[4]v[5] ......等(即:将v[1]的光线绘制到每个顶点,以将其细分为三角形)。
  • 现在通过一次添加一个顶点来更新三角剖分:
    • 如果新顶点位于现有三角形内,则通过从每个角到新顶点绘制光线,将现有三角形细分为3个部分。
    • 如果新顶点位于现有边缘上,则通过从与边缘相对的顶点到新顶点绘制光线,将两个现有三角形(边缘两侧各一个)切割成一半。如果新的顶点位于凸包的边缘,那么你只需要一个三角而不是两个来切成两半。

如果您正在寻找一个很好的"三角测量,考虑Delaunay triangulation。这具有使三角测量中的最小角度最大化的特性,这将倾向于产生更好看的图像,因为如上所述的更简单的方法通常会给出非常薄的三角形。