首先要show一把这俩个集合的图片
很漂亮是吧~不过很遗憾这不是我做的,但本人还是有画比较简单的两个集合的图形,有待指教改进。不过在此之前应该先简单介绍一下这两个集合,Mandelbrot集是通过迭代方程Zn+1=(Zn)^2+Zc,其中数Zc=0,Zn是一个复数。我们定义Mandelbrot集是所有复数Zc的集合,这样当n趋于无穷时Zn是有限的,如果超过2, Zn不会是有限的。例如我们想要的颜色像素(-1,0.5),以Zc = -1 +0.5i和Z0= 0开始,则有:
Z1 = Z0^2+Zc = -1+0.5i;
Z2 = Z1^2+Zc = -0.25-0.5i;
Z3 = Z2^2+Zc = -1.1875+0.75i;
Z4 = Z3^2+Zc = -0.1529344-1.28125i;
Z5 = Z42+Zc = -2.61839+0.890381i;
``````
我们停在这里因为大小| Z5| = 2.76564> 2。我们得出这样的结论:这一点是无界的且迭代次数为5。然后我们再次重复整个过程的每个像素。而Julia集和Mandelbrot集是非常相似的因为所用的迭代方程为同一个Zn+1=(Zn)^2+Zc。然而,不同于上述的根据不同的Zc值绘制像素,我们假设Zc的所有像素是给定的常数,我们绘制不同的 。因此,这有无限的Julia集主要取决于你选择的Zc的取值。例如,我们想要的颜色像素(-1,0.5)的Julia集使用常数Zc = -1.125+0.25i,我们开始以Z0=-1+0.5i;
Z1 = Z02+Zc = -0.375-0.75i;
Z2 = Z12+Zc = -1.54688-0.8125i;
Z3 = Z22+Zc = -0.60767+2.26367i;
``````
我们停在这里,因为大小| Z3 | = 2.34381> 2。我们得出结论,这一点上是无限的和迭代n=3的基础上的像素.
以上的论断我们假设z=x+yi,可得两个集合均要求x^2+y^2<2^2,且对于Julia 集,固定Zc值,把复平面指定区域内的复数点作为初值Z0代入后,迭代过程Zn+1=Zn^2+Zc终止时的迭代次数;对于Mandelbrot 集,它表示固定Z0 值,把复平面指定区域内的复数点作为μ值代入后,迭代过程Zn+1=Zn^2+Zc终止时的迭代次数。写得比较简单,就一个JFrame界面和一个ActionListner监听器,界面部分就不拿出来了,下面是Julia集监听器部分代码
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
/**
* 监听器
* @author suer
*
*/
public class CJuliadrawListener implements ActionListener {
double p, q; //Zc=p+qi,p,q的值自己给定
Graphics g;
JFrame jf;
private final int MAX=255;//颜色数值的最大值
public CJuliadrawListener(Graphics g,JFrame jf){
this.g=g;
this.jf=jf;
}
public void actionPerformed(ActionEvent e){
String s=e.getActionCommand();
if(s.equals("p=-0.65175;q=0.41850")){
paint(g,-0.65175,0.41850);
}else if(s.equals("p=-0.46;q=0.57")){
paint(g,-0.46,0.57);
}else if(s.equals("p=-0.8;q=0.156")){
paint(g,-0.8,0.156);
}else if(s.equals("p=-0.835;q=-0.2321")){
paint(g,-0.835,-0.2321);
}else if(s.equals("p=0.285;q=0.01")){
paint(g,0.285,0.01);
}else if(s.equals("p=-0.70176;q=-0.3842")){
paint(g,-0.70176,-0.3842);
}
}
/**
* julia集的实部和虚部值的范围
* @param x0:初始的实部值
* @param y0:初始的虚部值
* @return:循环的参数
*/
public int cjulia(double x0,double y0){
double xk,yk;
int i;
for (i=0;i<100;i++) {
xk=x0*x0-y0*y0+p;
yk=2*x0*y0+q;
if (xk*xk+yk*yk>4) return i;
x0=xk;
y0=yk;
}
return i;
}
/**
* 由迭代产生的0.0到1.0的颜色值的方法
* @param x0:初始的实部值
* @param y0:初始的虚部值
* @param p:Zc的实部值
* @param q:Zc的虚部值
* @return:颜色参数
*/
private float punktfarbe(double x0, double y0,double p,double q){
double xk=0, yk=0;
int j = 0;
while((j<MAX)&&(yk*yk+xk*xk< 4.0)){
xk=x0*x0-y0*y0 + p;
yk=2.0*x0*y0 + q;
j++;
x0=xk;
y0=yk;
}
return (float)j/(float)MAX;
}
/**
* 绘制julia集的方法
* @param g:画布
* @param p:Zc的实部值
* @param q:Zc的虚部值
*/
public void paint (Graphics g,double p,double q) {
double reZ, imZ, ze0=0.0038;
//double reZ, imZ, ze0=0.0055;
int x, y;
imZ=-1.5;
for (y=0;y<700;y++) {
reZ=-1.5;
for (x=0;x<700;x++) {
if (cjulia(reZ,imZ)==100) {
// float s=punktfarbe(reZ,imZ,p,q);
// float b=1.0f-s*s;
// g.setColor(Color.getHSBColor(1,s,b));
// float h=punktfarbe(reZ,imZ,p,q);
// float b=1.0f-h*h;
// g.setColor(Color.getHSBColor(h,1,b));
// float b=punktfarbe(reZ,imZ,p,q);
// float h=1.0f-b*b;
// g.setColor(Color.getHSBColor(h,1,b));
float h=punktfarbe(reZ,imZ,p,q);
float s=1.0f-h*h;
g.setColor(Color.getHSBColor(h,s,1));
g.drawLine(x+75,y,x+75,y);
}
reZ=reZ+ze0;
}
imZ=imZ+ze0;
}
}
}
下面是Mandelbrot集的MouseListener监听器部分的代码
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
public class MandelbrotListener implements MouseListener {
private static final double max=1.5;//最大值
private static final double min=-1.5; //最小值
private static final int Colors=25; //颜色数 及增长数
private Graphics g;
private JFrame jf;
public MandelbrotListener(Graphics
g,JFrame jf){
this.g=g;
this.jf=jf;
}
public void mouseClicked(MouseEvent e){}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){
drawMandel(g);
}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public Color[] getColors(){return colors;}
/**
* 颜色设置,rgb的值按colors的数值增长
*/
private void makeColors(){
int maxRGB=255,r=0,g=0,b=0;
colors=new Color[Colors+1];
for(int i=0;i<Colors;i++){
colors[i]=new Color(r,g,b);
r+=Colors;
if(r>maxRGB){
r=0;g+=Colors;
if(g>maxRGB){
g=0;
b+=Colors;
}
if(b>maxRGB)
b=0;
}
}
colors[Colors]=Color.white;
}
private static Color[] colors;
/**
* 画mandelbrot集的方法,mandelbrot集要注意xstep,ystep,即发散的速度
* @param g:画布
*/
private void drawMandel(Graphics g){
double xstep,ystep,x,y; //xstep,ystep是x,y值每次增加的大小
int i,j,iteration,k=0;
double xk,yk,xh,yh,real,imag;;
xstep=0.0025;ystep=0.0035;
for(y=min,j=0;y<=max;y+=ystep,j++){
for(x=min,i=0;x<=max;x+=xstep,i++){
xk=x;
yk=y;
xh=yh=0.0;
for(iteration=0;iteration<Colors;iteration++){
real=xk+xh;
imag=yk+yh;
xh=real*real-imag*imag;
yh=2*real*imag;
if(xh*xh+yh*yh>4)
break;
}
makeColors();
g.setColor(colors[iteration]);
g.fillRect(i,j,1,1);
}
}
}
}
最后要说的是,分形不是几个集合就能代表的,而是一门学问,分形理论的应用也不是局限在画出漂亮的图形而是囊括了很多方面,从大分子到宇宙星系,从自然科学到社会科学,凡是具有自相似性的现象就有分形存在。分形有在物理学中的应用,比如在准晶态的扩散、薄膜的研究、高能粒子碰撞中的阵发现象等,在化学中的应用,例如多相催化体系、宏观化学动力学等,又如植物中树、枝、叶、茎、花、草、蕨、花椰菜等是自然界中最先被认知具有分形维数的物体,材料制备和材料断裂行为等研究,以及用于解释和分析复杂的天文、水文、地质、地理等领域。此外在经济管理学、计算机图形学、复杂产品的分形设计、有限元网格划分的递推模型、制造决策映射建模等方面也有应用。
分享到:
相关推荐
在计算机图形学和数学领域,Julia集和Mandelbrot集是两个非常著名的分形图形。它们由法国数学家Benoît Mandelbrot在20世纪80年代提出,成为了分形几何研究的标志性例子。MATLAB作为一种强大的数值计算和可视化工具...
本主题将深入探讨两个著名的分形集——Julia集和Mandelbrot集,以及如何通过算法生成它们。我们将讨论这些集合的基本原理、生成算法以及三维Mandelbrot集的实现。 首先,让我们了解什么是分形。分形是一种具有自...
本书共分为10章,每一章都深入浅出地介绍了分形理论的基本概念和应用。第1章主要介绍分形几何的基本概念和性质,以及分形之父Mandelbrot的生平和分形理论的创立过程。第2章详细介绍了分形维数的基本概念和计算方法。...
Mandelbrot集和Julia集是数学中的两个经典分形,它们在计算机图形学和艺术领域有着广泛的应用。这个压缩包文件包含了用C++语言编写的小程序,用于绘制和探索这两个神秘的集合。 首先,让我们深入了解Mandelbrot集。...
分形是一种在数学和艺术中具有广泛应用的几何形状,它们展现出自相似性和无限细节。其中,Julia集合是复平面上的一个点集,与著名的Mandelbrot集合有密切关系。本文将深入探讨如何使用C++编程语言来绘制Julia集合。 ...
Mandelbrot集和Julia集的自相似性体现在,无论放大多少倍,它们的局部结构都与整体保持相似,这是分形的基本特性之一。例如,通过调整`Julia`函数中的`xoom`参数,可以观察到图像在不同放大比例下的自相似性。 **...
标题中的“julia, mandelbrot, 分形树的matlab程序”表明这是一个关于使用MATLAB编程实现Julia集合、Mandelbrot集以及分形树的项目。MATLAB是一种广泛使用的数值计算和可视化软件,非常适合进行复杂数学图形的绘制,...
**基于MFC的Mandelbrot集和Julia集的画法** MFC(Microsoft Foundation Classes)是微软提供的一种C++类库,用于构建Windows应用程序,它为开发者提供了丰富的控件和界面元素,使得开发图形用户界面(GUI)变得更加...
通过分析和运行这些MATLAB脚本,我们可以深入理解Mandelbrot集和Julia集的生成原理,并欣赏到数学中的分形之美。这不仅是一个理论上的学习,也是对MATLAB编程和图像处理能力的实际锻炼。在实际应用中,分形理论被...
MANDELBROT集和JULIA集的分形图之MATLAB实现.doc
话不多说。详情参照我的帖子 ...随程序附带了几个小例子,可以把ini文件拖动进程序 就可以重现图片。然后用户可以生成对应的 较高像素数的图片,还可以选中抗锯齿,连续颜色等选项,增强图像的显示效果 ...
话不多说。详情参照我的帖子 http://blog.csdn.net/delacroix_xu/archive/2010/09/01/5854543.aspx 随程序附带了几个小例子,可以把ini文件拖动进程序 就可以重现图片。然后你们可以生成对应的 较高像素数的图片
总结来说,Mandelbrot集和Julia集的图像绘制涉及到复数运算、迭代算法、分形理论以及计算机图形学。通过编程,我们可以探索这些集合的美丽和复杂性,同时也深入理解分形几何和复数系统的性质。在VC++环境下,可以...
例如,开发者可能使用了迭代公式,如Julia集或 Mandelbrot集,来生成复杂的分形图案。这些集合通过复数运算和迭代过程产生,每个像素的位置对应着复平面上的一个点,经过多次迭代后,根据是否发散来决定颜色。 ...
话不多说。详情参照我的帖子 http://blog.csdn.net/delacroix_xu/archive/2010/09/01/5854543.aspx 随程序附带了几个小例子,可以把ini文件 最新改动 支持 单线程 ,免得使系统响应变得太慢 以致户没法进行其他操作
灵敏度、混合与周期点、有序与混沌、奇异吸引子、典型的分形集如Julia集、Mandelbrot集等,重点介绍了分形与混沌的物理意义、两者之间的关系、与数学的其它方面以及自然现象的联系,展示出分形与混沌的在视觉、图像...
给出了二次函数的Julia集分形图的概念及逃逸时间算法绘制复杂分形图的基本原理,对Julia集给出了严格的数学定义.逃逸时间算法即取定迭代次数界限N,经N次迭代后,若x点仍在给定的区域内,则认为x是分形A中的点 否则x不是...
通过深入研究和应用这些理论,我们可以创建出更为生动、细腻的数字图像,为游戏、电影、科学可视化等领域带来新的创新。同时,分形理论也在数据压缩、图像编码、网络路由等方面有着潜在的应用价值。
在分形理论中,复平面上的迭代函数系统(IFS)常被用来构造和分析分形,如Julia集和Mandelbrot集。 4. **动力系统与分形**:动力系统理论研究系统随时间演变的规律,当这些系统表现出混沌和分形特征时,它们会产生...