xjzuo 发表于 2007-1-11 09:12

讨论: 关于如何画出自定义大小的网格

我们知道,Matlab 中有个 grid命令可以画出网格,但是如果要自己编程,该如何实现呢?
我写了一段简单的代码,调节步长,可以达到任意控制网格大小:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
N=16; x=0:N; y=0:N;
M=meshgrid(x,y);
plot(x,M,'b'); hold on
plot(M,y,'b');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
不过,当我从另一个思路出发,却没能实现画出网格,即:当给定格子大小N时,如何生成“x,y坐标向量”,使得直接用plot(x,y)就可以画出网格,即网格是由一个一个点按顺序连接而形成的。
所以把问题发到论坛上,希望集思广益,如何进行合适的循环,才可以实现第二种情形。
欢迎大家踊跃讨论。

[ 本帖最后由 ChaChing 于 2010-3-1 08:40 编辑 ]

yukeyyxh 发表于 2007-1-11 13:16

i had a try ! but i did not know is it what you want !
and code is :

clc;clear;
%==========================
N=16; step=1;
figure;hold on;
for k=0:step:N   
   plot(,,'g:');plot(,,'g:');   
end
set(gca,'xtick',0:step:N); set(gca,'ytick',0:step:N);
hold off;

%===========================

[ 本帖最后由 ChaChing 于 2010-3-1 08:39 编辑 ]

eight 发表于 2007-1-11 13:39

