多边形填充
多边形在数学上定义为由三个或者更多顶点的坐标位置描述的平面图形,这些顶点由成为多边形的边(edge或side)顺序链接。一个多边形的所有顶点必须在同一个平面且所有的边无交叉。
多边形分类
如果所有多边形的内角均<180°,则该多边形为凸多边形,否则为凹多边形。
另外如果有顶点共线或重叠,则我们称之为退化多边形。
OpenGL等图形软件包要求所有的填充多边形为凸多边形,甚至有些系统仅接受三角形填充区,这将简化许多的显示算法。
识别和分割凹多边形
我们沿着顺时针的方向定义a~f 6条向量,并将相邻向量进行叉乘运算。凸多边形的所有临边向量叉乘积均同号。
分割凹多边形的时候有两种常用方法:
1、向量法分割:
沿着凹内角的任意边向内切割,并判断切割后的图像是否是凹多边形,反复切割直到所有切割的结果均为凸多边形为止
2、旋转法切割:
将顶点依次移动到原点,假设当前位于原点的顶点为Vk,则称其顺时针(或逆时针)相邻的下一个顶点为Vk+1,通过顺时针(或逆时针)旋转图形使得Vk+1落在x轴上,如果Vk+3位于x轴下方则将多边形沿x轴切割为两个新图形:
内外测试:
判断点p是否算图形内的点:
1、奇偶规则:
从P向外发射一条射线,这条射线不经过图形的顶点,如果射线与图形边相交的数量为偶数则P为外部的点,否则为内部的点。
如图P为外部点,U为内部点
2、环绕数规则:
从P向外发射一条射线,这条射线不经过图形的顶点,计数射线与图形边相交的线的方向,如上图,可以看到从点P发射出去的射线与AG、DE相交,其中AG和DE穿过射线的方向相反。我们做如下计数:从右向左穿的+1,从左向右穿的-1。如果为0则为外部点,不为0则为内部点。
两者对于简单图形可以得到相同的结果,但是对于复杂的图形可能会得出不同的结果。但是环绕数规则符合布尔逻辑:
相交:
我们假设有B-A计算,则环绕数大于1的填充区:
多边形表
定点表:
| 顶点 | 坐标 |
|---|---|
| V1 | x1, y1, z1 |
| V2 | x2, y2, z2 |
| V3 | x3, y3, z3 |
| V4 | x4, y4, z4 |
| V5 | x5, y5, z5 |
边表:
| 边 | 顶点 |
|---|---|
| E1 | V1, V2 |
| E2 | V2, V3 |
| E3 | V3, V1 |
| E4 | V3, V4 |
| E5 | V4, V5 |
| E6 | V5, V1 |
面片表:
| 面 | 边 |
|---|---|
| S1 | E1, E2, E3 |
| S2 | E3, 34, E5, E6 |
边表扩充了指向面片表的指针:
| 边 | 顶点、面片 |
|---|---|
| E1 | V1, V2, S1 |
| E2 | V2, V3, S1 |
| E3 | V3, V1, S1, S2 |
| E4 | V3, V4, S2 |
| E5 | V4, V5, S2 |
| E6 | V5, V1, S2 |