Visual C++茱莉亚分形图形绘制

1.绘制茱莉亚图 (1)绘制窗口 首先在 VC 中建一个新的 Projects,选择项目类型为
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);
合集下载

分形图形中的茹利亚julia集

分形图形中的茹利亚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++简单步骤

分形图_Visual C++简单步骤
if((alpha>=0&&(ex-cx)<0)||(alpha<0&&(ex-cx)<0)) alpha=alpha+PI;
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集及其算法实现

分形之Julia集及其算法实现
例如取C=0+0i,则有以下情况发生:
如果 ,则在复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实现

分形的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集则是分形中的一种形式,以其美丽而复杂的图形而著称。

本文将介绍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实现

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绘制分形图

,6 。 y+。
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 如 果该 点 是 逃 .
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档