第二种情形我还没有想到,不过先更正一下你的第一种情形,应该用以下代码实现:N=16;
x=0:N;
y=1:N+1;
=meshgrid(x,y);
plot(x,Y','b');
hold on;
plot(X,y,'b');
hold off;

[ 本帖最后由 ChaChing 于 2010-3-1 08:38 编辑 ]

eight 发表于 2007-1-11 13:55

(x,y)坐标向量其实就放在 X,Y 对应的位置上(其中=meshgrid(x,y);),因此用以下代码就可以实现第二种情形:
N=16; x=0:N; y=1:N+1;
=meshgrid(x,y);
figure; hold on;
for i=1:N+1
    A = X(i,:); B = Y(i,:); plot(A,B);
end
for i=1:N+1
    A = X(:,i); B = Y(:,i); plot(A,B);
end

[ 本帖最后由 ChaChing 于 2010-3-1 08:39 编辑 ]

yukeyyxh 发表于 2007-1-11 14:11

eight 关于第二种情形的回答代码可以简化:(没必要要那两个循环!)
N=16;
x=0:N;
y=0:N;
=meshgrid(x,y);
figure;
hold on;
plot(X,Y,'b:');
plot(Y,X,'b:');
hold off;

eight 发表于 2007-1-11 14:21

原帖由 yukeyyxh 于 2007-1-11 14:11 发表
eight 关于第二种情形的回答代码可以简化:(没必要要那两个循环!)
N=16;
x=0:N;
y=0:N;
=meshgrid(x,y);
figure;
hold on;
plot(X,Y,'b:');
plot(Y,X,'b:');
hold off;


谢谢!不过我是按照xjzuo版主的意思用循环去连结各坐标点,这样比较清晰。如果不用循环,其实跟第一种情形是一样的,正确的写法应该是:

N=16;
x=0:N;
y=1:N+1;
=meshgrid(x,y);
figure;
hold on;
plot(X,Y,'b');
plot(X',Y','b');
hold off;

xjzuo 发表于 2007-1-11 18:42

回复

也许是我没有表达得很清楚,我说的第二种思路是指:不使用meshgrid命令,直接用循环生成x,y坐标向量,然后用plot(x,y)命令生成网格.
当然,更复杂的情形是生成三角、六角网格等等.

xjzuo 发表于 2007-1-11 19:05

采用meshgrid,我这里还有另外一种方法:
%%%%%%%%%%%%%%
N=16;
x=0:N;
y=0:N;
=meshgrid(x,y);
Z=zeros(length(x),length(y));
mesh(X,Y,Z)
axis equal
view(2)
%%%%%%%%%%%%%%%
但关键是第二种思路仍然不好实现,看来还得多想想.也希望能和大家继续讨论.

eight 发表于 2007-1-11 19:29

原帖由 xjzuo 于 2007-1-11 18:42 发表
也许是我没有表达得很清楚,我说的第二种思路是指:不使用meshgrid命令,直接用循环生成x,y坐标向量,然后用plot(x,y)命令生成网格.
当然,更复杂的情形是生成三角、六角网格等等.


矩形的网格还是比较容易的,呵呵:
N=16;
x=0:N;
y=1:N+1;
X=repmat(x,length(x),1);
Y=repmat(y',1,length(y));
figure;
hold on;
plot(X,Y,'b');
plot(X',Y','b');

xjzuo 发表于 2007-1-11 19:34

上面eight的回复仍然等价于使用meshgrid.
我说的第二种思路是指:纯粹用循环生成x,y坐标向量.
这个问题还是要很费些脑筋的.

[ 本帖最后由 eight 于 2007-1-11 20:14 编辑 ]

eight 发表于 2007-1-11 20:15

原帖由 xjzuo 于 2007-1-11 19:34 发表
上面eight的回复仍然等价于使用meshgrid.
我说的第二种思路是指:纯粹用循环生成x,y坐标向量.
这个问题还是要很费些脑筋的.


对矩形的情形稍微想了一下,不知道以下代码能否满足你的要求,我觉得这个问题应该有人研究过,特别是研究偏微分方程的人(三角剖分他们一定熟悉),搜索一下其他论坛吧。

N=5;
A=ones(N);
=find(A);
X=X-1;
Y=Y-1;
figure;
hold on;
for i=1:N
    plot(X((i-1)*N+1:i*N),Y((i-1)*N+1:i*N),'b');
end
for i=1:N
    plot(Y((i-1)*N+1:i*N),X((i-1)*N+1:i*N),'b');
end

xjzuo 发表于 2007-1-11 21:25

谢谢eight的建议.不过,我本身并不是在做三角剖分.
我现在正研究一个大程序,其中涉及到生成各种网格,并进一步计算网格点上的各种序参值.
我采用Fortran已经基本可以解决该问题,只是其中涉及到较复杂的循环和很多GOTO语句.
后来我考虑用Matlab来实现及简化Fortran程序,所以发贴到论坛,希望集思广益,看看有没有更巧妙的方法来实现上述网格的生成,当然问题本身还涉及到较复杂的边界条件.
看来连最简单的正方网格,用Matlab来实现第二种思路也不是件容易的事情.

bainhome 发表于 2007-5-5 20:01

三角形网格有现成命令delaunay:rand('state',0);
x = rand(1,10);
y = rand(1,10);
TRI = delaunay(x,y);
subplot(1,2,1),...
triplot(TRI,x,y)
axis();
hold on;
plot(x,y,'or');
hold off
想和fortran混编的话感觉最好用相关算法自己另写一个,或者用f-mex。矩形和六角形MATLAB官方文件中无现成算法,否则其pde工具箱中就不会只有三角形网格了,猜测这种网格剖分问题是图论中点集拓扑的问题,不一定准确,仅供参考。

[ 本帖最后由 bainhome 于 2007-5-5 20:03 编辑 ]

lxq 发表于 2007-6-21 20:22

你们讨论的三角网格划分太难了 对于我
问一个比较简单的问题:

怎样在坐标中画出一部分网格?(X从2:5,Y从2:5)

eight 发表于 2007-6-21 20:48

原帖由 lxq 于 2007-6-21 20:22 发表 http://www.chinavib.com/forum/images/common/back.gif
你们讨论的三角网格划分太难了 对于我
问一个比较简单的问题:

怎样在坐标中画出一部分网格?(X从2:5,Y从2:5)

这样吗?
N=16;
x=0:N;
y=0:N;
xx=2:5;
yy=3:6;
=meshgrid(xx,yy);
plot(x,y,'r');
hold on;
plot(xx,Y','b');
plot(X,yy,'b');
hold off
页: [1] 2
查看完整版本: 讨论: 关于如何画出自定义大小的网格