Matlab:如何通过连接两个不同大小的网格矩形(或两个不同尺寸的矩阵)来创建一个网格?

时间:2015-04-26 16:50:17

标签: matlab concatenation

我花了整个周末试图在Matlab中做一些看起来应该很简单的事情。我不是一位经验丰富的Matlab用户。我想计算通过坦克的流量。这需要我定义矩形几何(坦克),然后将其划分为单元格/元素(由x / y坐标组成的网格)。我可以做到这一点没问题:

Lx = 300;               % Geometry length in x direction
Ly = 150;               % Geometry length in y direction 
Nx = 10; Ny = Nx;       % Number of nodes in x and y direction
% Grid
x = linspace(0,Lx,Nx); y = linspace(0,Ly,Ny);
delta_x = Lx/(Nx-1); delta_y = Ly/(Ny-1); 

这就是问题所在。现在我想在油箱上添加一个入口/管道 - 第二个矩形连接到第一个。 Diagram of what I want无论我做什么,都有"漏洞"在几何没有点的地方。此外,y = 0时从不存在网格点,这是一个问题。

我已经尝试过(1)这个(下面),这会形成一个奇怪的复选标记形网格:

c = [0 150 150 0  ]; % x dimension of large tank  
d = [0 0   150 150]; % y dimension of large tank 

v = [0   20  0   20 ]; % x dimension of inlet   
w = [150 200 200 0];   % y dimension of inlet 

x = union(c(1,:), v(1,:));
y = union(d(1,:), w(1,:));
grid_val = 10;

figure('Color','w');  
[X,Y] = meshgrid(min(x):grid_val:max(x), min(y):grid_val:max(y));

我试过(2)简单地制作两个数组:所有x坐标中的一个和所有y坐标中的一个。两种方法都不起作用。最后,我尝试了(3)在制作之后连接网格,这只会给我带来网格大小不同的错误,因此无法连接。任何建议都会非常受欢迎。

1 个答案:

答案 0 :(得分:1)

我认为你需要采取略微不同的方法。创建meshgrid(),使XY值完全包含坦克和进气口的所有部分。你的最后一行似乎很好。

接下来,您必须创建一个大小为X(或Y)的额外遮罩矩阵,以跟踪每个坐标点是否属于您的坦克。

tankMask = zeros(size(X));

现在只需循环遍历XY的元素,并将tankMask的相应值设置为1,如果它是坦克的一部分并离开否则设置为0

您应该可以使用Matlab的inpolygon()来完成此任务:

for i = 1:numel(X)
    if inpolygon(X(i),Y(i),c,d) || inpolygon(X(i),Y(i),v,w)
        tankMask(i) = 1;
    end
end

现在,您仍然拥有所有这些网格点,但您还有一个掩码,告诉您每个X,Y值是否属于您的坦克。使用surf(X,Y,tankMask)验证这一点。

此外,我不确定您希望您的摄入量看起来如何,但这看起来更接近您的目标:

v = [0   0  20   20]; % x dimension of inlet   
w = [150 200 200 150];   % y dimension of inlet 

在这里,我使用所描述的面具和我建议的修改后的surf(X,Y, tankMask)v向量绘制了w

enter image description here

此方法效率不高,并且随着网格尺寸变小而遇到问题。这只是一种快速而肮脏的方法。如果你需要一个非常精细的网格,你需要一个更精确的方法。

编辑:我知道看起来就像y = 160中的点被包含在坦克中(以及x = 30的摄取量)但是这只是网格大小(10个单位间距)的工件以及3D图形的可视化方式。