`
陌陌天使
  • 浏览: 22679 次
  • 性别: Icon_minigender_2
  • 来自: 长沙
社区版块
存档分类
最新评论

公式和递归实现的初步分形【1-公式篇】

 
阅读更多

初次接触分形,觉得是一件高端的东西,我到目前为止所接触到的分形只有两种。

一是“初值-->公式-->放缩(移位)-->下一次初值”型;
二是“最初图形-->递归调用”型。


在第一种分形中,需要注意几个问题:
   
    1.当确保公式无误并且调用了g.fillOval的情况下,若看不到图形,学会一招叫做打印坐标,看到坐标后,也就明白一切了,或不在该显示区域内,或者太密挤在一团。此时只需经济将整个图形放大移位即可。
   
    2.若图形出来了,但是不是想要的结果。这是,需要明确几个概念(以变量x,y为例):变量x,y都有一个初值,通过公式会得到下一个值x1,y1,这个x1,y1要保存到lastx,lasty中作为下一次的计算的初值,都是double型的。而用于画图的x,y是经过加工的(加或者减一个常数改变位置+乘或者除一个常数放缩图形+强制转型为int型)
不同的人可能会出现以下几种情况:
一是你发现无意之间得到了一件艺术品;
二是你勤于思考,乐于探究,一定要画出预想的图形;
三是两者兼顾。

    3.进一步完善:设置渐变颜色,画出漂亮的图形。改变公式的参数,得到意外的收获…………





【分形1】--画出来的第一个图形



【分形2】



【ButterFly】--经过分形2变形而来,有点像蝴蝶



















有了这些基础,分形就入门了,修行就靠个人了。画一些漂亮的图形…………

package cn.zk.ring20130704;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
 * 用于实现画图板界面
 * @author 陌陌
 */
public class Ring extends JFrame{

	public static void main(String[] args) {
		Ring jf = new Ring();
		jf.unitGUI();
	}
		public void unitGUI(){
		this.setTitle("画图板");//窗体的题目
		this.setSize(1200, 700);//设置窗体的大小
		this.setDefaultCloseOperation(3);
		this.getContentPane().setBackground(Color.BLACK);
		// this.setUndecorated(true);
		this.setLocationRelativeTo(null);//设置窗体出现在屏幕的中间
		//窗体的默认布局为边框布局,把按钮统一加到窗体的东边,实例化一个面板对象
		JPanel jpeast = new JPanel();
		//设置面板的大小
		jpeast.setPreferredSize(new Dimension(150,0));
		this.add(jpeast,BorderLayout.EAST);
		
		//实例化按钮对象,显示“我是艺术家”。
		JButton bu = new JButton("        Ring        ");
		JButton bu1 = new JButton("    Butterfly     ");
		JButton bu2 = new JButton("Half-Butterfly");
		JButton bu3 = new JButton("    Spread-1   ");
		JButton bu4 = new JButton("    Spread-2   ");
		JButton bu5 = new JButton("    Spread-3   ");
		JButton bustar = new JButton("         Star        ");
		jpeast.add(bu);//把按钮加到窗体上
		jpeast.add(bu2);
		jpeast.add(bu1);
		jpeast.add(bu3);
		jpeast.add(bu4);
		jpeast.add(bu5);
		jpeast.add(bustar);
		this.setVisible(true);//设置窗体可见
		//窗体可见之后,获取窗体上的画布对象
		Graphics g = this.getGraphics();

		//实例化事件处理类的对象,并把画布对象传递给它
		RingListener rl = new RingListener(g);
	;
		//给事件处理类添加动作监听器
		bu.addActionListener(rl);
		bu1.addActionListener(rl);
		bu2.addActionListener(rl);
		bu3.addActionListener(rl);
		bu4.addActionListener(rl);
		bu5.addActionListener(rl);
}
		public void paint(Graphics g){
			super.paint(g);
		}
}

	


 

package cn.zk.ring20130704;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
 * 鼠标监听器类
 * @author 陌陌
 */
public class RingListener implements ActionListener{
	// 定义一个绘制图形图像的对象
	private Graphics g;
	private double x=0,y=0;
	private int X=0,Y=0;

	public RingListener(Graphics g) {
		this.g = g;
	}
	/**
	 * 当鼠标点击时执行,画出图形
	 */
	public void actionPerformed(ActionEvent e) {
//		g.clearRect(10,10, 1050, 700);
		if(e.getActionCommand().equals("        Ring        ")){
		double a=1.40,b=1.56,c=1.40,d=6.56;
		for(int n=0;n<80000;n++){
			double tempx = d*Math.sin(a*x)-Math.sin(b*y);
			double tempy = c*Math.cos(a*x)+Math.cos(b*y);
			int X = (int)(tempx*40)+400;
			int Y = (int)(tempy*40)+300;
			g.setColor(new Color(0,182,193));
			g.drawLine(X, Y, X, Y);
			x=tempx;
			y=tempy;
			}
		}
		if(e.getActionCommand().equals("    Butterfly     ")){
			for(int m=0;m<100000;m++){
				double a=-2,b=-2,c=-1.2,d=2;
				double tempx=Math.sin(a*y)-Math.cos(b*x);
				double tempy=Math.sin(c*x)-Math.cos(d*y);
				int X = (int)(tempx*100)+300;
				int Y = (int)(tempy*100);
				g.setColor(new Color(0,m%255,m%255));
				g.drawLine(X, -Y+400, X, -Y+400);
				g.drawLine(X,Y+400, X, Y+400);
				x = tempx;
				y = tempy;
			}
		}
		if(e.getActionCommand().equals("Half-Butterfly")){
			double a=-2,b=-2,c=-1.2,d=2;
			for(int m=0;m<50000;m++){
				double tempx=Math.sin(a*y)-Math.cos(b*x);
				double tempy=Math.sin(c*x)-Math.cos(d*y);
				int X = (int)(tempx*100)+400;
				int Y = (int)(tempy*100);
				g.setColor(new Color(0,(int)(m%255),(int)(m%255)));
				g.drawLine(X, -Y+300, X, -Y+300);
				x = tempx;
				y = tempy;
			}
		}
		if(e.getActionCommand().equals("    Spread-1   ")){
			double a=0.4,b=1,c=0;
			int nTime = 0;
			for(int i=0;i<100000;i++){
				nTime ++;
				g.setColor(new Color(0,0,i%256));
				if(nTime == 100000){
					g.setColor(new Color(nTime%256,nTime%256,0));
					nTime = 0;
				}
				double tempx = y-Math.signum(x)*Math.sqrt(Math.abs(b*x-c));
				double tempy = a-x;
				int X = (int)(tempx*70)+600;
				int Y = (int)(tempy*70)+300;
				x = tempx;
				y = tempy;
				g.drawLine(X, Y, X, Y);
			}
		}
		if(e.getActionCommand().equals("    Spread-2   ")){
			double a=1.6,b=4,c=60;
			int nTime = 0;
			for(int i=0;i<100000;i++){
				nTime ++;
				g.setColor(new Color(0,0,i%256));
				if(nTime == 100000)
				{
					g.setColor(new Color(nTime%256,nTime%256,0));
					nTime = 0;
				}
				double tempx = y-Math.signum(x)*Math.sqrt(Math.abs(b*x-c));
				double tempy = a-x;
				int X = (int)(tempx)+600;
				int Y = (int)(tempy)+400;
				x = tempx;
				y = tempy;
				g.drawLine(X, Y, X, Y);
			}
		}
		if(e.getActionCommand().equals("    Spread-3   ")){
			double a=-1000,b=0.1,c=-10;
			for(int i=0;i<100000000;i++){
				g.setColor(new Color(235,86,224));
				double tempx = y-Math.signum(x)*Math.sqrt(Math.abs(b*x-c));
				double tempy = a-x;
				int X = (int)(tempx*5)+400;
				int Y = (int)(tempy*5)+300;
				x = tempx;
				y = tempy;
				g.drawLine(X, Y, X, Y);
			}
		}
	}
}	
		
		


  

  • 大小: 25.6 KB
  • 大小: 72.5 KB
  • 大小: 141.4 KB
  • 大小: 80.2 KB
  • 大小: 74.3 KB
  • 大小: 45.2 KB
  • 大小: 45 KB
  • 大小: 8.4 KB
  • 大小: 71.7 KB
分享到:
评论

相关推荐

    经典的分形入门程序--Canto三分集的递归算法

    递归结构使得代码简洁且易于理解,同时也便于理解和实现其他类型的分形。 在学习和实践这个程序时,你可以进一步探索不同参数(如迭代次数、颜色方案等)对分形图案的影响,这有助于增强对分形几何的理解。此外,还...

    分形背后的数学公式推导

    ### 分形背后的数学公式推导 #### 距离估计、光线跟踪原理及其实现细节 **光线跟踪**(Ray Tracing)是一种用于渲染三维图形的技术,它通过模拟光线的行为来计算图像中像素的颜色。这一过程涉及到多个核心概念,...

    【老生谈算法】matlab实现分形树源码.docx

    title({['分形数:', strcat('E', num2str(kmax-1))]}) end end ``` 这个代码可以生成一个分形树,具有四个分支。每个分支都是通过递归函数生成的,最后将这些分支连接起来,形成一个完整的分形树。 Matlab 代码...

    分形算法与程序设计——Visual Basic实现--光盘文件

    理解递归函数的编写和迭代循环的控制,是实现分形算法的关键。 5. **颜色处理**:为了展示分形的丰富细节,我们需要根据迭代次数或特定条件来分配不同的颜色。学习如何使用VB的颜色表、颜色混合以及调色板,可以...

    drawInfinityFractal:分形是无限自相似的。 程序使无穷大看起来像分形。-matlab开发

    在计算机科学和数学领域,分形被用来模拟和研究各种自然现象,如云朵、山脉、海岸线等。 MATLAB是一种强大的编程环境,特别适合于数值计算、数据分析以及图形可视化。在MATLAB中创建分形图像,不仅可以帮助我们理解...

    分形几何学1

    曼德勃罗特集是分形几何学中的一个经典例子,它是一个由复数迭代公式生成的点集,这个公式是\( C = Z_{n+1} = Z_n^2 + C \),其中\( Z_0 \)是初始复数,而\( C \)是常数。这个迭代过程可以产生极为复杂的图案,具有...

    计算机图形学之-分形几何.ppt

    - **计算**: 分形维数可通过以下公式计算:\[ D = \frac{\log(N)}{\log(S)} \] 其中,\( D \) 是分形维数,\( N \) 表示与整体自相似的局部形体数量,\( S \) 是相似比,即整体与局部的比例。 #### 四、分形的应用...

    53958727box-counting.zip

    在IT领域,分形盒维数(Box-Counting Dimension)是研究复杂几何形状和结构的一种重要工具,尤其在图像处理、数据建模和复杂网络分析中有着广泛的应用。本项目"53958727box-counting.zip"显然是针对1D、2D、3D空间中...

    用C语言编写的分形树

    这种结构可以通过数学公式和算法生成,其中C语言是一种常用的语言来实现这些算法。在本项目中,我们将深入探讨如何用C语言来创建二维分形树。 首先,我们要理解分形树的基本概念。分形树是基于迭代过程构建的,每一...

    VB6.0采用分形算法生成图案.rar

    VB6.0采用分形算法生成图案,本分形生成图形的程序可生成叶、树、雪花和三角图案。所谓分形,在数学上是指具有如下性质的一类图形: ...因为它们具有无限的细节表面,就可以使用递归算法来实现。

    一个基于VC++的简单分形树

    分形树就是这种概念在自然界树木形态上的抽象表现,通过数学公式和算法来模拟真实树木的分支结构。 在VC++中,我们通常会创建一个MFC应用程序项目,这将为我们提供一个基础的用户界面框架。MFC是一个C++类库,它...

    分形与混沌\分形制图软件和程序

    分形制图软件和程序是实现这一理论的重要工具,它们允许用户生成和探索各种分形图案。例如,著名的曼德勃罗集(Mandelbrot Set)就是通过迭代复数方程来创建的,而朱利亚集(Julia Set)则基于不同的固定点迭代。...

    e语言-树枝分形算法

    2. **分支生成**:用循环结构实现递归分形,每次迭代都将当前分支分为多个子分支,并根据预设规则调整它们的属性。 3. **角度计算**:每个子分支相对于父分支的角度可能是固定的,也可能是随机的,或者基于某种数学...

    opengl分形艺术 3D

    最后,为了创建分形,我们需要选择合适的分形公式。例如, Mandelbrot集和Julia集是两种经典的分形,它们通过复数迭代来生成。在OpenGL中,我们可以将这些公式嵌入到GLSL着色器中,每次迭代都计算新的颜色值,并将...

    风蕨:分形蕨的吹制版-matlab开发

    在Matlab中开发风蕨程序,可以利用其内置的图形用户界面(GUI)和强大的数学运算功能来实现分形的生成和动态展示。 风蕨的生成通常基于几个关键参数,包括叶片的大小、方向、形状以及随机性,这些参数通过迭代过程...

    c# 实现雪花分形的示例

    总的来说,这个C#示例展示了如何利用面向对象编程的概念和C#的图形库来实现一个交互式的雪花分形绘制程序。通过理解并应用这些原理,开发者可以进一步探索其他分形图案的实现,或者在自己的项目中应用分形几何的概念...

    简单分形几何图形的绘制

    本实验的目的是通过实现分形曲线的绘制算法,使我们更加深入地理解分形几何图形的性质和绘制方法。通过编程实践,我们不仅能够掌握如何使用计算机语言来实现这些算法,还能够了解到如何将这些理论知识应用到实际的...

    Matlab实验报告:分形迭代.pdf

    总结:通过Matlab实验报告,我们了解到分形迭代的基本原理和实现方式,包括Koch曲线、Sierpinski三角形、树木花草图形的生成,以及分形维数的概念和计算。这些知识展示了分形在几何学、计算机图形学和数学中的应用。

    浅析MATLAB环境下分形图形的生成.pdf

    M集的分形图形可以通过迭代公式来生成,它们通常具有精美的对称性和无限的细节。 Sierpinski地毯是另一个典型的分形图形,它由波兰数学家Sierpinski提出。Sierpinski地毯是一个正方形,经过递归地去除正中间的九分...

Global site tag (gtag.js) - Google Analytics