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()
,使 X
和 Y
值完全包含水箱和进气口的所有部分。你的最后一行看起来不错。
接下来,您必须创建一个大小为 X
(或 Y
)的额外掩蔽矩阵,以跟踪每个坐标点是否是您坦克的一部分。
tankMask = zeros(size(X));
现在只需遍历 X
和 Y
的元素并将 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
向量。
此方法效率不高,并且随着网格尺寸变小,运行 会出现问题。这只是一种快速而肮脏的方法。如果你需要一个非常精细的网格,你会想要一个更精细的方法。
编辑:我知道 看起来 y = 160
沿线的点包含在水箱中(以及 x = 30
处的进气口),但那是只是网格大小(10 个单位间距)和 3D 图的可视化方式的产物。
我整个周末都在尝试在 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 到水箱——连接到第一个的第二个矩形。
我已经尝试了 (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()
,使 X
和 Y
值完全包含水箱和进气口的所有部分。你的最后一行看起来不错。
接下来,您必须创建一个大小为 X
(或 Y
)的额外掩蔽矩阵,以跟踪每个坐标点是否是您坦克的一部分。
tankMask = zeros(size(X));
现在只需遍历 X
和 Y
的元素并将 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
向量。
此方法效率不高,并且随着网格尺寸变小,运行 会出现问题。这只是一种快速而肮脏的方法。如果你需要一个非常精细的网格,你会想要一个更精细的方法。
编辑:我知道 看起来 y = 160
沿线的点包含在水箱中(以及 x = 30
处的进气口),但那是只是网格大小(10 个单位间距)和 3D 图的可视化方式的产物。