网格的着色单元格覆盖在具有不同颜色的多边形顶部

时间:2016-10-12 23:09:55

标签: python matlab

有一个网格覆盖在多边形的顶部。为了使讨论具体,请假设如下图:

enter image description here

我有黄色多边形,我想覆盖网格,如图所示。我希望根据某些规则为网格单元着色。它们并不像将相交的细胞着色为红色和绿色一样简单。我想对每个网格单元格进行条件检查,然后根据结果对它们进行着色。我不知道如何表示网格单元格,然后继续对它们进行条件检查。这是我的第一个问题。这更像是一个数据结构问题。

接下来如果我知道哪些细胞会变成橙色,我该怎么做?这是一个图形问题。

我可以弄清楚1x1网格单元格如何基本上是这样的点:

figure
hold on

roi=[264.418629550321 234.728971962617;207.673447537473 220.710280373832;206.60278372591 78.1869158878505;75.9817987152034 66.5046728971964;58.8511777301927 447.345794392523;201.249464668094 454.355140186916;294.39721627409 380.757009345795;447.502141327623 430.990654205608;476.410064239829 262.766355140187;464.632762312634 213.700934579439;428.230192719486 145.943925233645;365.061027837259 134.261682242991;307.245182012848 152.953271028038;285.831905781585 193.841121495327];

axis([0 500 0 500])
axis equal
view([0 -90])

X=roi(:,1);
Y=roi(:,2);

[a b] = meshgrid(1:500);
inPoly1 = inpolygon(a,b,X,Y);
imagesc(inPoly1); 
line(X, Y,'Color','r'); 

for k = 1:25:500
    x = [1 500];
    y = [k k];
    plot(x,y,'Color','w','LineStyle','-');
    plot(x,y,'Color','k','LineStyle',':');
end

for k = 1:25:500
    x = [k k];
    y = [1 500];
    plot(x,y,'Color','w','LineStyle','-');
    plot(x,y,'Color','k','LineStyle',':');
end

此代码段也可用于生成上面的图像。但这没有用。我希望能够以同样的方式使用通用nxn网格单元格。

我有一个天真的想法,我将形成所有四边形的Matlab单元格,然后对它们进行条件检查,并使用fill命令将它们作为多边形着色。有没有更好,更简单的方法,所以我必须尽可能少地重新发明轮子?如果您的建议是我应该继续这个想法,那么您能否建议一种方法以智能的方式形成所有这些四边形的Matlab单元?

我看到here,但这使用了我没有的Mapping工具箱。因此,如果有人可以在基本的matlab工具箱范围内进行建议,那么我们将非常感激。否则请建议python解决方案。如果很难提供代码片段,那么算法建议也会有所帮助。

1 个答案:

答案 0 :(得分:0)

您可以考虑使用fill命令,但如果可以,请尽量避免使用patchfill的问题在于,当格点数增加时,您将面临严重的性能问题。看看我在this question上提供的两个答案,看看如何使用条件着色。

我的建议是继续使用imagescinpolygon,并尝试对要在边界点阵点上应用的条件进行数字分类。

让我们计算落在多边形内的每个格子单元格的角点数,并将其称为w。我的着色条件是:

  • w == 0:黑色

  • w == 1:blue

  • w == 2:红色

  • w == 3:绿色

  • w == 4:黄色

所以我将myColors = [0 0 0; 0 0 1; 1 0 0; 0 1 0; 1 1 0];定义为我的色彩映射。这是我算w

的方式
X = [264; 208; 207; 76; 59; 201; 294; 448; 476; 465; 428; 365; 307; 286];
Y = [235; 221; 78; 67; 447; 454; 381; 431; 263; 214; 146; 134; 153; 194];
xl = 10; % xl is your lattice length
yl = 25; % yl is your lattice height
xv = 0:xl:500;
yv = 0:yl:500;
[a, b] = meshgrid(xv, yv);
v = inpolygon(a, b, X, Y);

% summing up 4 adjacent lattice points and decreasing lattice dimensions by 1:
w = v(1:end-1,1:end-1) + v(2:end,1:end-1) + v(1:end-1,2:end) + v(2:end,2:end);

% shifting the new lattice to the center of previous lattice: 
xw = xl/2:xl:500 - xl/2;
yw = yl/2:yl:500 - yl/2;

% plotting
myColors = [0 0 0; 0 0 1; 1 0 0; 0 1 0; 1 1 0];
colormap(myColors)
imagesc(xw, yw, w)
axis equal tight off

这就是结果:

enter image description here

请注意,我移动了格子。你应该将格子单元中心的坐标传递给imagesc,因此你需要进行半格子移位以从边界到中心(并且将大小减小到一行,减少一列,我在计算w)时做了。

另请注意,如果您只对边界单元格感兴趣,w > 0 & w < 4会将它们分开。