在矩形内反转多边形的算法?

Algorithm for inverting a polygon within a rectangle?

我正在尝试在我的游戏中制作一种 "flashlight" 效果,让玩家只能看到他视线范围内的地方。

我通过将光线投射到游戏世界中的每个顶点并添加和额外的光线投射 +-0.0001 rad,然后按顺时针顺序连接它们以形成 this shape in red. I'm trying to get the inverse of this polygon within the bounds of the rectangular level similar to the "Inverse Selection" option in programs like Photoshop (example)[=11= 来完成大部分效果]

为矩形和多边形构造一个集合并计算symmetric difference矩形多边形中的顶点但不在两者中),例如:

rectangle = [(0, 0), (13, 0), (13, 10), (0, 10)]
polygon = [(0, 5), (0, 10), (2, 6), (8, 6), (11, 0), (13, 0), (13, 10)]
# "^" is the symmetric difference operator in python
set(rectangle) ^ (set(polygon)) 

Returns:

set([(11, 0), (2, 6), (0, 5), (0, 0), (8, 6)])

对应下图中的绿色区域(顶点A、I、E、H、J):

请注意,它将得到红色多边形的补码,其中不包括原始图像中与墙的交点:

如果您希望结果为下图的黄色多边形:

然后你将不得不使用类似于以下问题中描述的方法为阶段中的每个 wall/block 与互补多边形进行 rectangle-polygon 交集:

Method to detect intersection between a rectangle and a polygon?