分形是其组成部分以某种方式与整体相似的形,亦即:如果一个图形其组成部分以某种方式与整体相似,则称该图形为分形。可以依靠递归实现。所谓递归就是函数自己调用自己
package Fractal;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
/*
* 定义简单画板类
*author daidan
*/
public class DrawingBorder extends JFrame {
/**
* 程序的入口,主函数
*/
private static Graphics g;
public double x1=200;
public double y1=200;
public double x2,y2;
public static void main(String[] args) {
// 实例化一个简单画板界面类的对象
DrawingBorder db = new DrawingBorder();
// 调用初始化界面的方法
db.initUI();
}
//初始化界面的方法
public void initUI( ){
this.setTitle("简单画板");
this.setSize(600,500);
this.setDefaultCloseOperation(3);
this.setLayout(new FlowLayout());
JButton jbfx1=new JButton("分形1");
JButton jbfx2=new JButton("分形2");
JButton jbfx3=new JButton("分形3");
JButton jbfx4=new JButton("分形4");
this.add(jbfx4);
this.add(jbfx1);
this.add(jbfx2);
this.add(jbfx3);
/*
* 匿名内部类
*
*/
ActionListener al=new ActionListener(){
public void actionPerformed(ActionEvent e){
if(e.getActionCommand().equals("分形1")){
for(int i=0;i<50000;i++){
g.fillOval((int)(x1*100+300), (int)(y1*100+300), 2, 2);
x2=-0.656*Math.sin(1.40*y1)-Math.sin(1.56*x1);
y2=1.40*Math.cos(1.40*x1)-Math.cos(1.56*y1);
x1=x2;
y1=y2;}
}elseif(e.getActionCommand().equals("分形2"))
{for(int i=0;i<50000;i++){
Color c=new Color(250,0,0);
g.setColor(c);
g.fillOval((int)(x1*100+300), (int)(y1*100+300), 2, 2);
x2=Math.sin(-2*y1)-Math.cos(-2*x1);
y2=Math.sin(-1.2*x1)-Math.cos(2*y1);
x1=x2;
y1=y2;
}
} elseif(e.getActionCommand().equals("分形3")){
x1=0;
y1=0;
Color c=new Color(250,0,0);
g.setColor(c);
for(int i=0;i<500000;i++){
double x = x1+300;
double y = y1+300;
g.drawLine((int)x, (int)y, (int)x, (int)y);
x2=y1-Math.signum(x1)*Math.sqrt(Math.abs(4*x1-60));
y2=1-x1;
x1=x2;
y1=y2;
System.out.println(x);
}
}elseif(e.getActionCommand().equals("分形4")){
x1=0.0234;
y1=0.012345;
Color c=new Color(250,20,20);
g.setColor(c);
for(int i=0;i<500000;i++){
double x = x1*1000+300;
double y = y1*1000+300;
System.out.println(x+" " +y);
g.drawLine((int)x, (int)y, (int)x, (int)y);
double a=2;
x2=x1*Math.cos(a)-(y1-Math.pow(x1, 2))*Math.sin(a);
y2=x1*Math.sin(a)+(y1-Math.pow(x1, 2))*Math.cos(a);
x1=x2;
y1=y2;
}
}
};
jbfx1.addActionListener(al);
jbfx2.addActionListener(al);
jbfx3.addActionListener(al);
jbfx4.addActionListener(al);
this.setVisible(true);
g = this.getGraphics();
}
}
/************************************************************/
主界面
import java.awt.Graphics;
import javax.swing.JFrame;
import cn.test0320.XueHua;
///新建一个类继承了JFrame
public class XieEr extends JFrame{
/**
* main
*/
public static void main(String[] args) {
XieEr jf=new XieEr();
jf.init();
}
public int l=300,i=5;
private Graphics g;
public void init(){
this.setSize(800,700);
this.setTitle("雪花曲线");
this.setDefaultCloseOperation(3);
this.setLocationRelativeTo(null);
//设置可见后获取画布
this.setVisible(true);
g=this.getGraphics();
}
//将画雪花曲线定义在重绘中
public void paint(Graphics g){
super.paint(g);
XueHua xh=new XueHua(g);
xh.init(l, i,100,200);
}
/**************************************************************/
//画雪花曲线的类
/****************************************************************/
import java.awt.Graphics;
public class XueHua {
/**
*xuehua类
*/
private int l,i;
//角度v
private Graphics g;
//一个三的N次方的数组
public int[] a=new int[]{1,3,9,27,81,243,729,2187};
//构造函数,传入画板
public XueHua(Graphics g){
this.g=g;
}
public void init(int l,int i,int x,int y){
this.l=l;
this.i=i;
//将雪花曲线的三角形的三边分别进行递归
this.xuehua(x, y, 0, 1);
this.xuehua(x+l, y, 2*Math.PI/3, 1);
this.xuehua(x+l/2, y+l*Math.sin(Math.PI/3), -2*Math.PI/3, 1);
}
//将利用这个函数进行递归,x,y起始点坐标,z角度 ,n用来判断到递归底层画曲线的长度
public void xuehua(double x,double y,double z,int n){
if (n<a[i]){
int i;
//第一次递归
xuehua(x,y,z,3*n);
//计算第二个点坐标
double x2=x+l*Math.cos(z)/(3*n),y2=y+l*Math.sin(z)/(3*n);
//改变角度
z=z-Math.PI/3;
xuehua(x2,y2,z,3*n);
//计算第三个点坐标
double x3=x2+l*Math.cos(z)/(3*n),y3=y2+l*Math.sin(z)/(3*n);
//改变角度
z=z+2*Math.PI/3;
xuehua(x3,y3,z,3*n);
double x4=x3-l*Math.cos(Math.PI-z)/(3*n),y4=y3+l*Math.sin(z)/(3*n);
z=z-Math.PI/3;
xuehua(x4,y4,z,3*n);
}else{
//若已经到了底层则画线
g.drawLine((int)x, (int)y, (int)(x+l*Math.cos(z)/(n)), (int)(y+l*Math.sin(z)/(n)));
}
}
}
/*************************************************/
相关推荐
简单绘制分形树的代码,doc格式,可以设置偏移角度数、分支比例、迭代次数
内容包括分形图的递归算法、文法构图算法、迭代函数系统算法、逃逸时间算法、分形演化算法,以及分形图的放大、分形图的动画、分形图的立体化和利用分形算法实现自然景物的模拟等内容。
L-system也能用于生成自相似的分形,例如迭代函数系统。此代码就是用它生成自相似的分形。程序涉及到一个主函数,两个类。主函数主要的功能是描述绘制的规则和其操作,类的主要功能则是存贮信息,对输入的字符进行...
LWGJL应用程序可查看龙形分形的迭代 建造: 构建的要求是在类路径中包含LWJGL jar。 这可以通过将CLASSPATH环境变量设置为包含jar文件夹或在构建过程中进行设置来完成: javac -cp LWJGL_2.9.1/jar/* ...
使Mandelbrot分形全屏显示的Java应用程序。 导航,平滑的着色和一些创新的优化都得以实现。 此应用程序呈现全屏的分形,并提供用于平移,缩放,取消缩放,保存屏幕截图,调整配色方案的选项,以及其他选项。 它...
分形曲线 CurvedFractals是免费的开源软件,是DEC计算机科学和数学集成项目的一部分。...手术内部机制为了以高清晰度显示分形,有必要在屏幕的每个像素上迭代分形方程并评估该序列是否趋于发散(经过约600次迭代
分形的一个用于渲染分形的Java程序,我从高中开始(在C ++中),在我的本科学习期间移植到Java,然后对它进行了半完成的更改,直到不再起作用为止,而我却忘记了问题所在。 现在,我将使用版本控制来重新编写它,...
非线性系统手册 第五版:混沌,分形,元胞自动机,遗传算法,基因表达式编程,支持向量机,小波,隐马尔可夫模型,模糊逻辑与C++、JAVA和SymbolicC++程序 出版时间:2013年版 内容简介 《非线性系统手册(第5版)...
java源码字符串缓冲区Javolution 用于实时和嵌入式系统的 Java(TM) 解决方案 因为实时编程需要时间可预测的标准库。 “简化的能力意味着消除不必要的,以便必要的可以说话。...用于与本机应用程序直接
我的分形沙箱 :) 作为 OpenCL 加速战争循环噪声计算的测试项目开始,Fractal Explorer 立即开始了它自己的生命。 它变成了一个沙箱,...分形、噪声、吸引子、迭代函数系统…… 动画和视频功能 应用过滤器和组合功能
jifs:Java迭代功能系统 动机 是用于分形生成的漂亮的Mac软件。 这是我对Java的翻译,是具有新功能的可移植版本。 该软件包随附一个jar可执行文件,类似于TeraFractal。 去做: 做鬼 修正绘图范围
分形 该项目绘制了非负序的Mandelbrot和Julia集。 曼德布罗集 Mandelbrot集是一组复数c ,当通过函数f(z) = z^2 + c迭代时,它们仍然是有界的。 考虑c = 1 : f(0) = 0^2 + 1 = 1 f(1) = 1^2 + 1 = 2 f(2) = 2^2 + ...
基于Java的迭代分形查看器。 易于使用的GUI还将能够渲染成帧集合,以创建缩放视频动画(计划在不久的将来使用)。 GPL许可。 要求JRE> = 1.6。
Frond是用Java编写的跨平台分形查看应用程序。 Frond允许您使用无限的撤消和重做功能来放大分形的任何区域,并调整迭代次数以最大化细节。