给我一个点,我能画出整个世界!这正是分形的魅力所在。
今天我们不说什么很枯燥的内容,我们先来看神奇的色子。
题目这样说:
1.平面上随机选A,B,C三个点。再随机选一个点,记为P。
2.有一个三面色子,每丢一次,则选中ABC三个中一点。
开始游戏:
1.重复丢色子,如果选中A,则取A和P的中点P1,画黑。
2.如果选中B,则取B和P1的中点P2,画黑。
3.如果选中A,则取A和P2的中点P3,画黑。
4.一直重复,如每点一下鼠标,丢100次色子。
这个游戏看似有点规律,但是当你画出图片时会发生非常奇妙的东西!
public class DrawDice extends JPanel { private Random r = new Random();// 创建随机数对象 private int len = 5;// 设置点数为3 private int x[] = new int[len];// 存x的数组 private int y[] = new int[len];// 存y的数组 private int tx = r.nextInt(600);// 随机获取第一个点的x坐标 private int ty = r.nextInt(600);// 随机获取第一个点的y坐标 public static void main(String[] args) { DrawDice dd = new DrawDice(); dd.initUI(); } public void initUI() { JFrame jf = new JFrame();// 创建窗体对象 jf.setSize(new Dimension(600, 600));// 设置窗体大小 jf.setDefaultCloseOperation(3);// 设置关闭按钮 jf.setResizable(false);// 设置不可调节 jf.setLocationRelativeTo(null);// 设置窗体局中 jf.setVisible(true);// 设置窗体可见 this.setBackground(Color.WHITE);// 设置背景颜色 jf.add(this, BorderLayout.CENTER);// 将面板添加到窗体中部 for (int i = 0; i < len; i++)// 随机获取坐标 { x[i] = r.nextInt(600); y[i] = r.nextInt(600); } } /** * 重写paint方法 */ public void paint(Graphics g) { super.paint(g);// 调用父类方法 drawpoint(g);// 重绘点 } /** * 画点的方法 * * @param g图形对象 */ public void drawpoint(Graphics g) { int p = 100000;// 画10W个点 while (p-- != 0) // 通过while进行循环 { int t = r.nextInt(len);// 获取随机数 g.drawLine((x[t] + tx) / 2, (y[t] + ty) / 2, (x[t] + tx) / 2, (y[t] + ty) / 2);// 连接画线 tx = (x[t] + tx) / 2;// 得到新x坐标 ty = (y[t] + ty) / 2;// 得到新y坐标 } } }
当我们选取5个点时,会发现更加奇妙的东西!
下面我们来介绍迭代实现分形。
所谓迭代,就是给你一个公式,然后反复把上一次的运算结果变成下一次自变量。
其实就是相当于一个数列,我们通过计算得到数据,然后将这些数据以点的形式画出来,
然后再通过放大移动将其移到屏幕中间,就可以画出非常美丽的图片啦~~
/** * 画第一个分形图形 * * @param g图像对象 */ public void drawfractal1(Graphics g) { int large = 150;// 设置放大倍数 int x0 = 350;// 设置初始x点 int y0 = 330;// 设置初始y点 double x = 0, y = 0, xt, yt;// 设置临时变量存储每一次计算出来的点 double a = -2, b = -2, c = -1.2, d = 2;// 设置参数 for (int i = 0; i < num; i++) // 循环画点 { // g.setColor(new Color(0.1f, 0.2f, 0.3f,0.5f)); g.setColor(Color.white);// 设置点为白色 xt = (Math.sin(a * y) - Math.cos(b * x));// 计算下一个迭代点 yt = (Math.sin(c * x) - Math.cos(d * y));// 计算下一个迭代点 g.drawLine(x0 + (int) (large * xt), y0 + (int) (large * yt), x0 + (int) (large * xt), y0 + (int) (large * yt));// 画点 x = xt;// 将新点存入 y = yt;// 将新点存入 } } /** * 画第二个分形图形 * * @param g图像对象 */ public void drawfractal2(Graphics g) { int large = 40;// 设置放大倍数 int x0 = 350;// 设置初始x点 int y0 = 300;// 设置初始y点 double a = 1.40, b = 1.56, c = 1.40, d = -6.56;// 设置参数 double x = 0, y = 0, xt, yt;// 设置临时变量存储每一次计算出来的点 for (int i = 0; i < num; i++) // 循环画点 { g.setColor(Color.white);// 设置点为白色 xt = d * Math.sin(a * x) - Math.sin(b * y);// 计算下一个迭代点 yt = c * Math.cos(a * x) + Math.cos(b * y);// 计算下一个迭代点 g.drawLine(x0 + (int) (large * xt), y0 + (int) (large * yt), x0 + (int) (large * xt), y0 + (int) (large * yt));// 画点 x = xt;// 将新点存入 y = yt;// 将新点存入 } } /** * 画第三个分形图形 * * @param g图形对象 */ public void drawfractal3(Graphics g) { int large = 75;// 设置放大倍数 int x0 = 350;// 设置初始x点 int y0 = 300;// 设置初始y点 double a = 0.4, b = 1, c = 0;// 设置参数 double x = 0, y = 0, xt, yt;// 设置临时变量存储每一次计算出来的点 for (int i = 0; i < 10 * num; i++) // 循环画点 { g.setColor(Color.blue);// 设置点为白色 xt = y - Math.signum(x) * Math.sqrt(Math.abs(b * x - c));// 计算下一个迭代点 yt = a - x;// 计算下一个迭代点 g.drawLine(x0 + (int) (large * xt), y0 + (int) (large * yt), x0 + (int) (large * xt), y0 + (int) (large * yt));// 画点 x = xt;// 将新点存入 y = yt;// 将新点存入 } } /** * 画第四个分形图形 * * @param g图形对象 */ public void drawfractal4(Graphics g) { double large = 1.5;// 设置放大倍数 int x0 = 350;// 设置初始x点 int y0 = 300;// 设置初始y点 double a = 1, b = 4, c = 60;// 设置参数 double x = 20, y = 20, xt, yt;// 设置临时变量存储每一次计算出来的点 for (int i = 0; i < num; i++) // 循环画点 { g.setColor(Color.white);// 设置点为白色 xt = y - Math.signum(x) * Math.sqrt(Math.abs(b * x - c));// 计算下一个迭代点 yt = a - x;// 计算下一个迭代点 g.drawLine(x0 + (int) (large * xt), y0 + (int) (large * yt), x0 + (int) (large * xt), y0 + (int) (large * yt));// 画点 x = xt;// 将新点存入 y = yt;// 将新点存入 } } private int num = 100000;
让我们来欣赏一下美丽的图片吧~
相关推荐
在华中科技大学的计算机图形学课程中,学生通过上机实验深入理解和掌握相关理论,其中一个实验主题是“分形三角形和三维场景绘制”。这个实验旨在让学生了解并实践分形几何和3D场景构建的基本原理。 分形三角形是一...
分形结构是一种具有自相似性质的几何形态,在材料科学中,研究者尝试将分形概念应用于设计透明金属板,以期望结合金属的导电性能和透光性。这种材料可能在某些特定频率下允许电磁波通过,同时保持良好的导电性,这...
结合提供的标题"Java实现美丽的分形"和描述中的博客链接,我们可以推测这是一个关于利用Java创建分形图形的教程。 首先,我们需要理解分形的基本概念。分形是自然界中广泛存在的几何形状,如海岸线、云朵、雪花等。...
通过调整参数和算法,可以创造出无数美丽的分形图案,同时这也是一种极好的学习编程、数学和艺术的交叉领域实践。 总的来说,分形算法与程序设计结合Java,不仅展示了数学的美,还让我们有机会通过编程探索和模拟...
### 分形几何——数学基础及其应用 #### 一、引言 分形几何是一门研究不规则几何形状的数学分支,这些形状具有自相似性、分数维数等特性。本书《分形几何——数学基础及其应用》(第二版)由英国数学家Kenneth ...
分形对象——形、机遇和维数. 分形创始人的力作
在Java中,通过利用Java AWT(Abstract Window Toolkit)或Swing库,可以创建出交互式的图形界面来展示这些美丽的分形图案。 在描述中提到,这个源码可能有一定的复杂性,暗示可能涉及到递归算法和复杂的图形计算。...
分形算法与程序设计——Java实现,这是其中的第七个程序。
分形几何的概念最早由美籍法国数学家Benoit B. Mandelbrot于20世纪70年代提出,并迅速成为全球科学家们热议的焦点。分形几何的特征包括具有精细结构、不规则性、自相似性、通常具有高于拓扑维数的分形维数以及常常...
1. **分形生成**:分形5.1内置了多种分形算法,如曼德勃罗集、朱利亚集、科赫曲线等,用户可以通过调整参数,创造出独一无二的分形图案。 2. **色彩控制**:用户可以自定义色彩方案,设置颜色迭代规则,使分形图像...
分形图案,是一种在自然界和数学领域中广泛存在的几何形态,它们展现出惊人的复杂性和美感。"奇妙的递归"这一主题,揭示了分形图形的核心特性——递归构造。递归是数学和计算机科学中的一个重要概念,它通过重复一个...
利用Java来实现分形算法可以充分利用其图形处理能力,创建出丰富多彩的分形图案。 ##### Java中的图形环境 Java提供了丰富的图形库支持,包括AWT和Swing两个主要的图形用户界面工具包。其中,Swing是基于AWT的一个...
Java 分形几何图形源代码实例是一组用于演示和学习分形几何概念的编程资源,主要使用Java语言实现。分形几何是一种研究具有自相似性质的几何形状和结构的数学领域,它在计算机图形学、艺术、自然科学乃至金融等领域...
"分形风暴"是一个编程项目,它涉及到计算机图形学中的一个独特领域——分形几何。分形是一种在不同尺度上展示相同结构的几何形态,它们在自然界中无处不在,如雪花、海岸线和云朵等。这个源程序可能是为了生成和探索...
用于研究森林演化的分形分析,混沌、孤子和分形,2016,第 91 卷,310-318。 安装说明:将最新的jar文件复制到本地IQM主应用程序目录下的“Plugins”目录下。 IQM:https://sourceforge.net/projects/iqm/ 此插件的...
- **分形在自然中的应用**:森林、山脉、河流网络、云朵等自然现象都显示出分形特征。 2. **Visual Basic在分形算法中的应用**: - **VB的图形绘制能力**:VB的GDI+图形库可以用来绘制分形图形,提供线条、填充和...
曼德勃罗集是最著名的分形之一,通过迭代复数运算来生成,其边界展现出无尽的细节和复杂性。而朱利亚集则依赖于不同的复数初始值,可以生成各种各样的图案。 分形动画则是分形技术在动态图形中的应用。通过改变分形...
这一章可能包含简单的Java代码,用于生成基本的分形图案。 2. 第2章:可能涉及迭代函数系统(IFS),这是创建复杂分形图像的常见方法。读者将学习如何构建IFS规则,并用Java实现这些规则来生成自相似图形。 3. 第3...
最新的图像压缩技术——分形图像处理,资源很难找到的哦,别错过