我正在处理多边形“断裂”问题,即将带(或不带)孔的多边形分解为梯形。
我在这里发现了用Python实现的类似的东西: https://deparkes.co.uk/2015/02/05/trapezoidal-decomposition-polygons-python/.
有没有办法在C++中做到这一点?
给定一个点(x,y)(std::vector)列表,然后返回一个梯形(点)列表。
我不知道有哪个库可以做到这一点,但这里有一个算法的粗略轮廓,它是扫描线或线扫描算法的一个实例。
这个想法是,您想象一条与切片方向平行的线扫过您的数据。当这种情况发生时,您将维护一组活动边。每次您的线到达顶点时,您都会发出适当的梯形并删除已变得不活动的边并引入任何新的活动边。
我在这里掩盖了一些尴尬的细节。您可能需要根据您的应用程序对输出梯形进行“网格化”,并且您必须非常小心计算的浮点部分。
如果您能找到执行多边形光栅化的代码,通常可以对其进行修改以执行此操作。在这种情况下,您可以将计算每个 x 或 y 坐标处的边交点的代码更改为仅计算顶点处的边交点。另一个值得寻找的地方是开源 EDA 包。需要使用该算法来准备用于掩模准备的芯片设计数据,但由于您使用了术语“断裂”,也许您已经知道了这一点;-)
我在这里实现了一个解决方案:https://github.com/halay08/polygon-clipping