- 写在之前
最近的一个2D项目中,要求对一个方块不断进行切割,切掉较小者,留下较大者,如此,便引出了一个问题:不同形状图形的数据的更新。而图形的数据结果的计算,就涉及到了计算机图形学相关的知识---三角化的概念边产生。
2. 问题拆分
a> 一个简单的图形(此处仅指2D)--如正方形,在代码中的表示方法
b> 三角化概念以及三角化的方法
3. 关于图形的表示方法
如下图,四个点的坐标信息保存在一个双向循环链表的结构中,这样,我们只需要知道一个点就可以按照我们预定的方向拿到剩下的所有点了。
可识别的图形(左)和转换后的数据示意图(右)
这样,根据三点不同时都在同一条直线的原则,一个平面图形的数据就构建完成了。
4. 三角化
因为计算机的GPU在绘制面的时候,是以三角形为基本单位的,所有的复杂图形都是大量的三角形拼接成的。这就是三角化概念的由来:将简单多边形分解成许多三角形,由这些三角形的顶点构成这个多边形。这个拆解的过程就是三角化的过程。简单举例,上图的矩形三角化之后有两个三角形:△P0 P1 P2、△P2 P3 P0,也就是点集合的索引:012、230的确定的过程就是三角化。
关于多边形的三角化算法,在这里,介绍一种比较简单容易理解的三角化法--耳切法。
耳切法适用于简单多边形的三角化,这里需要说明几个概念。
简单多边形:几何学中将互不相交的一些线段成对连接形成的闭合路径的平面图形,称为简单多边形。任意一个简单多边形至少有3个顶点。
“耳朵”(Ear):组成多边形的顶点,其相邻的两个点连成一条线段,这条线段完全落在这个多边形的内部,而且你会发现,这个顶点在该多边形中是一个凸顶点,将该点移除之后,该简单多边形的边数减少1个,重复这样的过程,最终将该多边形三角化。
以下便是对耳切法理论(Ear Clip)的说明和应用:
一个简单多边形(10条边)
定义上面的多边形点集合P:(0~9),并使用双向链表将这些点保存起来。接着,根据“耳朵”的定义,找出点集合P中所有的“耳”点(即符合条件的凸顶点),即初始状态下的“耳朵”集合E,所有的凸顶点(Convex Vertices)集合C,所有的凹顶点(即该点的两条边形成的内角大于18