【问题标题】:Coloring cells of a grid overlaid on top of a polygon with different colors用不同颜色覆盖在多边形顶部的网格的着色单元
【发布时间】:2016-10-13 17:18:07
【问题描述】:

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

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

接下来,如果我知道哪些单元格要染成橙色,我该怎么做?这是一道图形题。

我可以弄清楚如何为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

这个代码sn-p也可以用来产生上面的图像。但这没有帮助。我希望能够以同样的方式处理一般的nxn 网格单元。

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

我看到了here,但这使用了我没有的映射工具箱。因此,如果有人可以在基本的 matlab 工具箱范围内提出建议,我们将不胜感激。否则请建议python解决方案。如果难以提供代码 sn-ps,算法建议也会有所帮助。

【问题讨论】:

    标签: python matlab


    【解决方案1】:

    您可以考虑使用fill 命令,但尽量避免使用patch,如果可以的话。 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
    

    结果如下:

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

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

    【讨论】:

    • 超级 +1 patch 小费!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2019-06-03
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多