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

Matlab: how can I create one grid by joining two gridded rectangles of different size (or two matrices with different dimensions)?

我整个周末都在尝试在 Matlab 中做一些看起来应该非常简单的事情。我不是经验丰富的 Matlab 用户。我想计算通过水箱的流量。这就需要我定义一个矩形几何体(水槽),然后把它分成cells/elements(一个由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); 

问题来了。现在我想添加一个 inlet/pipe 到水箱——连接到第一个的第二个矩形。 无论我做什么,几何中都有 "holes" 个没有点的地方。此外,沿 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) 在制作网格后连接它们,这只会给我错误提示,即网格大小不同,因此无法连接。非常欢迎任何建议。

我认为您需要在这里采取稍微不同的方法。创建 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),使用按照描述创建的掩码以及我建议的修改后的 vw 向量。

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

编辑:我知道 看起来 y = 160 沿线的点包含在水箱中(以及 x = 30 处的进气口),但那是只是网格大小(10 个单位间距)和 3D 图的可视化方式的产物。