一.Clipper
Clipper支持四种裁剪类型,分别是交集、并集、非/差和异或。
enum ClipType { ctIntersection, ctUnion, ctDifference, ctXor };
假如现在把布尔操作比作弄饺子皮,一整大块面皮就是主体多边形,而一个小杯子就是裁剪多边形:
1.交集intersection
当我们用杯子压在面皮上用力往下压,就相当于把面皮裁剪了,得到的一小块杯口形状的面皮(裁剪结果),就相当于intersection的结果,即两多边形的共同区域。
2.并集ctUnion
上一步交集中,我们将一块完整的面皮分成了两部分,一部分是带有窟窿的一片面皮,另一部分是杯口形状的一小块面皮。
如果这时候我们仍将大片面皮当做主体多边形,而小块面皮当做裁剪多边形。当我们把小块面皮的一部分区域与大块面皮重叠,再压一下,现在两块面皮就融合成了一块,即可看作并集操作。
3.非/差ctDifference
这一步和交集很像,不同的是,在交集操作中我们按压完后得到的是一小块杯口状面皮,而在ctDifference操作中,我们可以看作把那一小块面皮扔掉,得到的是带有窟窿的一大块面皮(裁剪结果)。
4.异或exclusive or
这一步其实也可以和并集ctUnion关联起来,在ctUnion中,我们把两块面皮重新变成了一块,而exclusive or操作在这里也会将面皮变成一块,不同的是,原本两块面皮重合的区域,将会被挖走。