分形是什么?查百度百科,第一句话是——分形,具有以非整数维形式充填空间的形态特征。头有点晕了吧,没关系,这是数学家研究的是,我们只要知道就行,不知道也可以。因为我们关注的不是这个,我们关注的是怎样用编程语言去实现那些美丽的分形图。
先来看看几张分形图片:
很漂亮吧,同时也看起来很复杂。你可能会想,编程怎么可能画出这么美丽而又复杂的图片。别怕,这些图片其实并没有你想的那么复杂,仔细观察,我们可以发现这些图形的局部和整体完全是相似的,也就是说我们只要能将局部画出来,整体也就能画出来。
这时候,递归函数就派上大用场了。例如下面这个图形:
这个曲线还有个名字,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); } } } } }
我们还可以为这些图加上颜色:
怎样,漂亮吧。分形一下子让我们就让我们这些整天对着电脑的屌丝变的很有艺术气息了,有木有啊!
相关推荐
金属板能阻挡电磁波吗——分形透明金属板.pdf
分形三角形 三维场景绘制 计算机图形学 实验报告 源代码
分形几何 教材 [分形几何——数学基础及其应用].(英国)Kenneth.Falconer-OCR
分形算法与程序设计——Java实现 分形算法与程序设计——Java实现
NULL 博文链接:https://1975417219.iteye.com/blog/1982701
MATLAB与数学教学——以分形几何为例.pdf
分形几何方面的基础理论书籍,需要用超星阅读器
安装说明:将最新的jar文件复制到本地IQM主应用程序目录下的“Plugins”目录下。 IQM:https://sourceforge.net/projects/iqm/ 此插件的作者:Ion Andronache,布加勒斯特大学,罗马尼亚 Daniel Peptenatu,...
分形算及其如何进行程序设计,用Java来实现的
分形对象——形、机遇和维数. 分形创始人的力作
分形算法与程序设计——Java实现,这是其中的第七个程序。
最新的图像压缩技术——分形图像处理,资源很难找到的哦,别错过
Java 分形几何图形源代码实例 Java 分形几何图形源代码实例Java 分形几何图形源代码实例
各种分形算法,用JAVA语言编写的分形是一个几何概念,是非线性领域的一个分枝学科,描绘不光滑和不规则的几何形体,它使传统数学中无法表达的形态得以逼真的表达。自从1975年曼彻斯特首次提出分形理论以来,分形得到...
该程序为matlab环境下程序,主要演示用中位点法生成分形曲面,通过三角形的不断被子分而整个表面弄成皱折,产生类似于山脉的形状——分形山。
Java图形分形实例源码,几何图形分形的例子,示例演示如截图所示,貌似有点难度,不懂,分享给Java达人。
分形理论及其应用- 朱华,姬翠翠-科学出版社.. pdf版的,挺清楚的,里面对分形的一些理论讲了也不错。
分形应用中的数学基础与方法 分形应用中的数学基础与方法 分形应用中的数学基础与方法 分形应用中的数学基础与方法 分形应用中的数学基础与方法 分形应用中的数学基础与方法 分形应用中的数学基础与方法 分形应用中...