我正在寻找一种打包算法,它会将正多边形缩小为矩形和直角三角形。该算法应尽量使用尽可能少的形状,并且应该相对容易实现(考虑到挑战的难度)。
如果可能,这个问题的答案应该解释建议算法中使用的一般启发式方法。
答案 0 :(得分:8)
我认为常规多边形的答案相当简单。
找到对称轴,并在每个顶点与其镜像之间画一条线。这将多边形划分为梯形。每个梯形都可以变成一个矩形和两个直角三角形。
答案 1 :(得分:0)
它不是特定的矩形+直角三角形,但是研究镶嵌多边形的一个很好的研究点是Voronoi Diagrams and Delaunay Triangulations和here以及here。
事实上,如果“恰好是正确的三角形”足够好,那么这些三角形可以保证三角形,并且如果你真的需要,你可以随时将任意三角形分成两个直角三角形。或者你可以砍掉三角形的“尖端”来制作更多的直角三角形和一些直角三角形的矩形。
你也可以尝试ear-clipping,或者通过径向扫描,如果你知道你有相当规则的多边形,或者通过“剪掉最大的凸块”。然后,将每个剩余的三角形分成两个以创建直角三角形。
polygon http://static.eruciform.com/images/polygon.png
你可以尝试通过一种方式减少休息,然后另一种方式制作一个梯形并以不同的方式拆分它,但是你必须做一个检查以确保你的扫描线没有越过另一条线。即使是实际上分形的东西,你也可以随时进行耳夹。
然而,这有时会产生非常纤细的三角形。您可以执行启发式操作,例如“取最大值”,而不是沿着边缘连续剪切,但这需要更多时间,接近O(n ^ 2)。在大多数情况下,Delaunay / Vornoi会更快地做到这一点,而且三角形较小。
答案 2 :(得分:0)
你可以尝试“切出”the largest rectangle that can fit in the polygon,留下一些残羹剩饭。继续重复切割残羹剩饭上的矩形,直到你最终得到三角形碎片。然后,如有必要,您可以将它们分成两个直角三角形。我不知道这是否总会产生能给你最少量矩形和直角三角形的解决方案。