最近,我一直在使用matlab来运行粒子聚合模拟,我使用它绘制itnerface来表示每个粒子。因此,我将一些调整标记尺寸的代码放在一起,使其等于实际颗粒的直径 - 相对于窗口的纵横比等。嗯,如果我处理一个方域,这个效果很好;见下文。
正如您所看到的,标记的大小使得粒子将完美地彼此顶部沉淀。这是该图片的绘图代码:
%%Initial Plot at time t = 0 Along with Scaling in the Y-Direction
figure; h=scatter(Pos(1,:),Pos(2,:),6,jet(length(Pos(1,:))),'filled','MarkerEdgeColor','k','linewidth',1);
hold on
axis equal
axis ([0 dp 0 dp]*L*Scale)
currentunits = get(gca,'Units');
set(gca, 'Units', 'Points');
axpos = get(gca,'Position');
set(gca, 'Units', currentunits);
markerWidth = dp/diff(ylim)*axpos(4); % Calculate Marker width in points
set(h, 'SizeData', markerWidth^2)
好吧,我在模拟中添加了周期性边界条件,这意味着我可以将上面显示的窗口大小增加3倍,而无需额外的计算成本。所以,我想绘制一个3x1域(x基本上比域的y维长3倍)。然而,我正在适当地调整颗粒的尺寸,使得它们在y方向上适当地缩放,而且还沿着x方向接触。我想我可以使用某种宽高比代码来做到这一点,但我无法让它发挥作用。有任何想法吗?这是我提出的代码/结果:
%Plot all of the data
figure;
h=scatter(Pos(1,:),Pos(2,:),6,jet(length(Pos(1,:))),'filled','MarkerEdgeColor','k','linewidth',1);
hold on
axis equal
axis ([0 3*dp 0 3*dp]*L*Scale)
currentunits = get(gca,'Units');
set(gca, 'Units', 'Points');
axpos = get(gca,'Position');
set(gca, 'Units', currentunits);
markerWidth = dp/diff(ylim)*axpos(4); % Calculate Marker width in points
set(h, 'SizeData', (markerWidth)^2)
axis ([0 3*dp 0 dp]*L*Scale)
它产生以下结果,这显然是不正确的:(...
答案 0 :(得分:2)
您可以使用类似
的内容%cirlce def
circx = sin(linspace(0,2*pi,100));
circy = cos(linspace(0,2*pi,100));
%example data
[mgx mgy] = meshgrid(5:5:100, 5:5:100);
x = reshape(mgx,[],1); %circles centers x
y = reshape(mgy,[],1); %circles centers x
r = 2.5*rand(400,1); %radii
c = 250*rand(400,1); %colors
% draw
figure
hold on
for i=1:numel(x)
fill(r(i)*circx+x(i), r(i)*circy+y(i), c(i))
end
使所有几何数据都固定在坐标轴空间中。 示例输出为: