【发布时间】:2013-07-30 15:05:45
【问题描述】:
我正在寻找一种算法,可以将有孔的形状切割成没有孔的形状。语言最好是 C#。
这是这种形状的示例图像。
我想将该形状切割成最少数量的较小形状,并且没有孔,以消除大部分空白空间(白色)。在这种情况下,这可能是一堆矩形。但是原始形状可能更复杂,例如带有圆孔。
对我来说,这听起来像是某种装箱问题,因此最好用遗传算法来解决。
但如果你知道更好的方法,这就是我问的原因。
//edit:好吧,我显然有一些事情要解释:
形状是一个几何对象 (WPF),它是从一个较大的几何图形中减去一堆小几何图形而产生的。所以我猜想某处存储了顶点。
结果形状的数量应该最小化,是的,最小的集合。
生成的形状应具有尽可能笔直的边缘和尽可能少的角。
不幸的是,我还不能提供任何代码,因为我不知道如何以编程方式实际处理这个问题。真的很抱歉。
生成的形状应该很复杂,但不是必须的。
解释一下原因:我正在开发一个纺织工艺(尤其是拼布)程序,通过该程序可以创建拼布并计算需要多少面料和成本。将补丁放在织物面板上已经可以使用类似俄罗斯方块的算法以某种方式工作,其中补丁尽可能靠近放置以减少浪费。
此外,在形状被切割的任何地方,我都需要为生成的部分添加接缝余量(这就是您在示例图像中已经可以看到的绿色部分)。
//edit 2 一个可接受的解决方案可能如下所示。红线显示形状被切割的位置,以便获得大量没有孔的最终形状。结果集包含 6 个大矩形和 25 个小矩形:
但是,根据可能看起来完全不同的原始形状,即使有圆形边缘(圆孔),可接受的解决方案也可能看起来不同。目标是尽可能去除白色区域,同时在后期实际切割织物时保持一些便利。有很多碎片必须再次缝合在一起(因此都需要缝边)只是为了节省一点布料,所以会适得其反。
【问题讨论】:
-
这很大程度上取决于当前如何定义“形状”。是图像吗?积分集合?
-
生成的形状组是否需要是最小的集合?还是可以接受任意数量的形状?此外,算法是否需要能够处理具有曲线和非 90 度角的形状?
-
请提供您尝试过的一些代码以及一组更严格的定义和条件。我认为这将回答 cmets 到目前为止的问题。
-
您能否提交一组可接受的问题解决方案?您应该明确定义“形状”和/或“孔”。例如,如果“洞”被定义为与外部区域没有联系的空白,则示例图像的解决方案可能是沿着四个水平切口切断图形,每个切口穿过一排孔。该解决方案将为您提供五条折线;都没有洞。
-
您发布的结果图实际上不是最小的无孔细分方法。它由 31 个部分组成,并且有一种方法可以用 23 个部分来完成(我不知道这是否是最小的)