`
潇湘叶语
  • 浏览: 4658 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

java的小应用——分形

阅读更多

 

       分形是什么?查百度百科,第一句话是——分形,具有以非整数维形式充填空间的形态特征。头有点晕了吧,没关系,这是数学家研究的是,我们只要知道就行,不知道也可以。因为我们关注的不是这个,我们关注的是怎样用编程语言去实现那些美丽的分形图。

      先来看看几张分形图片:



 

       很漂亮吧,同时也看起来很复杂。你可能会想,编程怎么可能画出这么美丽而又复杂的图片。别怕,这些图片其实并没有你想的那么复杂,仔细观察,我们可以发现这些图形的局部和整体完全是相似的,也就是说我们只要能将局部画出来,整体也就能画出来。

      这时候,递归函数就派上大用场了。例如下面这个图形:



 

      这个曲线还有个名字,Koch曲线。这个看起来相对简单一点。

      它的最基本的图形是这个样子的:



      

      复杂一点:



 

      怎样,看出规律了吧。只要在每段线找两个1/3点,再根据这两个点画一个等边三角形,当然得少画一条边,尖角的朝向也得正确,按照这个方法一直画下去就是Koch曲线了。我们现在知道了它最基本的图形,然后又知道了它的演变规律,接下来的事就只剩敲代码了。代码如下:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Koch implements ActionListener{
	private Graphics g;
	//传入画布
	public Koch(Graphics g){
		this.g = g;
	}
	//画Koch曲线,参数为起点和终点,n为递归次数
	public void draw(int xn,int yn,int xm,int ym,int n){
		int x1,y1,x2,y2,x0,y0,x3,y3;//对一条线段画下一层所需的中间三个点和中点
		//当达到一定的递归次数,结束
		if(n<=0){
			g.drawLine(xn, yn, xm, ym);
			return;
		}
		//各点之间的关系
		x2 = xm+(xn-xm)/3;
		y2 = ym+(yn-ym)/3;
		x1 = xm+2*(xn-xm)/3;
		y1 = ym+2*(yn-ym)/3;
		x0 = (x1+x2)/2;
		y0 = (y1+y2)/2;
		x3 = (int) ((Math.sqrt(3)/3)*(y2-y1)+x0);
		y3 = (int) ((Math.sqrt(3)/3)*(x1-x2)+y0);
		
		--n;
		//调用本身,下面参数的点的次序不能乱,不然画的曲线可能会很难看
		draw(x2, y2,xm, ym, n);
		draw(xn, yn,x1, y1, n);
		draw(x1, y1, x3, y3,n);
		draw( x3, y3,x2, y2,n);
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		draw(100,400,600,400,2);
	}
	
}

 

 

      有些图形得用其它方法实现,有些图形的画图公式已经被数学家找出来了,我们也可以直接用。当然主要思想离不开重复、循环。

      例如下面的Mandelbrot:


 

代码:

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;

public class Mandelbrot implements ActionListener{
	
	private Graphics g;
	
	//重载构造函数,传入画板对象
	public Mandelbrot(Graphics g){
		this.g = g;
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		double scale = 200; //放大比例
		int imax = 570;
		int x,y;//当前点
		double px = 2, py = 1;//初始点
		double x0, y0, xn, yn, xm, ym;
		//遍历整个画图区域
		for(x=0;x<600;x++){
			for(y=0;y<400;y++){
				x0 = x/scale - px;
				y0 = y/scale - py;
				xn = 0;
				yn = 0;
				int i = 0;
				//检测改点是否在Mandelbrot区域内
				while( xn*xn + yn*yn < 4 && i < imax ){
					xm = (xn+yn)*(xn-yn)+x0;
					ym = 2.0*xn*yn+y0;
					xn = xm;
					yn = ym;
					i++;
				}
				if(i == imax){
					//画点,后面加的数只是为了调整位置
					g.drawLine(x+100, y+100, x+100, y+100);
				}
			}
		}
	}
}

 
       我们还可以为这些图加上颜色:



      

      怎样,漂亮吧。分形一下子让我们就让我们这些整天对着电脑的屌丝变的很有艺术气息了,有木有啊!

  • 大小: 281.3 KB
  • 大小: 647.9 KB
  • 大小: 2.7 KB
  • 大小: 1.4 KB
  • 大小: 1.8 KB
  • 大小: 6.1 KB
  • 大小: 258.7 KB
分享到:
评论

相关推荐

    分形算法与程序设计——Java实现

    分形(Fractal)是一种在自然界中广泛存在的几何形态,具有自相似性和复杂性,它在计算机图形学、图像处理、艺术创作等领域有着广泛应用。在编程中,分形算法是利用数学公式或迭代过程来生成这些图案的关键。本篇...

    分形风暴

    "分形风暴"是一个编程项目,它涉及到计算机图形学中的一个独特领域——分形几何。分形是一种在不同尺度上展示相同结构的几何形态,它们在自然界中无处不在,如雪花、海岸线和云朵等。这个源程序可能是为了生成和探索...

    Fractal:Java分形绘图仪

    **Java分形绘图仪**是一种利用编程语言Java实现的工具,主要用于绘制具有复杂自相似性的几何形状——分形。分形在数学、计算机科学、艺术等领域都有广泛的应用,因其无限精细的细节和无限的可缩放性而引人入胜。 **...

    东北大学网络学院JAVA课程

    Barnsley fern是一种分形图形,它的生成通常用到迭代算法,这对理解和掌握Java的控制结构和数学应用很有帮助。 2. **HwMouse.class, HwParameter.class, HwImage.class, HwAudio.class**:这些可能是课程作业或示例...

    分形图形M集以及J集的作图程序

    本项目主要探讨了两种著名的分形集合——M集(Mandelbrot Set)和J集(Julia Set),并提供了用Java编程语言实现的作图程序。 M集,由法国数学家本华·曼德博在1979年提出,是复杂性和美感的完美结合。它的生成基于...

    abc.zip_zip

    "雪花分形"是一个经典的分形示例,它与压缩包文件"abc.zip_zip"中的两个Java源代码文件——KochSnowflake.java和KochPanel.java紧密相关。下面我们将深入探讨这个话题。 雪花分形,又称为科赫雪花,是基于科赫曲线...

    javaprint

    此外,还会详细介绍一个具体的示例——使用Java1.1 API打印Julia集图像。 ### Java打印概述 Java提供了多种方式来处理打印任务,从简单的文本打印到复杂的图形输出。随着时间的发展,Java的打印API也在不断演进,...

    Julia-Sets:Julia分形查看器

    通过这个Java应用,用户可以直观地感受这种数学美,同时深入理解迭代过程和复数运算。 总的来说,"Julia Sets"是一个优秀的教育工具,它将抽象的数学概念转化为视觉艺术,鼓励人们更深入地了解分形几何和复数计算。...

    JAVA画图形学程序(论文+源代码).zip

    首先,我们要理解Java提供的用于图形绘制的主要工具——Java AWT(Abstract Window Toolkit)和Swing库。AWT是Java早期的GUI(图形用户界面)框架,提供了基本的组件如按钮、文本框和窗口,同时也包含了一些低级别的...

    分形生成器

    在编程实现分形生成器时,常用的语言有Python、Java、C++等,它们都有丰富的库支持复数运算和图形渲染。例如,Python的`numpy`和`matplotlib`库可以用于计算和绘制分形。开发者可以通过调整参数、选择不同的迭代函数...

    吃小球_游戏_源码

    `exe` 文件通常是Windows平台下的可执行程序,而 `jar` 文件则是Java应用程序的打包格式。这表明该游戏可能使用Java语言编写,并利用Java的跨平台特性,确保在不同操作系统上运行。开发者可能使用了Java的Swing或...

    Physics-and-Math-2:更多有趣的物理和数学程序,包括Mandelbrot和Julia分形

    本项目特别关注两个著名的分形图案——Mandelbrot集和Julia集,这两个主题在计算机图形学和数学领域具有深远的影响。 1. **Mandelbrot集**:由法国数学家Benoît Mandelbrot命名,它是复平面上的一个集合,定义了...

    PottyFract:绘制 Mandelbrot 和 Julia 集分形的 Android 程序源码 Z[n+1]=Z[n]^2+C

    《PottyFract:探索Mandelbrot与Julia集分形之美——基于Java的Android程序源码解析》 在编程领域,分形是一种引人入胜的数学概念,它展示了自然界中复杂形状的无尽自相似性。PottyFract是一款专为Android平台设计...

    计算机软件-商业源码-实例058-绘制艺术图案.zip

    在本实例058中,我们探讨的是计算机软件开发中的一个独特领域——使用源码来绘制艺术图案。这个“绘制艺术图案”的项目是商业源码的一个典型应用,它展示了编程如何与艺术创作相结合,创造出令人惊叹的视觉效果。...

    DailyProgrammer:在 rDailyProgrammer (www.reddit.comrdailyprogrammer) 上找到的小程序集合

    4. **Java语言的应用**:由于标签明确指出是“Java”,我们可以推测这个压缩包中的代码都是用Java编写的。Java作为一种多平台、面向对象的编程语言,其强大的类库和跨平台特性使其成为解决各种编程挑战的理想选择。...

    The Nature of Code

    ### 《代码的本质》——利用编程模拟自然系统 #### 一、引言 《代码的本质》这本书探讨了如何通过软件捕捉自然界中不可预测的进化和涌现特性,以及如何理解物理世界背后的数学原理来创建数字世界。作者丹尼尔·...

    迭代画图_迭代、中点、简单到复杂_

    在“迭代画图_迭代、中点、简单到复杂_”这个主题中,我们主要探讨的是一个具体的迭代算法——中点画线算法,并通过它逐步生成从简单到复杂的图形。 中点画线算法是计算机图形学中的基础算法之一,用于在屏幕上绘制...

    Chaotic Attractors-开源

    **混沌吸引子——科学与艺术的奇妙交汇** 混沌吸引子是混沌理论中的一个重要概念,它在数学、物理学、计算机科学等多个领域都有广泛的应用。这个Java程序"Chaotic Attractors"正是为了帮助用户生成这些迷人图形而...

Global site tag (gtag.js) - Google Analytics