我花了整个周末试图在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);
这就是问题所在。现在我想在油箱上添加一个入口/管道 - 第二个矩形连接到第一个。 无论我做什么,都有"漏洞"在几何没有点的地方。此外,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)在制作之后连接网格,这只会给我带来网格大小不同的错误,因此无法连接。任何建议都会非常受欢迎。
答案 0 :(得分:1)
我认为你需要采取略微不同的方法。创建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图形的可视化方式。