我正在解决一个问题。我想有效地平铺多边形。
我找到了测试多边形到多边形干扰的出色参考。代码从Paul Bourke撰写的this posting,中熠熠生辉。
两个多边形之间的一般交叉测试如下:
/*
Return FALSE if two polygon intersect.
Polygon p1[] is of length n1 and polygon p2[] is of length n2.
Polygons are define with vertices ordered clockwise.
*/
int PolygonPolygon(XY *p1,XY *p2,int n1,int n2)
{
int i,j;
// Reject if a vertex of p1 is inside p2, And visa versa
for (i=0;i<n2;i++) {
if (InsidePolygon(p1,n1,p2[i]))
return(FALSE);
}
for (i=0;i<n1;i++) {
if (InsidePolygon(p2,n2,p1[i]))
return(FALSE);
}
// Reject any intersecting edges
for (j=0;j<n1;j++) {
for (i=0;i<n2;i++) {
if (LineIntersect(p1[j].x,p1[j].y,p1[(j+1)%n1].x,p1[(j+1)%n1].y,
p2[i].x,p2[i].y,p2[(i+1)%n2].x,p2[(i+1)%n2].y))
return(FALSE);
}
}
return(TRUE);
}
这些测试的支持功能在这里给出:LineIntersect.c和这里:InsidePolygon.c。 (更新:显然我需要稍微修改这三个函数,看看是否瓷砖是多边形的完全OUTSIDE还是与多边形相交的边缘。抱歉最初将它留下......不用说我必须转换它们也适用于JavaScript。)
我的问题与合理的算法有关。
方法1(盲人领导盲人)
方法2(滑动直至停止)
我对bin打包做了很多评论,但因为多边形的形状很奇怪,所以它们看起来并不合适。这是一个很好的参考,Solving the 2D Packing Problem by Rod Stephens瓷砖上有很多东西/包装一个矩形,在包装多边形时根本不多。
有更好的算法吗?我的两种算法都有漏洞吗?以前有人来过这里吗?非常感谢。
编辑:我收到了一条评论,要求显示所需输出的图像。在我准备解决方案时,我在原始陈述的问题中意识到了一些错误(涉及所需的干扰测试)。我添加了一个带有标记图块的所需输出图像,以简化接下来的对话。我也意识到我应该添加第三种方法。
方法#3,一次一条。滑动并检查。
建议的完整解决方案:
注意:我没有一种能够识别瓷砖#13的方法,除非它只适用于使用盲运的方法一。