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

2024-05-29 11:28:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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,但这使用了我没有的映射工具箱。因此,如果有人能在基本的matlab工具箱领域内提出建议,我们将不胜感激。其他请提供python解决方案。如果很难提供代码片段,算法建议也会很有帮助。在


Tags: 代码网格forplot条件多边形建议color
1条回答
网友
1楼 · 发布于 2024-05-29 11:28:03

您可以考虑使用fill命令,但是尽量避免使用它,如果可以的话使用^{}fill的问题是,当晶格点数增加时,您将面临严重的性能问题。看看我在this question上提供的两个答案,看看如何将它们与条件着色一起使用。在

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

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

  • w == 0:黑色

  • w == 1:蓝色

  • 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将它们分开。在

相关问题 更多 >

    热门问题