preface:
2010年11月开始跟师兄做图形学的研究。开始看图形学,看数值逼近,看微分几何。
1.数值逼近可以用matlab来做实验。
2.微分几何太抽象了,可以用matlab来画出图形看看。
3.正好师兄推荐用matlab先做些简单的图形实验。
所以这两天就用了下matlab, 下面记录一些个人认为比较有用的心得。
注释:%
块注释:
%{
注释语句(注意,'%{' 行后面与 '%}'行前面 都不能有其他字符)
%}
连接符: ...
如果一个语句在一行内书写太长了,要再下一行接着写,这时可以在上一行末尾打上半个省略号(...),然后再在下一行接着写。
比如,下面俩个语句是等价的:
x1 = 1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6;
和 x1 = 1 + 1/2 + 1/3 +...
1/4 + 1/5 + 1/6;
1.构造矩阵(数组)
x = [1 2 3]
x = [1 2 3; 4 5 6]
x = linspace(1,50) %创建100个(默认)元素的行向量,元素值依次从1~50
x = linspace(0,0,5) %创建5个元素都是0的行向量
x = [0:2:100] 或 x = 0:2:100
x = zeros(m,n) %创建m*n的全0矩阵
y = x(1:3 , 2:5) %y矩阵为取x矩阵的1~3行,2~5列的数据
y = x(:, 1:3) %y矩阵为取x矩阵1~3列的数据
2.矩阵运算
A*B 即矩阵乘法
A.*B 即矩阵对应元素相乘 (相应的,还有./等运算)
A' 即矩阵转置
inv(A) 即矩阵求逆
det(A) 即求方阵行列式
rank(A)即求矩阵的秩
3.参数曲线绘制 r(t)=(x(t), y(t), z(t))
eg:
4.参数曲面的绘制 z = f(x,y) 和 r(u,v) = (x(u,v), y(u,v), z(u,v))
eg:
==================================
5.关于 mesh 与 meshgrid (surf与mesh本质一样)
首先,mesh只能画四边形网格(要想画三角形网格、或者其他多边形网格,就得自己用plot3等等其他或一个叫patch的函数来画了)
其次,这是对help的补充,你还是先看看matlab的help文档吧。
meshgrid
用法:[X,Y]=meshgrid(x,y); [X,Y]=meshgrid(x); [X,Y,Z]=meshgrid(x,y,z);
最后一种暂时没用到,不管他;
第二种 [X,Y]=meshgrid(x) == meshgrid(x,x);
所以我们来了解第一种 [X,Y]=meshgrid(x,y);
该函数的作用是,将向量 x=[x1, x2, ... xn] 与 y=[y1, y2, ... ym] 转换成m*n的矩阵X,Y
其中,X的每行都是x, Y的每列都是y
即:
x1 x2 ... xn y1 y1 ...
X[m*n] = x1 x2 ... xn 与 Y[m*n]= y2 y2 ...
... ...
x1 x2 ... xn ym ym ...
这样的效果,等于在笛卡尔坐标中将XY平面用x,y网格化了。
然后只要再对应上每个 XY平面网格交点 对应的Z值,就能画出空间上的曲面网格了。
mesh
用法:mesh(X,Y,Z); mesh(x,y,Z); mesh(Z). 其中X Y Z都是m*n矩阵; x是n维向量,y是m维向量。
实际上, mesh(Z) = mesh(1:n, 1:m, Z);
mesh(x,y,Z) = [X,Y]=meshgrid(x,y) + mesh(X,Y,Z);
至于 mesh(X,Y,Z),
其实如上所述,就是先通过X,Y将笛卡尔坐标的XY平面网格化,然后对应上每个交点的Z轴值,就得到我们要的网格曲面了。
PS:如果X,Y是从meshgrid得到的,那么XY平面网格就是一个个矩形的网格。
但X,Y不一定都想meshgrid得到的一样,X的每行都是x,Y的每列都是y。 这时候,XY平面网格就未必是一个个矩形了,但当然仍是四边形。(通常,像4中参数表达书获得的XY就这样。)
6. 数据的保存与读取(save & load)
save:将工作空间的所有变数储存到名为matlab.mat的二进制档案。
save filename:将工作空间的所有变数储存到名为filename.mat的二进制档案。
save filename x y z :将变数x、y、z储存到名为filename.mat的二进制档案。
以二进制的方式储存变数,通常档案会比较小,而且在载入时速度较快,但是就无法用普通的文书软体(例如pe2或记事本)看到档案内容。若想看到档案内容,则必须加上-ascii选项。若非有特殊需要,我们应该尽量以二进制方式储存资料。
save filename x -ascii:将变数x存到名为filename的ASCII档案。
save filename -ascii:将所有变量存到名为filename的ASCII档案。但ascii文档无法区别各个变量。
=======================
load filename:load会寻找名称为filename.mat的档案,并以二进制格式载入。若找不到filename.mat,则寻找名称为filename的档案,并以ASCII格式载入。若以ASCII格式载入,则变数名称即为档案名称。
load filename -ascii:load会寻找名称为filename的档案,并以ASCII格式载入。
7. 用patch绘制
patch图形对象是由一个或多个多边形(连接或不连接的)