Visual C++茱莉亚分形图形绘制
分形图形中的茹利亚julia集
分形图形中茹利亚集(2013-7-17)牛顿分形:在区域[ –2,2]2内确定40000个规则点(初值点),横坐标为实部,纵坐标为虚部,构造40000个复数。
分别以这些复数做迭代初始值,用牛顿迭代法求解方程:。
将收敛到三个根的初值点分别做三种色,称为牛顿分形图;将不收敛的初值点的集合称为Julia 集。
013=−z图1牛顿迭代法收敛域 图2 牛顿迭代法不收敛域在计算过程中使用向量化编程,将这40000个复数做为200阶的复方阵进行数据块迭代。
MATLAB 程序如下(文件名:newtonlab3)r1=1;r2=-(1+i*sqrt(3))/2;r3=conj(r2); %给出方程z 3– 1 = 0的三个根t=linspace(-2,2,200);[x,y]=meshgrid(t); %确定40000个网格点坐标Z=x+i*y;A0=ones(size(x)); %设置迭代初值及不收敛域矩阵A1=zeros(size(x));A2=A1;A3=A1; %设置收敛域矩阵for n=1:8Z=Z-(Z.^3-1)./(3*Z.^2+eps); %实现牛顿迭代endII=find(abs(Z-r1)<=.05);A1(II)=ones(size(Z(II))); %给第一收敛域矩阵赋值 II=find(abs(Z-r2)<=.05);A2(II)=ones(size(Z(II))); %给第二收敛域矩阵赋值 II=find(abs(Z-r3)<=.05);A3(II)=ones(size(Z(II))); %给第三收敛域矩阵赋值 A0=A0-A1-A2-A3;A=A0+2*A1+3*A2+4*A3; %给不收敛域矩阵赋值 figure(1),pcolor(x,y,A0),shading interp %绘Julia 图figure(2),pcolor(x,y,A),shading interp %绘收敛域图另两个图形是与混沌相关的分形图,一是Julia 图,二是Mandelbrot 图图3 Julia 图 图4 Mandelbrot 图 Julia 图的出现是为了研究计算格式的迭代行为,其中,。
分形图_Visual C++简单步骤
dx=cx+cos(alpha+PI/3)*l; dy=cy+sin(alpha+PI/3)*l; Fractal(cx,cy,dx,dy); Fractal(dx,dy,ex,ey); } }
执行可左击上图左边的按钮,或者Ctrl+F5.
结语: 照此,就可以依葫芦画瓢,作出许多漂亮的分行图来。等有一定
经验,想对MFC有更多了解,便可读侯Sir的书了。 附:幾張漂亮的分形圖
5
驅動與控制實踐訓練____分形圖篇___Visual C++(by Mr.He)
上圖有“上帝的指紋”美稱
6
驅動與控制實踐訓練____分形圖篇___Visual C++(by Mr.He) 7
3
驅動與控制實踐訓練____分形圖篇___Visual C++(by Mr.He)
最后,还要在OnDraw(CDC*pDC)函数体中加上一句: Fractal(10,300,790,300);如下:
4.可以编译和执行了
4
Байду номын сангаас
驅動與控制實踐訓練____分形圖篇___Visual C++(by Mr.He)
驅動與控制實踐訓練____分形圖篇___Visual C++(by Mr.He) 8
2.文件>>新建>>项目,选择 MFC 应用程序,项目名称填 Koch(实例为 koch 曲线)。弹出以下对话框:
分形之Julia集及其算法实现
如果 ,则在复Z平面上迭代结果 ;那么,零是 的吸引子。复平面上所有与该吸引子相距小于1的点,都产生趋向吸引子的序列。
如果 ,则在复Z平面上迭代结果 ;那么,无穷是 的吸引子。复平面上所有与零点的距离超过1的点,都产生趋向无穷的序列。
如果 ,则 ;那么,产生的序列总出现在上面两个吸引区域之间的边界上。此时,边界恰为复平面上的单位圆周 ,就是Julia集。
pDC->SetPixel(m,n,m_pColor);
wx=x-cx;
wy=y-cy;
if(wx>0)
theta=atan(wy/wx);
if(wx<0)
theta=PI+atan(wy/wx);
if(wx==0)
theta=PI/2;
theta=theta/2;
r=sqrt(wx*wx+wy*wy);
//TODO: add draw code for native data here
float k;
for(i=0;i<32000;i++)
{
m=(int)(2000/15*x+3500/15);
n=(int)(2000/15*y+3000/15);
if(i>10)
//CClientDC pDC(this);
k=0;
loop1:
xk=x0*x0-y0*y0+p;
yk=2*x0*y0+q;
k=k+1;
r=xk*xk+yk*yk;
x0=xk;
y0=yk;
if(r>m)
{
H=k;
分形的Mathematica实现
分形的Mathematica实现【内容提要】本文主要叙述了分形的发展史和分形中的两类图形Mandelbrot集和Julia集及他们的Mathematica实现。
第一部分为分形的发展史,着重叙述分形的几何特征。
第二部分着重叙述Mandelbrot集和Julia集,以及Mathematica程序设计、运行结果。
【关键词】分形,Mandelbrot集,Julia集。
分形是自然界的几何学。
——Mandelbrot(分形理论创始人)一、分形的发展史1.1分形概念的提出与分形理论的建立分形在英文中为fractal,由美籍数学家Mandelbrot创造出来的,源于拉丁文(形容词)fractus,(动词)frangere它与英文的fraction(碎片)及fragment(碎片)具有相同的根。
在20世纪70年代中期以前,Mandelbrot一直使用英文fractional一词来表示他的分形思想,因此,取拉丁词之头,撷英文之尾所合成的fractal ,本意是不规则、破碎的、分数的。
Mandelbrot是想用此词描述自然界中传统欧氏几何学不能描述的一大类复杂无规的几何对象,例如:蜿蜒曲折的海岸线,起伏不定的山脉,粗糙不堪的断面,变幻无常的浮云。
它们的特点:极不规则或极不光滑。
1975年,Mandelbrot出版了他的法文专著《分形对象:形、机遇与维数》,标志着分形理论正式诞生。
1977年,他又出版了该书的英译本。
1982年Mandelbrot的另一历史著作《大自然的分形几何》与读者见面,该书虽然是前书的增补本,但在Mandelbrot看来却是分形理论的“宣言书”,而在分形迷的眼中,它无疑是一部“圣经”,该书从分形的角度考察了自然界中诸多现象,引起了学术界的广泛注意,Mandelbrot也因此一举成名。
1.2分形的几何特征Mandelbrot(1986年)曾经给分形下过这样一个定义:组成部分与整体部分以某种方式相似的形,也就是说:分形一般具有自相似性。
Julia集的分形特征及可视化
Julia集的分形特征及可视化分形是一种数学概念,指在自相似的基础上具有无限细节的形态。
而Julia集则是分形中的一种形式,以其美丽而复杂的图形而著称。
本文将介绍Julia集的分形特征以及如何进行可视化。
1. Julia集的定义和数学原理Julia集是由法国数学家Gaston Julia于20世纪初提出的,它属于复变函数的一种特殊表现形式。
对于复变函数f(z) = z^2 + c,其中z是复平面上的数值,c是一个常数。
Julia集就是将平面上的每个点代入该函数后,根据函数的迭代公式进行迭代。
如果点在迭代过程中趋于无穷大,则该点不属于Julia集;如果点在迭代过程中保持有限,则该点属于Julia集。
2. Julia集的分形特征Julia集的分形特征主要体现在其图形形态上。
对于不同的常数c,Julia集呈现出各种各样的形状,常常具有分支、层次分明的特点。
具体来说,Julia集的边界是由无数个自相似的小部分组成的,即边界上的任意一小段都可能与整个边界相似。
这种无限细节的结构使得Julia 集的形态异常复杂,充满了美感。
3. Julia集的可视化方法为了更好地理解和欣赏Julia集的分形特征,我们可以通过可视化方法将其呈现出来。
以下是两种常用的Julia集可视化方法:a. 色彩填充法:通过对Julia集中的每个点进行迭代计算,根据迭代的结果来为每个点上色。
根据迭代的次数,可以确定每个点的颜色深浅,从而呈现出Julia集图像的细节。
同时可以通过调整常数c的值来观察Julia集形态的变化。
b. 迭代绘制法:从画布的左上角开始,按照一定的步长遍历整个画布,对每个点进行迭代计算并绘制。
通过较小的步长和足够的迭代次数,可以绘制出更加精细的Julia集图像。
同时可以通过调整常数c的值来观察Julia集形态的变化。
4. Julia集的应用领域Julia集作为一种迷人的分形形式,已经在多个领域得到了广泛的应用和研究。
其中,数学、物理、计算机图形学等领域是主要的应用领域。
Mandelbrot集和Julia集的分形图之matlab实现
Mandelbrot集和Julia集的分形图之matlab实现基于逃逸时间算法1. Mandelbrot集function Mandelbrot(res,iter,xc,yc,xoom) %Mandelbrot% 党$是目标分辨率,iter是循环次数,(xc,yc)是图像中心,xoom是放大倍数x0=xc-2/xoom;x1=xc+2/xoom;y0=yc-2/xoom;y1=yc+2/xoom;x=linspace(x0,x1,res);y=linspace(y0,y1,res);[xx,yy]=meshgrid(x,y);z=xx+yy*1i;C=z;N=zeros(res,res); %初始化N,最终根据N,对各点进行染色tic %显示tic和toc间的程序运行时间for k=1:iterz = zJ2+C; %对空间上每点都进行迭代N(abs(z)>4)=k; %逃逸半径为4,诺某点逃逸,记录逃逸时间k,未逃逸则时间为0 z(abs(z)>4)=0;C(abs(z)>4)=0;endimshow(N,[]);toc end>>Mandelbrot(512,100,0,0,1)>>Mandelbrot(512,128,-1.478,0,300)2.Julia 集function Julia(c,res,iter,xc,yc,xoom)%Julia>%。
为参数,皿$是目标分辨率,iter是循环次数,(xc,yc)是图像中心,xoom是放大倍数x0=xc-2/xoom;x1=xc+2/xoom;y0=yc-2/xoom;y1=yc+2/xoom;x=linspace(x0,x1,res);y=linspace(y0,y1,res);[xx,yy]=meshgrid(x,y);z=xx+yy*1i;N=zeros(res,res);C=c*ones(res,res); for k=1:iter z=z.A2+C;N(abs(z)>2)=k;C(abs(z)>2)=0;z(abs(z)>2)=0; endcolormap jet ; image(x,y,N); axis square ; end上面两张图很好的反映分形的自相似性,右图是左图关于原点放大2000倍的情况。
在VisualC平台下绘制Julia集和实现扩散限制凝聚DLA的模拟
• 现在计算复平面上一点与它由 fc 迭代后生成 的点之间模的比值,我们以此来考察迭代 前后与原点的距离的关系,有:
fc(z) z2 c z c
z
z
z
• 若令 R max(2, c ) • 当 z R 时,可见:
fc(z) z 11 z
• 迭代后点的模是增大的,所以经过多次迭 代之后,有:
• 对于第一种情况,显然不在集合Ff 内,根据迭
代的次数,我们对该点进行编号。然后重新找 点迭代。
• 对于第二种其打印在屏幕 上,作为一组数据点。
接下来我们来看看具体的源代码
结果(用excel描点得出)
a=0,b=-1
a=0.11,b=0.66
fcn (z) (n )
• 那么也就是说集合Ff 内的点被包含在以原 点为中心,半径为 R max(2, c ) 的圆内。
V
W
现在我们仅考虑 c 2的情形。
• 我们对区域中每一个点进行N次迭代,则会出 现两种情况:
• 1.区域中的点经过迭代后,其模大于R(收敛半 径)。
• 2.区域中的点经过迭代后,其模小于或等于R。
Julia集
• 设 f 是阶数大于1的多项式,Ff 是表示复平 面上那些不趋于无穷的点的集合,即:
Ff z C | f n (z) 有界(n )
该集为相应于 f 的充满的Julia集,Ff 的边界称
为多项式 f 的Julia集,记为 J f 。
• 我们仅研究 fc (z) z2 c, z, c C, c a bi, a,b R. 的情况。
• 接着,凝结核所处的位置我们记为1,其他 位置记为0。
• 粒子在圆边界上随机产生后,向上、下、左 右四个方向做随机运动。
用Visual Basic绘制分形图
4 9
a 戈
,0 y
,6
,6 +-6 , y_ ,
然 后利 用 步骤 1 中的计算 关系 计算 出下一 级 新点 ( ,y 和 ( x d )并压 人 堆栈 . ) c) d, r , 3 给定 一个 小量 c当 (x b) c时, 压 人堆 栈 中的值 依次 释放 完 毕 , ) , b, y < 被 同时绘 制直 线段 ( a )一( x ∞, y b, )然后 程 序结 束 . ,
V 12 N . 0.9 。3
Sp 2 0 e.0 8
用 Vi a s s lBai 制分 形 图 u c绘
许绍元, 蒋新华, 丁立秋
( 北 煤 炭 师 范 学 院 数 学 科 学 学 院, 徽 淮 北 2 5 0 ) 淮 安 3 0 0
摘
要: 给出常见分 形图的构造规则, 并通过递归算 法或迭代 函数 系统算法用 Vsa B s 语 言程序实现 了它们 的生 i l ai u c
维普资讯
第2 9卷 第 3期
20 0 8年 9月
淮 北煤炭 师 范学 院 学报 ( 自然科 学版 )
Jun l f u ie C a Id s T ah r C l g N tr ce c ) o ra o a i ol n u t e ces ol e( a a S i e H b  ̄ e ul n
B c C l =vWht ’ 置 背 景 色 为 白色 ak o r b i 设 o e
C l cno(, 0 10 4 ) ’ 用 cno 子 程 序 过 程 al at O 4 ,0 , 0 调 r at r
以下 为生成 三分 C n r V sa B s 语 言源 代码 : a t 集 i l ai o u c
Julia分形与Java
齐齐哈尔大学综合实践题目Julia分形及其Java编程学院理学院专业班级信科121班学生姓名指导教师成绩Julia 分形及其Java 编程由于本学期分形学老师所讲分形主要是以MATLAB 为例,所画出的分形图像效果并不理想,尤其经过几次放大后图像就会失真。
而Java 在分形的应用上效果比MATLAB 好很多,因此下文主要介绍Julia 分形图,实例是以Java 为基础。
分形是近几十年发展起来的一门新的数学分支,它涉及的领域非常之广,有物理学、数学、化学、生物学、医学、地震学、地貌学、冶金学、材料学、哲学、经济学、社会学等等.分形的出现正在改变科学家观察自然界的传统方式,目前已对当今数学乃至整个科学界产生了巨大的影响.本文主要对分形几何中的四元数进行研究,运用四元数绘制二维和三维Mandelbrot 集和Julia 集,并用Java 语言编程实现.先后介绍了分形的产生、Mandelbrot 集和Julia 集、四元数分形和用四元数绘制三维Mandelbrot 集和Julia 集的数学理论,关键词:分形,四元数,Julia 集,Java 程序设计一、Mandelbrot 集与Julia 集1、 Mandelbrot 集1980年, Mandelbrot 给世人提供了一幅无与伦比的杰作: Mandelbrot 集.其创作过程如下:令c z z f +=2)(, 其中C c z ∈,,z 是复变量,c 是复常数.对变换f 施行逃逸时间法, 得到如下迭代公式[1]:pq n n c z z +=+21 (1.1)式中)0,0(0=z ,pq c 为计算机荧屏位于),(q p 位置的象素. 于是(1.1)式成了pq pq pq pq pq n c c c c c z z ++++++=+22222201)))))((((( (1.2)给定N 为一个正整数, 比如等于255. 当象素位于),(q p 且N n =时,n z 仍然小于预设的一个阈值K , 则在),(q p 位置着色为1(蓝色), 否则当N n <时, 已有K z n ≥, 则在),(q p 位置描色为n . 如此),(q p 遍历整个荧屏后, 便画出了一幅Mandelbrot 集. 该集合的坐标如图2-1所示.图2-1 Mandelbrot 集的坐标图为什么说Mandelbrot 集是分形呢? 实在是它的层层嵌套中有很多很多的自相似部分.部分经逐级放大后, 又出现了一个Mandelbrot 湖.经典的M-集是由映射c z +2得来, 人们自然会采用更多的函数, 从而得到各种各样的M-集, 又称广义M-集.c z z n n +=+cos 1;c e z z c n n ++=+)arcsin(21; c c z z n n ++=+)cosh arctan(81.2、 Julia 集Gaston Julia(1893-1978),法国数学家.1919年,他在第一次世界大战时受了伤,住院期间他潜心研究了迭代保角变换c z z n n +=+21. 这种复平面上的变换能生出一系列令人眼花缭乱的图形变化. 当时没有电子计算机,不能像现在那样把如此美妙绝论的图案奉献于世. 因此他的工作并不为世人重视.虽然产生Julia 集和Mandelbrot 集的变换都是3,2,1,0,21=+=+n c z z n n (1.3)但这里的常数c 却是任意复数, 变元0z 是计算机荧屏上的每个象素. 当0z 遍历象素),(q p 的所有点且对公式(1.3)运用逃逸时间法后, 便得到一幅Julia 集c J 了.令c= -0.65175; 0.41850;便得到 图2.2图2-2Julia 集(c= -0.65175; 0.41850;)由于Mandelbrot 集(有时简称其为M-集)和Julia 集都源于同一个变换, 因此它们之间必定有非常复杂的关系. 由于每一个常数 c 都对应一个c J , 而M-集上的每个点都是一个c , 所以M-集合的所有点就对应着数以万计的c J . 图2-3正显示了它们两者之间的这种关系. 看得出, 相近的c 值, 对应的c J 也就较为相似.图2-3 Mandelbrot 集和Julia 集从图2.3可以看出, 凡是M-集的边界点, 其对应的c J 就显有分枝状. 这里面有太多的奥妙.由于一幅Julia 集完全依赖于常数c , 所以我们常常把它简记为c J .图2-4 c 不同的Julia 集与M-集一样, Julia 集也有其广义集. 图2.4的四幅图分别对应于函数:1. )sin(cos sin 2z z c z =2. )cos(πz c z ⋅=3. πc z z z +⋅=cos )log(cosh4. πc z z z +⋅=cos )tanh(cos.二维Julia 集,用牛顿迭代算法方法进行图形绘制,绘制范围:5.1~5.1:-x 0.2~0.2:-yC= (0.67,0.48)绘制结果如图2-5所示:图2-5 二维Julia 集之二二、四元数分形与四元数Mandelbrot 集和Julia 集1、 四元数基本理论我们都熟悉平面上复数z , 其中bi a z +=, 而1-=i . 无疑, 十八世纪以前创立的复数是数学史上的一件大事. 那末是否有高维的复数呢? 所谓的超复数(hypercomplex 或supercomplex)是这样定义的:令ck bj ai w z +++=, 其中i 和k j ,都是虚数, 它们满足下述运算要求:11=-====-=-==-=-==ijk kk jj ii j ik i kj k ji j ki i jk k ij看得出, 它们的乘法满足交换律.两个超复数的乘法公式是:令 k z j y i x w h 11111+++=和k z j y i x w h 22222+++=.则+---=)(2121212121z z y y x x w w h h +--+i z y y z x w w x )(21212121 +-+-j z x y w x z w y )(21212121 kz w y x x y w z )(21212121+++其它运算法则就不再赘述.1843年, 爱尔兰数学家William R. Hamilton(哈密尔顿)发明了四元数(quaternion). 一个四元数q 的定义是这样的:zk yj xi w q +++= (2.1)其中z y x w ,,,是实数,k j i ,,是虚数, 且有1222-====ijk k j i (2.2)q 的模2222z y x w q +++=. (2.3)一个四元数Q 可以由平面上的两个复数v u ,来表示:⎥⎦⎤⎢⎣⎡-+-++=⎥⎦⎤⎢⎣⎡-=bi a di c di c bi a u v v u Q (2.4) 其中d c b a ,,,是实数.v u ,分别是复数v u ,的共轭.一个四元数也能用[]w z y x q ,,,= (2.5)来表示.一个平面上的复数由实部和虚部构成: bi a z +⋅=1, 一个四元数Q 同样也能由若干部分线性组合而成:zK yJ xI wU Q +++= (2.6)其中⎥⎦⎤⎢⎣⎡≡1001U (2.7)⎥⎦⎤⎢⎣⎡-≡i i I 00 (2.8) ⎥⎦⎤⎢⎣⎡-≡0110J (2.9) ⎥⎦⎤⎢⎣⎡≡00i i K (2.10) 于是U K J I -===222 (2.11)也就是说,K J I ,,是矩阵方程 U X -=2的解, 是负单位矩阵的平方根.一个四元数整系数基的线性组合也叫Hamilton 整数. 在4R 空间, 四元数的基是如下四个:⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=10000010001000011 (2.12) ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡--=0100100000010010i (2.13) ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡--=0001001001001000j (2.14) ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡--=0010000110000100k (2.15) 与超复数不同, 四元数的三个虚数之间的运算并不遵从乘法交换律, 其运算规则如下:k ji ij =-= (2.16) i kj j =-= (2.17) j ik ki =-= (2.18)看起来很象三维空间直角坐标系中三个单位向量k j i ,,的叉乘关系.设 zk yj xi w q +++=, 则其四元共轭为zk yj xi w q ---=.其加法遵从一般规律:k z z j y y i x x w w q q )()()()(2121212121+++++++=+.设],,,[],,,,[22221111z y x w q z y x w p ==, 其乘法服从)(21212121z z y y x x w w pq ---= i y z z y w x x w )(21212121-+++ j x z w y z x y w )(21212121++-+ kw z x y y x z w )(21212121+-++q 的模仍然遵从一般复数关系.)(q q q q q norm == (2.19)且等于公式(2.3).一个四元数可以写成一个数量加上一个向量).,(v w q=其中向量 [,,]v x y z =. 如此一来, 两个四元数的乘法就变得较为简单:),(),(221121v w v w q q⋅=),(2112212121v v v w v w v v w w⨯++⋅-= 四元数的除法也遵从复数关系qq qp q p p p p p ==-和1 从几何上来讲, 四元数代表着时间加三维空间. 如果固定实数w 为常数, 则这个四元数就是三维空间的一个变量.0)(lim=→qq f q2 四元数Mandelbrot 集和Julia 集记q 和c 为四元数, 按第二章中Mandelbrot 集的迭代法,2,1,0,21=+=+n c q q n n (2.20)就得到一幅3维四元数(把实数w 看作常数, 并认定其为第四维)Mandelbrot 集了.四元数Julia 集是4维空间中的Julia 集,同样使用公式,2,1,0,21=+=+n c q q n n其中),2,1,0( =n q n 和c 都是四元数. 生成四元数Julia 集的方法与普通复数情况类似,只需迭代公式(2.20), 只是c 是一个固定的四元数而已. 迭代时要观察 ||n q 的敛散情况.把第四维看作时间,可以认为我们生成的是一个三维动画片. 实际操作时,一般取第四维为常数,这样我们得到的是静止的三维图像. 程序主体结构与二维情况也类似,我们用多重循环扫描一个三维立方体内部所有的点,就知道该点是否属于Julia 集了. 做法如下: 对每一个y对每一个 x 对每一个z作迭代,2,1,0,21=+=+n c q q n n其中],,,0[n n n n z y x q =. 当M n =时, n q 仍属于集合的话就退出这一层循环我们并不计算z 轴方向上的所有点,那样速度太慢. 对于给定的一组),(y x ,只要沿z 轴方向找到第一个属于Julia 集合的点就够了, 其它的点被挡住,让看不见. 这样,就大大提高程序的运行速度. 也有广义的四元数Julia 集. 不过由于以四元数为自变量的函数计算过于困难, 目前还仅仅处理q 的多项式.结 论在分形几何中,许多重要的分形是由迭代产生的.因为迭代可以使一些看似简单的函数产生惊人的复杂性,Julia 集就是其中一种.由于迭代函数的多样性,Julia 集可以在计算机图形工具的辅助下呈现为色彩斑斓、结构优美的分形图案,因此可广泛应用于纺织印染、广告设计、服装设计、装潢设计以及计算机美术教学等领域.可见,研究Julia 集的生成算法具有重要的理论意义和实际价值.逃逸时间算法是生成Julia 集的经典算法,它具有基本原理简单、绘图精度高、占用内存少等优点附:代码。
“Julia曲线”集合与分形图像的压缩编码
的 ‘ ( 个 灰度 ) . 值 整个 18 2 索的正方形 按 2 ×18象
上述方 法处 理 后 , 对 应 一 个 8×8象 素 的正 方 就
形, 本文 称 这个 8×8象 素的正 方形 为一个量 化的 “ui jl a曲线” 对“ui Jl a曲线 ” 一 种 方 式量 化 还 不 能 满 足 接 图像压 缩编 码 的要求 , 因此 , 当选 取多个适 当 的 应 整数 , 对每 个分 割后 的 1 ×1 素的小 正方形 的 6 6象 量化灰度 值 求 和后 除 以选 取 的多个 适 当的 整数 , 这样 , 条 “ua曲线 ” 得 到 了多 种 量化 形 式 . 一 Jl i 就 另 外 . 图像 进 行压 缩 编码 时再 附 加上 相应 的 区 对
它作为 8 ×8象 素正方 形 矩 阵 ( 称 为 图像 块 ) 或 上
逃逸 点集 合所构 成 的 . c充分大 时 , 当 可以证 明平 面上 的所 有 点都 是 逃 逸 的 点 因 此, c充 分 大 当 时 ,Jl “ui a曲线” 一 个 空集 合 . 据 这个 结 论 . 是 根 为 了用 “ui Jl a曲线” 匹配要 编 码的 图 像 , 去 仅需 要 考
平面 直角 坐标 系 的原 点 为 中 点, 两组 对边 分别 平 行于 坐标 轴 、 长 为 4的正方 形 中 的 点就 完全 可 连 以了 , 又根 据 Madlrt n e o 集与 “ui b Jl a曲线 ” 间的 之 关 系, 所要考 虑 的复 数 c的范 围还 可 以进 一 步地 缩小, 以减少可 能要 搜索 的 匹配范 围 .
初始化 每个 象 索 点 的值 为 0 如 果该 点 是 逃 .
经典Julia集和Mandelbrot集的几何画板画法
经典Julia 集和Mandelbrot 集的几何画板画法重庆市万州二中 向忠复平面内由二次函数2()f z z c =+构造的迭代点列 {}n z :10(),,1,2,3,n n z f z z z n −===能够生成分形图形。
当复数c 为定值(|c|<2,c ≠0)时,集合0{|{}}c n J z z =有界称为Julia 集;而对于复数z 为定值(通常z=0)时,集合{|{}}z n M c z =有界称为Mandelbrot 集。
在绘制Julia 集或Mandelbrot 集时,对于集合c J 或z M 外的元素,复数()n f z 的模可能趋于∞,这样在复平面相应位置处,图形将会出现空洞。
为使图形铺满整个画面,使分形图形更加清晰漂亮,我们常常采用逃逸时间算法作分形图。
设置一个区域A(通常设为圆|z|≤2),对于充分大的整数N ,当点0z 经过n+1次(n ≤N)迭代后的1n z +跳出了区域A(即1||2n z +>,我们就说点1n z +逃逸了),记录et 为n 的值;而如果点z 经过N 次迭代后的点仍未超出这个区域,就记录et 为N ,这个值et 就叫逃逸时间,而em=||et z 叫逃逸半径。
利用逃逸时间和逃逸半径关联着色参数对点0z 或c 着色,即能描绘出集合c J 或z M 的图形。
这就是逃逸时间算法的基本思想。
通俗的讲,经典Mandelbrot 集和Julia 集,就是将复平面内的圆|z|=2,通过逃逸时间算法下的迭代2z z +c →生成的复杂图形。
几何画板制作经典Mandelbrot 集和Julia 集的步骤:1.设置角度为弧度,作点z 、c 的横纵坐标:新建参数xz 、yz 、xc 、yc ;计算z 的模方||z||= xz*xz+yz*yz ;计算阈判断真值p=sgn(1-sgn(||z||-4));2.计算点z 在迭代2z z +c →下的象点Z 的横纵坐标:xZ=xz*xz-yz*yz+xc 、yZ=2xz*yz+yc;3.构建点z的逃逸变换点Z',即若点z在逃逸阈内,则p=1,点z变换为点Z';否则p=0,点z停止于z:计算Z'的横纵坐标:xZ'=xz+p*(xZ-xz)、yZ'=yz+p*(yZ-yz);4.为记录逃逸时间和逃逸半径,新建参数t0=0,计算t0+p;作点E(t0, ||z||);5.新建n=3,作{xz、yz、t0}→{xZ'、yZ'、t0+p}的深度为n的迭代,继而作点E的迭代象终点iE,并度量其横纵坐标et(逃逸时间)和em(逃逸半径);6.计算RGB着色参数:计算s=.05(et-log(.5abs(ln(em)))),R=sin(s),G=sin(3s),B=cos(2s);7.作点pixel,度量其横纵坐标x pixel、y pixel;对点pixel进行RGB着色并作颜色变换。
Julia分形-最新年精选文档
Julia分形Julia FractalsXING Yan1,HONG Pei-lin2(1.School of Science,Hefei Univesity of Technology,Hefei 230009,China;2.The 38th Research Institute of CETC,Hefei 230009,China):In recent years fractal theory and its construction methods have been attracting much attention. Julia sets are one of the most famous types of fractals using the nonlinear complex mapping f(z)=zm+c as the iteration function. The escape time algorithm is the familiar method of creating Julia sets. This paper first gives the steps of the escape time algorithm, then shows the experiment results of Julia sets for different parameters m and c . From the graphic examples, some features of the usual quadratic Julia sets (m=2) and generalized high-order Julia sets (m>2) are given.1 引言分形几何是研究和描述复杂曲线和图案的一种强有力的工具。
近年来,分形技术受到广泛重视,在数学、物理、化学、生物及计算机科学各领域都展开了分形理论、技术和应用的研究。
Visual+C图形图像编程之一基础知识及基本绘图方法
为抵色处理和明髟i黾莸取或设置此c珥如对橐的呈现原点。
获取或设置此&舳对象的呈理质量。
’
获取或设置与此G螂妇对象关联的文本的呈理簋式。
获取戚设置此c嘶对象的全局变换。
创建完Graphics实例后,就可以使用表02中的方法来绘制 线条和形状、呈现文本或显示与操作图像等。与Gmphics一起使
∥编穆龌
绘翻一系列莲接一组B“m结构的拽殷。
n“哳
n№hr咖 mⅢh岫
m—蛳
绘制矗-山mP址对象。 绘橱一十麝形.谈扇形自一十坐标对、宽度和高度以及两条射线所指 定的椭翟定艾。
绘制由一组胁结构定义的当边形。
绘橱由坐标对、宽度和高度指定的矩形。
绘村一系列自R刚-n出结构指定的矩形。 在指定位置并且用指定的Bn吐和F缸对象绘铜指定的文本宇符串。
或者: Rectang『e rc=new Rectang}e(10,10,250,150): LinearGrad{entBrush br=new LjnearGrad}entBrush (rc. COIOr BhJe.CoIor Black.LinearGrad}entMOde BackwardDiagonaI):
瓣牺娄器釜篡梦
ARGB属性及其说明: 每一种颜色都是color结构的成员,以下是使用color结构
的一种典型的方式:
pn.Color=Color.Red;
‘
5.字体(Font类)。 Font类用以定义特定的文本格式,包括字体、字号和字形属 性。初始化一个Font实例既可以使用指定的属性也可以使用已 经存在的Font实例和Fontstyle枚举来初始化新的F0nt实例。, 具体如下:
表3 Pen类的常用属性及其说明
属
分形图形中的茹利亚(julia)集
分形图形中茹利亚集(2013-7-17)牛顿分形:在区域[ –2,2]2内确定40000个规则点(初值点),横坐标为实部,纵坐标为虚部,构造40000个复数。
分别以这些复数做迭代初始值,用牛顿迭代法求解方程:。
将收敛到三个根的初值点分别做三种色,称为牛顿分形图;将不收敛的初值点的集合称为Julia 集。
013=−z图1牛顿迭代法收敛域 图2 牛顿迭代法不收敛域在计算过程中使用向量化编程,将这40000个复数做为200阶的复方阵进行数据块迭代。
MATLAB 程序如下(文件名:newtonlab3)r1=1;r2=-(1+i*sqrt(3))/2;r3=conj(r2); %给出方程z 3– 1 = 0的三个根t=linspace(-2,2,200);[x,y]=meshgrid(t); %确定40000个网格点坐标Z=x+i*y;A0=ones(size(x)); %设置迭代初值及不收敛域矩阵A1=zeros(size(x));A2=A1;A3=A1; %设置收敛域矩阵for n=1:8Z=Z-(Z.^3-1)./(3*Z.^2+eps); %实现牛顿迭代endII=find(abs(Z-r1)<=.05);A1(II)=ones(size(Z(II))); %给第一收敛域矩阵赋值 II=find(abs(Z-r2)<=.05);A2(II)=ones(size(Z(II))); %给第二收敛域矩阵赋值 II=find(abs(Z-r3)<=.05);A3(II)=ones(size(Z(II))); %给第三收敛域矩阵赋值 A0=A0-A1-A2-A3;A=A0+2*A1+3*A2+4*A3; %给不收敛域矩阵赋值 figure(1),pcolor(x,y,A0),shading interp %绘Julia 图figure(2),pcolor(x,y,A),shading interp %绘收敛域图另两个图形是与混沌相关的分形图,一是Julia 图,二是Mandelbrot 图图3 Julia 图 图4 Mandelbrot 图 Julia 图的出现是为了研究计算格式的迭代行为,其中,。
四元数Julia分形及其Java编程
北方民族大学学士学位论文论文题目:四元数Julia分形及其Java编程院(部)名称:信息与计算科学学院学生姓名:王江林专业:信息与计算科学学号:20040328指导教师姓名:李水根教授论文提交时间:2008年5月25日论文答辩时间:2008年5月31日学位授予时间:北方民族大学教务处制四元数Julia分形及其Java编程摘要分形是近几十年发展起来的一门新的数学分支,它涉及的领域非常之广,有物理学、数学、化学、生物学、医学、地震学、地貌学、冶金学、材料学、哲学、经济学、社会学等等.分形的出现正在改变科学家观察自然界的传统方式,目前已对当今数学乃至整个科学界产生了巨大的影响.本文主要对分形几何中的四元数进行研究,运用四元数绘制二维和三维Mandelbrot集和Julia集,并用Java语言编程实现.先后介绍了分形的产生、Mandelbrot集和Julia集、四元数分形和用四元数绘制三维Mandelbrot集和Julia 集的数学理论,为软件设计奠定了理论基础,使软件开发具有可行性.软件设计采用面向对象的程序设计方法,用UML对软件进行建模,建立了用例图和类图,用例图用来说明所开发的软件具的功能,类图提供了指导对象定义和使用的一些主要规则.再根据所建立的UML模型生成整个软件.本文的重点是把分形理论用于计算机实践,设计出分形软件,本软件的主要功能是用四元数绘制Julia集,由于Mandelbrot集和Julia非常相似,也有紧密的内在联系;二维与三维在理论和程序实现上都相差甚小.所以同时也实现了二维和三维Mandelbrot集和Julia集的绘制.最后给出软件的运行结果,包括软件的运行效果和绘制的一些分形图形.关键词:分形,四元数,Julia集,Java程序设计IQuaternion Julia Fractal and Java Program DesignAbstractThe Fractal is a new mathematics branch which develops for several decades, it involve of realm very it is wide, there is physics, mathematics, chemistry, biology, medical science, earthquake learn, the geography learn, the metallurgy learn, the material learn, philosophy, economics, sociology etc….The emergence of the Fractal is change the traditional way of the observation nature of scientist and have already been go to the whole science field to produce huge influence nowadays to mathematics currently.This text mainly carries on a research to Fractal several quaternions in and the usage quaternion draws two dimensions and 3D Mandelbrot Set and Julia to gather and counteract the Java language plait distance a realization.Creation, Mandelbrot Set and Julia which successively introduced a Fractal gather, quaternion Fractal with draw the mathematics theories that 3D Mandelbrot Set and Julia gather with the quaternion, lay theories foundation for the software design, make the software development have a possibility.The software design adoption faces to the program design method of object, use UML to carry on setting up a mold to the software, built up use case diagram and class diagram, the use case diagram uses to explain the software develop to have of function, the class diagram provided instruction object definition and use of some main rules.According to the UML model build up born whole software.The textual point useds for the calculator fulfillment to the Fractal theories, design a Fractal software, the main function of this software draws a Julia Set with the quaternion, because the Mandelbrot Set is very similar to the Julia, also is close insidecontact;Two-dimensional and 3D in carrying out the theories and the procedure all differ very small.So also carried out two dimensions and 3D Mandelbrot Set and Julia to gather in the meantime of draw.Finally give circulate of a software result, include the movement effect of software with draw of some Fractal sketches.Key Words:Fractal,quaternion,Java program designII目录摘要 (I)前言 (1)第一章早期数学怪物与分形几何 (2)1 Von Koch(冯.科克)曲线 (2)2 Sierpinski(希尔宾斯基)三角形 (4)3 Cantor(康托)集 (5)4 Mandelbrot和他的分形几何 (6)第二章 Mandelbrot集与Julia集 (8)1 Mandelbrot集 (8)2 Julia集 (9)第三章四元数分形与四元数Mandelbrot集和Julia集 (11)1 四元数基本理论 (11)2 四元数Mandelbrot集和Julia集 (14)第四章分形软件设计 (15)1 用例图 (15)2 类图 (16)3 关键算法 (20)4 软件运行结果 (27)5 绘制的部分图形 (30)结论 (37)致谢 (38)参考文献 (39)附录 (40)III图表目录图1-1冯.科克曲线 (2)图1-2 von Koch曲线 (3)图1-3 Sierpinski三角形 (4)图1-4 Cantor三分集 (5)图1-5 几何体与维数 (6)图2-1 Mandelbrot集的坐标图 (8)图2-2 Julia集(c=1.1) (9)图2-3 Mandelbrot集和Julia集 (10)图2-4 c不同的Julia集 (10)图4-1 用例图 (16)图4-2 类图 (17)图4-3 main包类图 (18)图4-4 iterator包类图 (19)图4-5 fractal包类图 (19)图4-6 util包类图 (20)图4-7 主程序运行结果 (28)图4-8 文件子菜单 (28)图4-9 大小子菜单 (29)图4-10 窗口布局 (29)图4-11 外观菜单 (29)图4-12 二维Mandelbrot集 (30)图4-13 二维Julia集之一 (30)图4-14 二维Julia集之二 (31)图4-15 三维Mandelbrot集之一 (31)图4-16三维Julia集之一 (32)图4-17 三维Julia集之二 (32)图4-18 三维Julia集之三 (33)图4-19 三维Julia集之四 (33)图4-20 三维Julia集之五 (34)图4-21 三维Julia集之六 (34)图4-22 三维Julia集之七 (35)图4-23 三维Julia集之八 (35)图4-24 三维Julia集之九 (36)图5-1 不好的三维Julia集 (37)IV四元数Julia分形及其Java编程前言长期以来,我们已经习惯了Euclid几何学中的各种图形,如线段、椭圆、双曲抛物面等等.然而大自然里的天然场景,如树木、群山、河流、湖泊等等,在Euclid 几何领域人们很难用数学语言精确的描述这些现象.20世纪80年代,分形几何学诞生,它给漫长的数学发展史又浓浓的描上了灿烂的一页.加上现代计算机技术的应用,研究上述这些现象的都不再成为难事.分形几何的曲线和曲面具有多姿荆棘的圆盘,弯曲缠绕的螺线和细丝,挂着微细颗粒的鳞茎,无尽的斑斓色彩,意料外的精细结构,处处显示出分形的奇特之美.分形几何学的经典图形之一Mandelbrot集被人们作为分形学和混沌学的国际标志出现在许多国际性论文集和刊物的封面上,成为了世界巡回展出的计算机艺术珍品.这种由数学的内在美变成人们视觉上的美,简直令人匪夷所思.分形几何诞生才不过20多年,但它对人类科学的影响是巨大的.卷入分形狂潮的除数学家和物理学家外,还有化学家、生物学家、地貌学和地震学家、材料科学家,甚至在社会科学和人文科学方面,大批哲学家、经济学家、金融学家乃至作家、画家和电影制作家都蜂拥而入.著名电影“星球大战”就是用分形技术创作的.分形图形学被认为描绘大自然景色最诱人的方法,谁不熟悉分形,就不能被认为他是科学上的文化人.在分形几何中,许多重要的分形是由迭代产生的.因为迭代可以使一些看似简单的函数产生惊人的复杂性,Julia集就是其中一种.由于迭代函数的多样性,Julia 集可以在计算机图形工具的辅助下呈现为色彩斑斓、结构优美的分形图案,因此可广泛应用于纺织印染、广告设计、服装设计、装潢设计以及计算机美术教学等领域.可见,研究Julia集的生成算法具有重要的理论意义和实际价值.逃逸时间算法是生成Julia集的经典算法,它具有基本原理简单、绘图精度高、占用内存少等优点.本软件利用计算机技术绘制Julia的分形图形,将四元数分形的内在美展现在人们眼前,同时也为进一步研究四元数分形随参数的变化提供了研究平台.很多文章中都提到了该算法,并给出其基本步骤,但却没有详细讨论该如何具体实现这些步骤,本文给出的绘制四元数Julia分形的基本步骤和具体实现.在附录中有本软件的源代码.1四元数Julia 分形及其Java 编程2第一章 早期数学怪物与分形几何自从两千多年前希腊人Euclid(欧几里得)创立了几何学以来,人们对某个数学集合,总是习惯于在Euclid 空间(n R , Euclidean )对其研究和对其度量,其中字母n 表示该空间的维数,通常它是一个整数. 对有限个点,取0=n ; 一条线段或一条平面上的曲线, 取1=n ; 一个有限平面, 取2=n ; 对有限的空间几何体,则取n 为3,同时也可分别得到它们的定常度量. 习惯上我们分别称它们为点的个数、线段的长度、平面图形的面积和立体的体积. 但在一个世纪以前,相继出现了一些被称之为数学怪物(Mathematical monsters)的东西,人们无法用传统的Euclid 几何语言去描述它们的局部和整体性质. 典型的数学怪物有以下几种.1 Von Koch(冯.科克)曲线自从有了函数曲线的连续与可微性质及其关系以后,是否存在一个处处连续而点点不可微的函数曲线成了研究的热门. 首先解决这个问题的是大数学家Weierstrass ,他于1872年设计了如下一个函数[1]∑∞==0)2cos()(k k k x b a x W π (1.1)图1.1为)(x W 在3,5.0==b a 时图像[1].图1-1冯.科克曲线其中b a <<<10,且1≥ab (见图1.1),Weierstrass 证明了对某些a 和b 的值,该函数无处可微. 1916年,Hardy 证明了对满足上列条件的所有a 和b 的值,)(x W 都是无处可微的.四元数Julia 分形及其Java 编程3)(x W 的缺点是极难绘画,故不够直观.到1904年,瑞典数学家von Koch 设计了一条被称之为Koch 曲线的图形,其设计步骤如下:设0E 为单位区间[]1,0,第一步,即1=n ,以0E 的中间三分之一线段为底,向上作一个等边三角形,然后去掉区间⎪⎭⎫⎝⎛32,31,得一条四折线段的多边形1E . 0E 是处处可微的,但1E 却有三点不可微. 第二步,即2=n ,对1E 的四条折线段重复上述过程,得一条十六折线段多边形2E ,它有15个不可微点.再重复上述过程,由n E 到1+n E ,当n 趋于无穷时,便得一条Koch 曲线,显然它是一条处处连续但是点点不可微的曲线[1].图1-2 Koch 曲线下面我们看看Koch 曲线在(1R ,Euclidean )中的长度是多少[1].显然,1)length(0=E , 34)length(1=E , ∞====∞→∞→n n n n E length E length E length )34(lim ))((lim )(,916)(2下面看看Koch 曲线的面积是多少[1]:先用一个三角形覆盖全部曲线, 由底长1, 高为63, 故该三角形面积为123.四元数Julia 分形及其Java 编程4接着对曲线的四小部分用四个三角形覆盖, 由于每边长度均为原三角形边长的三分之一,全部三角形面积为94123⨯. 又以边长再缩短31的16个小三角形去覆盖曲线的16个小部分, 全部面积应该是n⎪⎭⎫⎝⎛⨯94123.照次类推得von Koch 曲线的面积为094123lim =⎪⎭⎫⎝⎛⨯=∞→nn S .这样一来, von Koch 曲线在1维Euclid 空间的度量为∞,在(2R ,Euclidean )中,其面积为零. 换言之,Koch 曲线在传统的Euclid 几何领域不可度量.2 Sierpinski(希尔宾斯基)三角形由波兰数学家Sierpinski 命名的三角形,又称Sierpinski 筛,Sierpinski 垫片等等.令0S 为边长为1的等边三角形,第一步(1=n ),连结三条边的中点,得到四个全等三角形,去掉中间一个,保留其余三个,得1S .第二步(2=n ),对1S 的三个三角形重复刚才步骤,得2S ,它含有9个小三角形.如此重复上述步骤,得n S ,当∞→n 时,便得Sierpinski 三角形(见图1.3). 我们也来看看集合S 在(1R ,Euclidean )中的长度是多少.由于在∞→n 时,原先的黑色三角形变成了无穷个小点点,故每个小点的边缘长度之和∞=⎪⎭⎫⎝⎛⨯=∞→nn S length 233lim )(.在(2R ,Euclidean )中,0S 面积为43,以后每一步都是分4留3,所以Sierpinski 三角形的面积04343lim )(=⎪⎭⎫⎝⎛⨯=∞→nn S area ,同样地,在传统的Euclid 几何里,Sierpinski 三角形不可度量[1].图1-3 Sierpinski 三角形四元数Julia 分形及其Java 编程53 Cantor(康托)集记[]1,00=E ,第一步(1=n ),去掉中间三分之一,得⎥⎦⎤⎢⎣⎡⎥⎦⎤⎢⎣⎡=1,3231,01 E .第二步(2=n ),重复刚才步骤,得⎥⎦⎤⎢⎣⎡⎥⎦⎤⎢⎣⎡⎥⎦⎤⎢⎣⎡⎥⎦⎤⎢⎣⎡=1,9897,3231,9291,02 E .如此重复刚才一系列步骤,得n E ,当∞→n 时,得Cantor 集E (见图1.5) [1].图1-4 Cantor 三分集显然,Cantor 集有无数个点组成,在零维空间,其度量为无穷大.在一维空间,当其在第n 步时,共有n2个小区间,每个区间长度为n⎪⎭⎫⎝⎛31,所以032lim )(=⎪⎭⎫ ⎝⎛=∞→nn E length [1].要么为无穷大,要么为零,Cantor 集在Euclid 几何领域里也不可度量. 上述的三个怪物都是数学家的创造物,然而在自然界,同样有不可思议的现象存在.气象学家Richardson(理查森)(1881~1953) 在测量英国西海岸长度时,发现了一个规律:绘制地图的比例尺由大变小时,如由cm 1代表km 100减小到cm 1代表km 1时,海岸线长度却变得越来越长了.令a 为比例尺度(为1000,1000000等),S为海岸线长度,1S 为1000=a 时的长度,则英国西海岸长度S 的对数[1]a S S log 22.0log log 1-= (1.2)或22.011⎪⎭⎫⎝⎛=a S S . (1.3)这意味着,当a 减小到其231时,S 将增大一倍.按这个公式,海岸线长度实际上是不确定的.也就是说,自然界的某些现象(实际上是许许多多现象)是不能用Euclid 几何来描述的.4 Mandelbrot 和他的分形几何上述这些困惑数学家许多年的怪现象,终于在20世纪70年代被美国数学家B.Mandelbrot(曼德勃罗)彻底解决.在上面的叙述中,我们始终在Euclid 几何的整数维空间中讨论,那么为什么不允许有非整数维的几何存在呢[1]?实际上,若对长度为1的线段n 等分,每段线长为r ,则1=⋅r n (1.4)对面积为1的正方形作n 等分,每个小正方形的边长为r ,则12=⋅r n (1.5)对体积为1的正方体作n 等分,每个小正方体的边长为r ,则13=⋅r n (1.6)图1-5 几何体与维数上面三个等式中,r 的幂次实际上就是该几何体能得到定常度量的空间维数,于是我们有如下公式1=⋅D r n两边取对数,我们得到空间维数D 的表达式:rn D ln ln -= (1.7) 对Koch 曲线而言,在第n 步时,其等长折线段总数为n 4,每段长度为n⎪⎭⎫ ⎝⎛31,于是Koch 曲线的维数D 应为26186.13ln 4ln 31ln 4ln ≈=⎪⎭⎫ ⎝⎛-=n nD . 对Sierpinski 三角形,在第n 步时,所有全等三角形的边数为13+n 个,每边长度为n ⎪⎭⎫ ⎝⎛21,所以Sierpinski 三角形的维数为 58496.12ln 3ln ≈=D . 对于Cantor 集,在第n 步时,原先的单位线段被分成了等长的n 2段,每段长度为n⎪⎭⎫ ⎝⎛31,故其维数 63093.03ln 2ln ≈=D . Mandelbrot 在对这些数学怪物及许多物理现象进行研究后,终于创立了这门重要学科——分形几何(Fractal Geometry ).应该说,到目前还未有严格的定义.我们不妨引用K.Falconner 对分形集合F 的描述:1)F 具有精细的结构,即是说在任意小的尺度之下,它总有复杂的细节; 2)F 是如此地不规则,以至它的整体和局部都不能用传统的几何语言来描述; 3)F 通常具有某种自相似性,这种自相似性可以是近似的,也可能是统计意义上的;4)F 在某种意义下的分形维数通常都大于它的拓扑维数;5)在多数令人感兴趣的情形下,F 以非常简单的方法定义,可以用递归过程产生.第二章 Mandelbrot 集与Julia 集1 Mandelbrot 集1980年, Mandelbrot 给世人提供了一幅无与伦比的杰作: Mandelbrot 集.其创作过程如下:令c z z f +=2)(, 其中C c z ∈,,z 是复变量,c 是复常数.对变换f 施行逃逸时间法, 得到如下迭代公式[1]:pq n n c z z +=+21 (2.1)式中)0,0(0=z ,pq c 为计算机荧屏位于),(q p 位置的象素. 于是(2.1)式成了pq pq pq pq pq n c c c c c z z ++++++=+22222201)))))((((( (2.2) 给定N 为一个正整数, 比如等于255. 当象素位于),(q p 且N n =时,n z 仍然小于预设的一个阈值K , 则在),(q p 位置着色为1(蓝色), 否则当N n <时, 已有K z n ≥, 则在),(q p 位置描色为n . 如此),(q p 遍历整个荧屏后, 便画出了一幅Mandelbrot 集. 该集合的坐标如图2-1所示.图2-1 Mandelbrot 集的坐标图为什么说Mandelbrot 集是分形呢? 实在是它的层层嵌套中有很多很多的自相似部分.部分经逐级放大后, 又出现了一个Mandelbrot 湖.经典的M-集是由映射c z +2得来, 人们自然会采用更多的函数, 从而得到各种各样的M-集, 又称广义M-集.c z z n n +=+cos 1;c e z z c n n ++=+)arcsin(21;c c z z n n ++=+)cosh arctan(81.2 Julia 集Gaston Julia(1893-1978),法国数学家.1919年,他在第一次世界大战时受了伤,住院期间他潜心研究了迭代保角变换c z z n n +=+21. 这种复平面上的变换能生出一系列令人眼花缭乱的图形变化. 当时没有电子计算机,不能象现在那样把如此美妙绝论的图案奉献于世. 因此他的工作并不为世人重视.虽然产生Julia 集和Mandelbrot 集的变换都是[1]3,2,1,0,21=+=+n c z z n n (2.3)但这里的常数c 却是任意复数, 变元0z 是计算机荧屏上的每个象素. 当0z 遍历象素),(q p 的所有点且对公式(2.3)运用逃逸时间法后, 便得到一幅Julia 集c J 了.令1.1=c , 便得到 图2.19图2-2 Julia 集(c=1.1)由于Mandelbrot 集(有时简称其为M-集)和Julia 集都源于同一个变换, 因此它们之间必定有非常复杂的关系. 由于每一个常数 c 都对应一个c J , 而M-集上的每个点都是一个c , 所以M-集合的所有点就对应着数以万计的c J . 图2-3正显示了它们两者之间的这种关系. 看得出, 相近的c 值, 对应的c J 也就较为相似.图2-3 Mandelbrot 集和Julia 集从图2.20可以看出, 凡是M-集的边界点, 其对应的c J 就显有分枝状. 这里面有太多的奥妙.由于一幅Julia 集完全依赖于常数c , 所以我们常常把它简记为c J .图2-4 c 不同的Julia 集与M-集一样, Julia 集也有其广义集. 图2.24的四幅图分别对应于函数: 1. )sin(cos sin 2z z c z = 2. )cos(πz c z ⋅=3. πc z z z +⋅=cos )log(cosh4. πc z z z +⋅=cos )tanh(cos.第三章 四元数分形与四元数Mandelbrot 集和Julia 集 1 四元数基本理论我们都熟悉平面上复数z , 其中bi a z +=, 而1-=i . 无疑, 十八世纪以前创立的复数是数学史上的一件大事. 那末是否有高维的复数呢? 所谓的超复数(hypercomplex 或supercomplex)是这样定义的:令ck bj ai w z +++=, 其中i 和k j ,都是虚数, 它们满足下述运算要求[2]:11=-====-=-==-=-==ijk kk jj ii jik i kj k ji jki i jk k ij看得出, 它们的乘法满足交换律.两个超复数的乘法公式是:令 k z j y i x w h 11111+++=和k z j y i x w h 22222+++=.则[2] +---=)(2121212121z z y y x x w w h h +--+i z y y z x w w x )(21212121+-+-j z x y w x z w y )(21212121kz w y x x y w z )(21212121+++ 其它运算法则就不再赘述.1843年, 爱尔兰数学家William R. Hamilton(哈密尔顿)发明了四元数(quaternion). 一个四元数q 的定义是这样的:zk yj xi w q +++= (3.1)其中z y x w ,,,是实数,k j i ,,是虚数, 且有1222-====ijk k j i (3.2)q 的模 2222z y x w q +++=. (3.3)一个四元数Q 可以由平面上的两个复数v u ,来表示:⎥⎦⎤⎢⎣⎡-+-++=⎥⎦⎤⎢⎣⎡-=bi a di c di c bi a u v v u Q (3.4) 其中d c b a ,,,是实数.v u ,分别是复数v u ,的共轭.一个四元数也能用[]w z y x q ,,,= (3.5)来表示.一个平面上的复数由实部和虚部构成: bi a z +⋅=1, 一个四元数Q 同样也能由若干部分线性组合而成[2]:zK yJ xI wU Q +++= (3.6)其中⎥⎦⎤⎢⎣⎡≡1001U (3.7) ⎥⎦⎤⎢⎣⎡-≡i i I 00 (3.8) ⎥⎦⎤⎢⎣⎡-≡0110J (3.9) ⎥⎦⎤⎢⎣⎡≡00i i K (3.10) 于是U K J I -===222 (3.11)也就是说,K J I ,,是矩阵方程 U X -=2的解, 是负单位矩阵的平方根.一个四元数整系数基的线性组合也叫Hamilton 整数. 在4R 空间, 四元数的基是如下四个:⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=10000010001000011 (3.12) ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡--=0100100000010010i (3.13) ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡--=0001001001001000j (3.14)⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡--=0010000110000100k (3.15) 与超复数不同, 四元数的三个虚数之间的运算并不遵从乘法交换律, 其运算规则如下:k ji ij =-= (3.16)i kj j =-= (3.17)j ik ki =-= (3.18)看起来很象三维空间直角坐标系中三个单位向量k j i ,,的叉乘关系.设 zk yj xi w q +++=, 则其四元共轭为zk yj xi w q ---=.其加法遵从一般规律[2]:k z z j y y i x x w w q q )()()()(2121212121+++++++=+.设],,,[],,,,[22221111z y x w q z y x w p ==, 其乘法服从[2])(21212121z z y y x x w w pq ---=i y z z y w x x w )(21212121-+++j x z w y z x y w )(21212121++-+k w z x y y x z w )(21212121+-++q 的模仍然遵从一般复数关系[2].)(q q q q q norm == (3.19)且等于公式(3.3).一个四元数可以写成一个数量加上一个向量).,(v w q =其中向量 [,,]v x y z = . 如此一来, 两个四元数的乘法就变得较为简单[2]:),(),(221121v w v w q q⋅= ),(2112212121v v v w v w v v w w⨯++⋅-=四元数的除法也遵从复数关系q q qp q pp p p p ==-和1从几何上来讲, 四元数代表着时间加三维空间. 如果固定实数w 为常数, 则这个四元数就是三维空间的一个变量.0)(lim 0=→q q f q2 四元数Mandelbrot 集和Julia 集记q 和c 为四元数, 按第二章中Mandelbrot 集的迭代法[2],2,1,0,21=+=+n c q q n n (3.20)就得到一幅3维四元数(把实数w 看作常数, 并认定其为第四维)Mandelbrot 集了.四元数Julia 集是4维空间中的Julia 集,同样使用公式[2],2,1,0,21=+=+n c q q n n其中),2,1,0( =n q n 和c 都是四元数. 生成四元数Julia 集的方法与普通复数情况类似,只需迭代公式(3.20), 只是c 是一个固定的四元数而已. 迭代时要观察 ||n q 的敛散情况.把第四维看作时间,可以认为我们生成的是一个三维动画片. 实际操作时, 一般取第四维为常数,这样我们得到的是静止的三维图像. 程序主体结构与二维情况也类似,我们用多重循环扫描一个三维立方体内部所有的点,就知道该点是否属于Julia 集了. 做法如下:对每一个y对每一个 x对每一个z 作迭代,2,1,0,21=+=+n c q q n n其中],,,0[n n n n z y x q =. 当M n =时, n q 仍属于集合的话就退出这一层循环我们并不计算z 轴方向上的所有点,那样速度太慢. 对于给定的一组),(y x ,只要沿z 轴方向找到第一个属于Julia 集合的点就够了, 其它的点被挡住,让看不见. 这样,就大大提高程序的运行速度. 也有广义的四元数Julia 集. 不过由于以四元数为自变量的函数计算过于困难, 目前还仅仅处理q 的多项式.第四章分形软件设计本软件采用Java语言实现,Java语言具有跨平台的特性,可在多个操作平台上运行,使用程序能在多个平台运行.Java是面向对象的程序设计语言,因此在软件设计时应该采用面向对象的程序设计方法,由于本软件的规模较小,所要实现的功能明确等特点,因此采用UML对软件进行建模.一方面本软件的全部代码由我一人写,不存在与其他人员的交流问题;另一方面,用例较少、每个用例的描述脚本(一般用活动图)简单;加之写本软件的时间所限,所以在设计时只设计了用例图和类图.由于二维和三维的Mandelbrot集和Julia集都是由迭代函数c=2产生的,z+z不同的是绘制图形时c是一个复数,绘制三维图形是c是一个四元数,所以它们之间有很多共性.不论是复数还是四元数,它们都都加、减、乘、除,所以我们先抽象出一个Number接口类,再分别建立Complex类和FourNumber类,在迭代方法只要实现对接口Number迭代,就可以分别应用于对复数类Complex和四元数FourNumber的迭代.Mandelbrot集和Julia集虽都是由迭代函数cz+=2产生,但zz和c的具体含意不一样,Mandelbrot集中的z是0点,c是迭代点的坐标,而在Julia集中z是迭代点的坐标,c是事先给定的一个常量,基于这些特点,利用面向对象的继承机制可以先把它们的共性提取出来,建立一个基类InteratorFractal,由于InteratorFractal并不是一个实际的东西,而是抽象出来,所以用建立成接口类更合理.因为在Java中实现接口的类必须实现接口中全部方法,然而实际中只很少量的不同,为了避免的每个类中都要写大量的代码,所以先建立的适配器InteratorFractalAdatper类,用于实现它们的共同特性,子类子实现自己特有的部分即可,在InteratorFractalAdatper类中提供一个抽象方法drawImagePoint(),用于绘制指定的点,子类中只用实现用来实现drawImagePoint()方法.1 用例图用例图(Use Case diagram)在UML中是非常独特的图形元素,它描述人们希望如何使用一个系统.用例图告诉我们谁是相关的用户,他们系统提供什么服务,以及他们需要为系统提供的服务.用例图是面向对象软件工程(OOSE)的关键元素,面向对象的方法也被称为Objectory(object factory的缩写).用例图是基于用例的方法的一部分,基于用例的方法还对用例的文本描述以及脚本.文本描述用来强调用例的需求细节,脚本则用来说明用例执行中的选项、测试需求以及为后续的开发提供较高层次的测试计划[3].图4-1是本软件的用例图,最为重要的是绘制图像用例,是本软件的核心功能,它能绘制四种类型的图形,分别是:二维Mandelbrot图、二维Julia图(用两种算法实现)、三维Mandelbrot图、三维Julia图.其他用例是一些辅助功能,使整个软件的可操作性更强,更加个性化.图4-1 用例图2 类图在面向对象的处理中,类图处于核心地位,它提供了指导对象定义和使用的一些主要规则.在提供所有这些规则的同时,类图还是前向工程(模型转化为代码)的主要资源,同时是逆向工程的生成物(将代码转化为模型).类的构成类图的基础,因此要使用类图,就需要了解类和对象之间的区别.类是对资源的定义,它所包含的信息主要用来描述某种类型实体的特征以及对该类型实体的使用方法.与类不同,对象遵守类制定的规则,但它是独一无二的具体的实体.从软件的角度来看,代码通常包含的是类的集合和类所定义的行为,而实际创建信息和管理信息的是遵守类的规则的对象.对象就是数据库中的行、文件中的记录或计算机中的内存块[3].本文的UML图用MagicDraw UML 12.5绘制.本软件的类图包括5个包,如图4-2所示,在类图中的对象之间的联系都给出的多重度.各包的主要实现的功能如下:com.wang.julia.main包:实现整个软件的图形界面和启动画面com.wang.jualia.util包:实现本软件用的数据结构com.wang.julia.fractal包:实现分形绘图算法com.wang.julia.iterator包:实现通用的迭代算法com.wang.julia.logger包:实现日志系统,用来记录整个软件的运行状态,并输出的日志文件中.图4-2 类图图4-3是com.wang.julia.main包的详细类图,com.wang.julia.main主要实现用户界面,实现对分形和绘制和显示,以下分别说明各个类的作用:Java3DJulia:实现用户主界面,包括菜单栏、工具栏、工作区和状态栏ToolsPanel:实现工具栏,是一些常用功能的快捷操作StatusBar:实现状态栏,用来记录当前绘图过程的状态StatusPanel:状态面板,用户显示指定的一个分形绘图的当前状态StartWindow:由于Java在启动时要加载大量的类,等全部加载完再显示,用户不知道程序是否在运行,为了让用户,所以先加载一个很小窗口类,而这个类用于显示当前Java类的加载情况,显示加载进度.图4-3 main包类图图4-4是com.wang.julia.iterator包的详细类图,com.wang.julia.iterator 包用来实现分形的迭代算法,我们知道有很多的迭代公式,最常用的就是多项迭代,也可三角函数迭代.Java的接口是对类的一组需求描述,这些类要遵从接口的统一格式进行定义,即定义与实现分离[3].如果我们要定义新迭代函数,只需实现IteratorFunction接口既可,无需修改程序的其他部分.由于本文只讨论多项式迭代,所以只实现多项式迭代,也就是类PolynomialIterator类.图4-5是com.wang.julia.fractal包的详细类图,com.wang.julia.fractal主要实现分形的迭代,跟com.wang.jualis.iterator包一样,先定义一个IteratorFractal接口,再定义一个适配器IteratorFractalAdapter类用来实现迭代分形的公共部分,Julia2D、Julia3D、Mandelbrot2D、Mandelbrot3D都对指定的点进行迭代,根据迭代结果来决定该点的绘制颜色.JuliaIFS是采用的牛顿迭代法生成的,用递归实现,适配器的drawImage()方法不适合,所以在JuliaIFS类中覆盖适配器中的drawImage()方法,实现自己的特性.。
[分形学] Julia Set (茱莉亚集) VC 源代码
关于Julia Set (茱莉亚集) 的介绍什么的我就不多说了,网上一大堆。
执行效果如图:关于Julia Set,可以通过设置复数c 的初值,显示出不同的图案,比如,大家可以试试以下几组:c.re = 0.45, c.im = -0.1428;c.re = 0.285, c.im = 0.01;c.re = 0.285, c.im = 0;c.re = -0.8, c.im = 0.156;c.re = -0.835, c.im = -0.2321;c.re = -0.70176, c.im = -0.3842;随便用哪行替换掉源程序中的“c.re = -0.75, c.im = 0;”就可以看到不同的图案了。
循环变量k 是迭代次数,在某些参数下需要高一些会更精细。
为了美观,还需要修改一下颜色部分,目前代码中的颜色是这样的:HSLtoRGB((float)((k<<5) % 360), 1.0, 0.5)这行代码中的k 的取值范围是0~180,将其映射到HSL 颜色空间中的色相上(360 度)。
全部代码如下:// 程序名称:分形学 - Julia Set (茱莉亚集)// 编译环境:Visual C++ 6.0,EasyX 2011惊蛰版// 最后更新:2010-9-9//#include <graphics.h>#include <conio.h>/////////////////////////////////////////////////// 定义复数及乘、加运算/////////////////////////////////////////////////// 定义复数struct COMPLEX{double re;double im;};// 定义复数“乘”运算COMPLEX operator * (COMPLEX a, COMPLEX b){COMPLEX c;c.re = a.re * b.re - a.im * b.im;c.im = a.im * b.re + a.re * b.im;return c;}// 定义复数“加”运算COMPLEX operator + (COMPLEX a, COMPLEX b){COMPLEX c;c.re = a.re + b.re;c.im = a.im + b.im;return c;}/////////////////////////////////////////////////// 主函数/////////////////////////////////////////////////void main(){// 初始化绘图窗口initgraph(640, 480);/////////////////////////////////////////////////// 绘制 Julia Set (茱莉亚集)/////////////////////////////////////////////////COMPLEX z, c;c.re = -0.75, c.im = 0; // 设置迭代初值int x, y, k; // 定义循环变量for(x = 0; x < 640; x++){for(y = 0; y < 480; y++){z.re = -1.6 + 3.2 * (x / 640.0);z.im = -1.2 + 2.4 * (y / 480.0);for(k = 0; k < 180; k++){if ( z.re * z.re + z.im * z.im > 4.0 ) break;z = z * z + c;}putpixel(x, y, (k >= 180) ? 0 : HSLtoRGB((float)((k << 5) % 360), 1.0, 0.5));}}// 按任意键退出getch();closegraph();}+1。
用Ultra Fractal制作简单的分形图片
用Ultra Fractal制作简单的分形图片
张静
【期刊名称】《《计算机光盘软件与应用:COMPUTER ARTS数码艺术》》【年(卷),期】2007(000)004
【摘要】1、键入Ctrl+N或点击,新建文件,选择Standard ufm→Phoenix (Julia),显示出最初由Shigehiro Ushiki根据Julia集合研究出的分形图。
【总页数】2页(P40-41)
【作者】张静
【作者单位】
【正文语种】中文
【中图分类】TP391.41
【相关文献】
1.用VB制作简单的动态图片显示 [J], 王昊艋
2.简单三步,在线制作三维图片 [J], 说好一辈子
3.Fractal Interpretation of Ultrasonic Crystallization of Solutions [J], Valery Katz;Slava Katz;
4.快速插入大量图片简单制作图片PPT [J],
5.化学中的分形(Fractals) [J], 赵华明;李后强
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MFC AppWizard(exe),在项目名称中键入 DrawJulial,按下 OK。
在 随 后 的 窗 口 中 选 择 Single Document, 选 中 Document/View architecture support,在语言中选中中文。
} void CBaseDraw::WMoveTo(double x,double y) {
XP1=x; YP1=y; WLineTo(x,y); } void CBaseDraw::WLineTo(double x,double y) { XP2=x; YP2=y; WClip(XP1,YP1,XP2,YP2); XP1=XP2; YP1=YP2; } void CBaseDraw::WClip(double X1,double Y1,double X2,double Y2) { enum {Empty,Left1,Right1,Bottom1,Top1} C,C1,C2; double X,Y; int XX1,YY1,XX2,YY2; C1=Empty;
switch(nColor) { case 1:
color=RGB(0,0,0); //黑 break; case 2: color=RGB(255,0,0); //红 break; case 3: color=RGB(0,255,0); //绿 break; case 4: color=RGB(0,0,255); //蓝 break; case 5: color=RGB(255,255,0); //黄 break; case 6: color=RGB(0,255,255); //浅蓝 break; case 7: color=RGB(170,0,255); //紫
C2=Empty; if(X1<WX1) C1=Left1; if(X1>WX2) C1=Right1; if(Y1<WY1) C1=Bottom1; if(Y1>WY2) C1=Top1; if(X2<WX1) C2=Left1; if(X2>WX2) C2=Right1; if(Y2<WY1) C2=Bottom1; if(Y2>WY2) C2=Top1; while((C1!=Empty)||(C2!=Empty)) {
color=RGB(0,0,0); //黑 break; case 2: color=RGB(255,0,0); //红 break; case 3: color=RGB(0,255,0); //绿
break; case 4:
color=RGB(0,0,255); //蓝 break; case 5: color=RGB(255,255,0); //黄 break; case 6: color=RGB(0,255,255); //浅蓝 break; case 7: color=RGB(170,0,255); //紫 break; case 8: color=RGB(188,145,71); //棕 break; case 9: color=RGB(182,182,182); //灰 break; case 10: color=RGB(255,193,183); //砖红 break;
DWORD dwTimeBegin,dwTimeEnd; dwTimeBegin=timeGetTime(); do {
dwTimeEnd=timeGetTime(); } while((dwTimeEnd-dwTimeBegin)<dwDelayTime); } void CBaseDraw::UserWindow(double F1,double F2,double F3,double F4,int nMove) { WX1=F1; WX2=F2; WY1=F3; WY2=F4; XRate=(MaxX-nMove*2)/(WX2-WX1); YRate=(MaxY-nMove*2)/(WY2-WY1); m_pDC->SetViewportOrg(nMove,nMove);
case 15: color=RGB(0,128,192); //暗蓝 break;
case 16: color=RGB(255,255,255); //白 break;
default: break;
} s_MyPen.CreatePen(PS_SOLID,1,color);
m_pOldPen=m_pDC->SelectObject(&s_MyPen); } void CBaseDraw::sleep(DWORD dwDelayTime) {
case 11: color=RGB(215,243,183); //草绿 break;
case 12: color=RGB(193,102,130); //赤红 break;
case 13: color=RGB(255,0,128); //洋红 break;
case 14: color=RGB(64,128,128); //深灰 break;
在 Step 2 of 6 窗口中不要数据库支持(None)。 在 Step 3 of 6 窗口中选中不要复合文档支持(None), 将 Automation 的 ActiveX Controls 选项都取消 在 Step 4 of 6 窗口中将默认选项中的 Printing and print preview 和 Docking toolbar 去除,接下 Next。 对 Step 5 of 6 窗口和 Step 6 of 6 窗口不作修改, 按下 Finish。 此时 VC 已经自动将我们想要的程序框架建立完毕。 然后将 VC 框架建立的菜单中的编辑菜单完全删去,将 文件菜单中除退出一项外全部删去,在查看后面加入一个菜 单项,去掉其 Pop-up 属性,命其 ID 号为 ID_DRAWJULIAL, Caption 为绘制茱莉亚图。 (2)定义消息映射函数 在 Class Wizard 中选择 Message Maps 栏,在 Class Name 栏 中 选 择 CDrawJulialView, 在 Object IDs 中 选 择
{ } void CBaseDraw::GetMaxX() {
CRect s_Rect; m_pDC->GetWindow()->GetClientRect(s_Rect); MaxX=s_Rect.right; } void CBaseDraw::GetMaxY() { CRect s_Rect; m_pDC->GetWindow()->GetClientRect(s_Rect); MaxY=s_Rect.bottom; } void CBaseDraw::Line(int x1,int y1,int x2,int y2) { m_pDC->MoveTo(x1,y1); m_pDC->LineTo(x2,y2); } COLORREF CBaseDraw::GetColor(int nColor) { COLORREF color;
void WClip(double X1,double Y1,double X2,double Y2);
void ShowError(); void sleep(DWORD dwDelayTime); COLORREF GetColor(int nColor); }; #endif
源程序 BaseDraw.cpp 代码如下: //BaseDraw.cpp: implementation of the CBaseDraw class. #include "stdafx.h" #include "BaseDraw.h" #include "mmsystem.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif //Construction/Destruction CBaseDraw::CBaseDraw() { } CBaseDraw::~CBaseDraw()
case 15: color=RGB(0,128,192); //暗蓝 break;
default: break;
} return (color); } void CBaseDraw::SetColor(int nColor) { s_MyPen.DeleteObject(); COLORREF color; switch(nColor) { case 1:
ID_DRAWJULIAL,为其 COMMAND 消息建立一个消息映射函数。 (3)建立代码 1.类 CBaseDraw 是一个基本的绘图函数,可以作为基
类使用。CJulial 类就是从 CBaseDraw 继承下来的类。由于 在 CBaseDraw 的 成 员 函 数 sleep 中 调 用 了 系 统 函 数 timeGetTime(),因此要做以下工作:
{ public:
CBaseDraw(); virtual ~CBaseDraw(); protected: CDC *m_pDC; CPen *m_pOldPen; CPen s_MyPen; int MaxX,MaxY; double WX1,WX2,WY1,WY2,XP1,YP1,XP2,YP2,XRate,YRate; protected: void GetMaxX(); void GetMaxY(); void SetColor(int nColor); void Line(int x1,int y1,int x2,int y2); void UserWindow(double F1,double F2,double F3,double F4,int nMove); void WMoveTo(double x,double y); void WLineTo(double x,double y); void lineto(int x,int y); void moveto(int x,int y);