- 1 -
基于MATLAB的复杂线网作图算法研究
吴先强,李睿
华东交通大学电气与电子信息工程学院,南昌 (330013)
摘 要:MATLAB 提供了强大的作图功能,利用它很容易实现二维和三维甚至更高维数据
的可视化,但对于一些复杂的图形还是必须通过编写专门的程序才能实现。本文深入分析了
常见的复杂线网的构成特点,对不同类型的线网分别采用从整体出发考虑构造作图算法和从
构图基本单元出发构造作图算法的策略。文中给出了典型线网的作图源程序,经过相应的改
动,很容易解决类似的问题。
关键词:MATLAB,作图,复杂线网,柯克曲线
中图分类号:TP391 文献标志码:A
0. 引言
强大的绘图功能是MATLAB特点之一。MATLAB提供了一系列的绘图函数,用户不需
要过多考虑绘图细节,就可很容易的实现一维,二维甚至更高维数据的可视 化[1]。但是对
于一些复杂的图形,如本文研究的复杂线网图形,如三角网,正六边形网,柯克曲线等由很
多线段按一定规律构成的图形,直接推到它们的方程是很麻烦,甚至很困难的[2]。们可以从
另一个角度来考虑这些问题,把他们看做是由一些基本的元素——线段,简单多边形等按一
定规律组合而成,编写专用程序,实现它们的作图。
本文首先分析了基本构图单元的作图方法,这是复杂线网作图的基础。然后针对复杂线
网的特点,分别研究了从图形整体出发构造作图算法和从基本构图单元出发构造作图算法的
策略。
1. 基本构图单元的作图
在 MATLAB 中,line 命令实现直线段和折线段的作图,用它可以很容易的实现线段和
多变形这些基本构图单元的作图。
line命令的基本用法是 line(X,Y),当 X=[x1,x2],Y=[y1,y2]时,画出连接点(x1,y1)和
点(x2,y2)的直线段;X=[x1,x2,…,xN],Y=[y1,y2,…,yN]时,画出一次连接(x1,y1),
(x2,y2),…,(xN,yN)的折线段。
很明显,当 X=[x1,x2,…,xN,x1],Y=[y1,y2,…,yN,y1]时,将画出一个多边形。下面是画
任意的正多边形的源程序:
x=input('x=')
y=input('y=')
r=input('r=')
n=input('n=')
k=0:1:n
X=x+r.*cos(2*pi*k/n)
Y=y+r.*sin(2*pi*k/n)
line(X,Y)
其中(x,y)表示图形中心,r表示外接圆的半径,n表示边数。图 1是取 x=0,y=0,r=1,n=6
得到的图形。
- 2 -
图 1 正六边形
下文中将用 X,Y表示一个基本的构图单元。
2. 基本构图单元的基本操作实现
几何图形的合同变换是一种特殊的几何变换,平面上的合同变换可由三种基本的几何变
换——平移,旋转,反射——复合而成[3]。下面就
对这三种基本的几何变换做一个分析,并用计算机算法实现上文中的基本构图单元的三种基
本变换。
(一)平移变换
平移变换作用下,点坐标的数学表达式为:
byy
axx
+=
+=
'
'
(1)
实现平移变换的函数如下:
function [X1,Y1]=pingyi(X,Y,a,b)
%生成平移的构图基本单元;
X1=X+a;
Y1=Y+b;
(二)旋转变换
旋转变换作用下,点坐标的数学表达式为:
)cos()sin('
)sin()cos('
αα
αα
×+×=
×−×=
yxy
yxx
(2)
实现旋转变换的函数如下:
function [X1,Y1]=xuanzhuan(X,Y,a)
%生成旋转的构图基本单元;
X1=X.*cos(a)-Y.*sin(a)
Y1=X.*sin(a)+Y.*cos(a)
(三)反射变换
反射变换作用下,点坐标的数学表达式为:
yy
xx
−=
=
'
'
(3)
实现反射变换的函数如下:
function [X1,Y1]=fanshe(X,Y,a)
%生成反射的构图基本单元;
X1=X
Y1=-Y
- 3 -
3. 适于从基本线段出发考虑的作图问题
三角形网,平行四边形网等线网图形,它们的构成线段的端点的规律比较简单,具有这
样特点的线网从整体出发去画图是比较方便的。
n层的三角形网可以看成是由一个大三角形和平行于一条边的三组平行直线段构成,而
这些线段的端点都是很容易由大三角形的边长确定的。这这种观点指导下写出的源程序如
下:
n=input('n=')
tri=[0 n *n 0;...
0 0 *n 0]
line(tri(1,:),tri(2,:))
for k=1:n-1
line([*k *k],...
[*k *k])
end
for l=1:n-1
line([*l l],[*l 0])
end
for m=1:n-1
line([m *(n+m)],...
[0 *(n-m)])
end
图 2 平面正三角形网
程序中 n表示小三角形的层数,图 2是取 n=2时的输出结果。
4. 适于从基本构成单元出发考虑的作图问题
有些图形如正六边形网,柯克曲线,若从基础构成线段出发,则这些基本线段的端点分
布规律会很复杂,但若从基本构造单元出发,把整个图形看做是大量基本构成单元按规律组
合的,则基本单元与组合规律都是比较简单的了,容易用算法实现。
由基元图形平移后组合而成的线网
文[2]中求出了平面正六边形网的方程式,但求解过程比较复杂,也不易用程序实现。
现在换个角度看这个问题,我们把它看做是有很多基元正六边形构成(这个基本图形的作图
在前文已给出算法),则这些基元正六边形的中点的分布规律是很简单的,它们分布在一个
平面四边形网的交叉点上,整个图形可以看做是由基元正六边形平移后组合形成的。由此可
以得到以下的作图程序:
x=input('x=')
- 4 -
y=input('y=')
r=input('r=')
n=input('n=')
m=input('m=')
axis_x(1,:)=x+*r*([1:m]-1)
for j=2:n
axis_x(j,:)=axis_x(1,:)
end
axis_y(1,:)=y+*r*([1:m]-1)
for k=2:n
axis_y(k,:)=axis_y(k-1,:)+*r
end
for kk=1:m*n
six_cell=six_ang(axis_x(kk),...
axis_y(kk),r)
line(six_cell(1,:),six_cell(2,:))
end
function six_array=six_ang(x,y,r)
%生成基元正六边形;
c=
six_array=[*r x+*r x+r ...
x+*r *r x-r *r;...
y-c*r y-c*r y y+c*r y+c*r y y-c*r ]
其中 n,m表示该网中基元正六边形的列数和行数。图 3是 n=5,m=8时的输出结果。
图 3 平面正六边形网
由基元图形平移和旋转后组合而成的线网
柯克曲线是分形中常见的一种曲线,它与传统几何学研究的简单形状由本质上的区别
[3]。由柯克曲线可以组成非常优美的雪花形状曲线。根据柯克曲线的定义,它是按下述过程
形成的:先做一条线段 E0,以该线段中间三分之一的线段为底做正三角形,并除去底(保
留端点)得到图形 E1;对 E1的每条边重复上述过程,得到 E2…,称 n→∞时得到的曲线 E
为柯克曲线。由于计算机的分辨能力是有限的,我们对有限的 n做出图形。
与上述正六边形网不同的是,这里的 En不能看做基本单元的平移叠加。不过,从微观
的角度分析 En,我们可以把 En看做是 En-1经过旋转和平移后组合而成的。这样的知道观
- 5 -
点下编写的源程序如下:
a=1
cell=[ 0 a a+a*cos(pi/3) 2*a 3*a ;...
0,0,sin(pi/3), 0, 0 ]
chongshu=input('重数=')
k=1
a=3*a
while k<chongshu
siz=size(cell)
len=siz(2)
cell_1=cell
cell_2=shangxie(cell,a)
cell_3=xiaxie(cell,a)
cell_4=pingyi(cell,a)
cell(:,[1:len])=cell_1
cell(:,[len+1:2*len])=cell_2
cell(:,[2*len+1:3*len])=cell_3
cell(:,[3*len+1:4*len])=cell_4
k=k+1
a=3*a
end
figure
line(cell(1,:),cell(2,:))
function cell_3=xiaxie(cell,a)
%生成下斜的一支;
cell_3(1,:)=cell(1,:).*cos(pi/3)...
+cell(2,:).*sin(pi/3)+*a
cell_3(2,:)=-cell(1,:).*sin(pi/3)...
+cell(2,:).*cos(pi/3)+*a/2
function cell_2=shangxie(cell,a)
%生成上斜的一支;
cell_2(1,:)=cell(1,:).*cos(pi/3)...
-cell(2,:).*sin(pi/3)+a
cell_2(2,:)=cell(1,:).*sin(pi/3)...
+cell(2,:).*cos(pi/3)
function cell_4=pingyi(cell,a)
%生成平移的一支;
cell_4(1,:)=cell(1,:)+2*a
cell_4(2,:)=cell(2,:)
图 4显示了 E1,E3,E8的作图结果。
- 6 -
图 4 柯克曲线
在上述基础上,通过平移,旋转,反射三种基本操作,很容易由相应的柯克曲线得到雪
花形状曲线,如下图 5所示。
5. 结论
本文首先分析了在MATLAB中复杂线网基本构图单元线段与多边形的表达方法,以及
对图形进行三种基本变换的实现途径。在此基础上,
图 5 雪花形状曲线
针对具体复杂线网的不同特征,研究了从图形整体出发构造作图算法的策略;以及从图形基
本构图单元出发,由基本单元反复经三种基本操作构造作图算法的策略。
应用上述结论实现具体实现了三角网,正六边形网和柯克曲线的作图,经过相应的改动,
很容易实现类似图形的MATLAB作图。
参考文献
[1] 张志涌, 徐彦琴, 等. .MATLAB教程[M]. 北京: 北京航空航天大学出版社, 2003.
[2]黄翊恒. 平面正六边形之无穷网方程式[J].