有一个网格覆盖在多边形的顶部。为了使讨论具体,请假设如下图:
我有黄色多边形,我想覆盖网格,如图所示。我希望根据某些规则为网格单元着色。它们并不像将相交的细胞着色为红色和绿色一样简单。我想对每个网格单元格进行条件检查,然后根据结果对它们进行着色。我不知道如何表示网格单元格,然后继续对它们进行条件检查。这是我的第一个问题。这更像是一个数据结构问题。
接下来如果我知道哪些细胞会变成橙色,我该怎么做?这是一个图形问题。
我可以弄清楚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解决方案。如果很难提供代码片段,那么算法建议也会有所帮助。
答案 0 :(得分:0)
您可以考虑使用fill
命令,但如果可以,请尽量避免使用patch
。 fill
的问题在于,当格点数增加时,您将面临严重的性能问题。看看我在this question上提供的两个答案,看看如何使用条件着色。
我的建议是继续使用imagesc
和inpolygon
,并尝试对要在边界点阵点上应用的条件进行数字分类。
让我们计算落在多边形内的每个格子单元格的角点数,并将其称为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
这就是结果:
请注意,我移动了格子。你应该将格子单元中心的坐标传递给imagesc
,因此你需要进行半格子移位以从边界到中心(并且将大小减小到一行,减少一列,我在计算w
)时做了。
另请注意,如果您只对边界单元格感兴趣,w > 0 & w < 4
会将它们分开。