声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 17484|回复: 19

[编程技巧] 讨论: 关于如何画出自定义大小的网格

[复制链接]
发表于 2007-1-11 09:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我们知道,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 编辑 ]

评分

1

查看全部评分

回复
分享到:

使用道具 举报

发表于 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([k k ],[0 N],'g:');plot([0 N ],[k k],'g:');   
end
set(gca,'xtick',0:step:N); set(gca,'ytick',0:step:N);
hold off;

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

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

评分

1

查看全部评分

发表于 2007-1-11 13:39 | 显示全部楼层
第二种情形我还没有想到,不过先更正一下你的第一种情形,应该用以下代码实现:
  1. N=16;
  2. x=0:N;
  3. y=1:N+1;
  4. [X,Y]=meshgrid(x,y);
  5. plot(x,Y','b');
  6. hold on;
  7. plot(X,y,'b');
  8. hold off;
复制代码

[ 本帖最后由 ChaChing 于 2010-3-1 08:38 编辑 ]
发表于 2007-1-11 13:55 | 显示全部楼层
(x,y)坐标向量其实就放在 X,Y 对应的位置上(其中[X,Y]=meshgrid(x,y);),因此用以下代码就可以实现第二种情形:

  1. N=16; x=0:N; y=1:N+1;
  2. [X,Y]=meshgrid(x,y);
  3. figure; hold on;
  4. for i=1:N+1
  5.     A = X(i,:); B = Y(i,:); plot(A,B);
  6. end
  7. for i=1:N+1
  8.     A = X(:,i); B = Y(:,i); plot(A,B);
  9. end
复制代码

[ 本帖最后由 ChaChing 于 2010-3-1 08:39 编辑 ]
发表于 2007-1-11 14:11 | 显示全部楼层
eight 关于第二种情形的回答代码可以简化:(没必要要那两个循环!)
N=16;
x=0:N;
y=0:N;
[X,Y]=meshgrid(x,y);
figure;
hold on;
plot(X,Y,'b:');
plot(Y,X,'b:');
hold off;

评分

1

查看全部评分

发表于 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版主的意思用循环去连结各坐标点,这样比较清晰。如果不用循环,其实跟第一种情形是一样的,正确的写法应该是:

  1. N=16;
  2. x=0:N;
  3. y=1:N+1;
  4. [X,Y]=meshgrid(x,y);
  5. figure;
  6. hold on;
  7. plot(X,Y,'b');
  8. plot(X',Y','b');
  9. hold off;
复制代码

评分

1

查看全部评分

 楼主| 发表于 2007-1-11 18:42 | 显示全部楼层

回复

也许是我没有表达得很清楚,我说的第二种思路是指:不使用meshgrid命令,直接用循环生成x,y坐标向量,然后用plot(x,y)命令生成网格.
当然,更复杂的情形是生成三角、六角网格等等.
 楼主| 发表于 2007-1-11 19:05 | 显示全部楼层
采用meshgrid,我这里还有另外一种方法:
%%%%%%%%%%%%%%
N=16;
x=0:N;
y=0:N;
[X,Y]=meshgrid(x,y);
Z=zeros(length(x),length(y));
mesh(X,Y,Z)
axis equal
view(2)
%%%%%%%%%%%%%%%
但关键是第二种思路仍然不好实现,看来还得多想想.也希望能和大家继续讨论.
发表于 2007-1-11 19:29 | 显示全部楼层
原帖由 xjzuo 于 2007-1-11 18:42 发表
也许是我没有表达得很清楚,我说的第二种思路是指:不使用meshgrid命令,直接用循环生成x,y坐标向量,然后用plot(x,y)命令生成网格.
当然,更复杂的情形是生成三角、六角网格等等.



矩形的网格还是比较容易的,呵呵:
  1. N=16;
  2. x=0:N;
  3. y=1:N+1;
  4. X=repmat(x,length(x),1);
  5. Y=repmat(y',1,length(y));
  6. figure;
  7. hold on;
  8. plot(X,Y,'b');
  9. plot(X',Y','b');
复制代码
 楼主| 发表于 2007-1-11 19:34 | 显示全部楼层
上面eight的回复仍然等价于使用meshgrid.
我说的第二种思路是指:纯粹用循环生成x,y坐标向量.
这个问题还是要很费些脑筋的.

[ 本帖最后由 eight 于 2007-1-11 20:14 编辑 ]
发表于 2007-1-11 20:15 | 显示全部楼层
原帖由 xjzuo 于 2007-1-11 19:34 发表
上面eight的回复仍然等价于使用meshgrid.
我说的第二种思路是指:纯粹用循环生成x,y坐标向量.
这个问题还是要很费些脑筋的.



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

  1. N=5;
  2. A=ones(N);
  3. [X,Y]=find(A);
  4. X=X-1;
  5. Y=Y-1;
  6. figure;
  7. hold on;
  8. for i=1:N
  9.     plot(X((i-1)*N+1:i*N),Y((i-1)*N+1:i*N),'b');
  10. end
  11. for i=1:N
  12.     plot(Y((i-1)*N+1:i*N),X((i-1)*N+1:i*N),'b');
  13. end
复制代码
 楼主| 发表于 2007-1-11 21:25 | 显示全部楼层
谢谢eight的建议.不过,我本身并不是在做三角剖分.
我现在正研究一个大程序,其中涉及到生成各种网格,并进一步计算网格点上的各种序参值.
我采用Fortran已经基本可以解决该问题,只是其中涉及到较复杂的循环和很多GOTO语句.
后来我考虑用Matlab来实现及简化Fortran程序,所以发贴到论坛,希望集思广益,看看有没有更巧妙的方法来实现上述网格的生成,当然问题本身还涉及到较复杂的边界条件.
看来连最简单的正方网格,用Matlab来实现第二种思路也不是件容易的事情.
发表于 2007-5-5 20:01 | 显示全部楼层
三角形网格有现成命令delaunay:
  1. rand('state',0);
  2. x = rand(1,10);
  3. y = rand(1,10);
  4. TRI = delaunay(x,y);
  5. subplot(1,2,1),...
  6. triplot(TRI,x,y)
  7. axis([0 1 0 1]);
  8. hold on;
  9. plot(x,y,'or');
  10. hold off
复制代码

想和fortran混编的话感觉最好用相关算法自己另写一个,或者用f-mex。矩形和六角形MATLAB官方文件中无现成算法,否则其pde工具箱中就不会只有三角形网格了,猜测这种网格剖分问题是图论中点集拓扑的问题,不一定准确,仅供参考。

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

评分

1

查看全部评分

发表于 2007-6-21 20:22 | 显示全部楼层
你们讨论的三角网格划分太难了 对于我
问一个比较简单的问题:

怎样在坐标中画出一部分网格?(X从2:5,Y从2:5)
发表于 2007-6-21 20:48 | 显示全部楼层


这样吗?
  1. N=16;
  2. x=0:N;
  3. y=0:N;
  4. xx=2:5;
  5. yy=3:6;
  6. [X,Y]=meshgrid(xx,yy);
  7. plot(x,y,'r');
  8. hold on;
  9. plot(xx,Y','b');
  10. plot(X,yy,'b');
  11. hold off
复制代码

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-23 20:02 , Processed in 0.093291 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表