我有一个封闭的、没有自交的多边形。其顶点保存在两个向量X和Y中。最后,X和Y的值被限制在0到22之间。
我想构建一个大小为22x22的矩阵,并将每个格子的值设置为true,如果多边形的部分重叠该格子则为true,否则为false。
我的初始想法是生成一个由点定义的网格,使用[a, b] = meshgrid(1:22)
,然后使用inpolygon
确定网格的哪些点在多边形内部。
[a b] = meshgrid(1:22);
inPoly1 = inpolygon(a,b,X,Y);
然而,只有当垃圾桶的中心点包含在多边形内时,它才会返回true,也就是说,它返回了下面图片中的红色形状。然而,我需要更接近绿色形状(尽管还不完整)的解决方案。
为了获得绿色图形,我执行了四次对inpolygon
的调用。对于每个比较,我将点网格向NE、NW、SE或SW移动了1/2。这相当于测试垃圾桶的角落是否在多边形内。
inPoly2 = inpolygon(a-.5,b-.5,X,Y) | inpolygon(a+.5,b-.5,X,Y) | inpolygon(a-.5,b+5,X,Y) | inpolygon(a+.5,b+.5,X,Y);
虽然这给我提供了部分解决方案,但在一个顶点包含在一个箱子中但没有一个箱子角落的情况下它会失败。
有没有更直接的方法来解决这个问题,最好是能产生更易读的代码的解决方案?
使用以下内容绘制了此图:
imagesc(inPoly1 + inPoly2); hold on;
line(a, b, 'w.');
line(X, Y, 'y);