一点感想,MATLAB用起来方便,关键还是要理解它的实质。
从图形学的角度,计算机画图,无非是画点,画线和画面,OpenGL就是基于点的图形库,它没有提供体的图元,构成体的实际上是体上的各个面,而面是由一些点和一种片型表达的,比如三角形片。
在MATLAB里,也可以这样类比,而且还要简化一些。只有两种,一是画线,一是画网格,也就是四边形片,即使这样表达一些复杂的几何形体也是很强大的。
1,画线
看成是画一维的形体。一维是指表现能力,比如画三维的线,同样还是画线。
比如我要画n维的线,就给出n个向量:
v1,v2,...vn
for i=1:m
{v1(i),v2(i),...vn(i)}就是这个线上一个离散化的点,前后用直线连起来就行了
在MATLAB里有plot和plot3,是同样的方法。
2,画网格
从直观上理解,一个面当然应该是3D的,它用一个离散的网格表示,网格里相邻的四个点构成一个四边形片,整个铺开就是曲面。
这时要给出3个矩阵:
xx,yy,zz
xx(i),yy(i),zz(i)就是网格上一个点的三维表示。
这里常用一个函数,meshgrid,就是生成两个网格的标准xx和yy分量。
比如:
>> x=[1 2 3 4]
x =
1 2 3 4
>> y=[1 2]
y =
1 2
>> [xx,yy]=meshgrid(x,y)
xx =
1 2 3 4
1 2 3 4
yy =
1 1 1 1
2 2 2 2
xx里一列是相等的,因为竖着方向上变,x值不变,同理yy里一行是相等的。再用它们构成同样size的zz,再用mesh(xx,yy,zz)就可以画出标准的曲面图了,一般这样的曲面只能是有z=z(x,y)的显式表达的方程,即一个曲顶梯形,但是这不能说mesh不能画其它复杂些的图形,比如球,它的曲面是相互包围的,只是那个时候就不能用meshgrid了,要想办法生成网格。
亲手画一个peaks曲面吧,和在MATLAB里键入peaks画出来的同样效果:
>> x=linspace(-3,3,40);
[xx,yy]=meshgrid(x,x);
zz=3*(1-xx).^2.*exp(-(xx.^2) - (yy+1).^2) ...
- 10*(xx/5 - xx.^3 - yy.^5).*exp(-xx.^2-yy.^2) ...
- 1/3*exp(-(xx+1).^2 - yy.^2);
surf(xx,yy,zz)
PS:[xx,yy]=meshgrid(x,x)这样的用法真爽,要是C++里可以这么用就好了,有时间写一个C++下的Matrix库玩玩吧。
评论