在图像渲染的时候,我们可以使用硬件剪裁(在OpenGL中也就是glScissor或者使用stencilbuffer)。但这样做的劣势是必须增加一个drawcall,于是就涉及到了比较大的切换开销问题(具体的可以参考这篇知乎帖子)。
要在程序中做任意多边形的剪裁,也就需要把多边形和剪裁框的交算出来,然后在分解成triangle fan给硬件进行渲染。这其中涉及到的计算量显然要比单纯的AABB求交来的“重“的多。主要涉及三个方面:
所有的计算都基于向量积,但具体的实现有一些坑需要填(详细的可以参考下面的代码)。
对于这个算法的简单证明,如果点p在交集的边界上,则显然p或者在P的边界上,或者在C的边界上,但不是both。那么这个边界的顶点只有两种可能,要不然是P和C的边界相交而成,或者是P和C自己的边相交而成。前者由算法第一步求出,后者由算法2,3步补充。
按顺序点击canvas区域创建一个凸四边形,双击取消当前四边形