package leaf;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.awt.image.*;
/**
* Title: leaf
* Description:
* Copyright: Copyright (c) 2003
* Company: http://agents.yeah.net
* @author [email protected]
* @version 1.0
*/
public class leaf extends Applet implements Runnable{
Thread runner;//为类定义一个线程,在start中启用
int width=300,heightall=400;
int height=300;
double scale[];
int offsetX[];//0时为初始的偏移量,1时为经过移动后的偏移量
int offsetY[];
boolean running=false;//开始时运行为暂停
int delay=0;//cpu延迟时间
double u=0;//借用
double x=0;//画点的x坐标
double y=0;//画点的y坐标
double rule[][];//规则数组p[6][rules],其中rules为规则数,每个规则有6个参数,由用户自己设定
double p[];//规则的概率数组p[rules],由用户自己设定
double pp[];//根据p[]算出每条规则应用的范围,即随机点落在哪里时用该条规则,其中pp[0]=0;
int ruleNumber;//rules得个数
boolean change=true;//true为平移,false为缩放
boolean startChange=true;
int getX[];
int getY[];
int count=0;//叠代的次数,可以自己设定
boolean started=true;
Graphics gr;
Color c=new Color(100, 210, 100);//画笔颜色
Color bg=new Color(0,0,0);//背景颜色
boolean isStandalone = false;
Button btnStart = new Button();
Button btnSet = new Button();
Button btnAbout = new Button();
Choice choice1 = new Choice();
Label label1 = new Label();
Choice choice2 = new Choice();
Button reset = new Button();
Label label3 = new Label();
Label label2 = new Label();
/**Get a parameter value*/
public String getParameter(String key, String def) {
return isStandalone ? System.getProperty(key, def) :
(getParameter(key) != null ? getParameter(key) : def);
}
/**Construct the applet*/
public leaf() {
}
/**Initialize the applet*/
public void init() {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
/**Component initialization*/
private void jbInit() throws Exception {
//int[] pixels=new int[width*height];
resize(width,heightall);//重置窗口大小
// setCursor(MOVE_CURSOR);
getX = new int[2];
getY = new int[2];
offsetX = new int[2];
offsetY = new int[2];
scale = new double[2];
scale[0]=1;
offsetX[0]=0;
offsetY[0]=0;
offsetX[1]=0;
offsetY[1]=0;
setLayout(new BorderLayout());//定义对齐方式
Panel pan = new Panel();//定义一个面板
pan.setLayout(new BorderLayout());
Panel panMain = new Panel();
panMain.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
Panel panMove = new Panel();
panMove.setLayout(new FlowLayout(FlowLayout.CENTER,5,5));
this.setBackground(Color.black);
this.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(MouseEvent e) {
this_mousePressed(e);
}
public void mouseReleased(MouseEvent e) {
this_mouseReleased(e);
}
});
pan.setBackground(Color.lightGray);
panMain.setBackground(Color.lightGray);
panMove.setBackground(Color.lightGray);
btnStart.setLabel("开始");
btnStart.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
btnStart_actionPerformed(e);
}
});
btnSet.setLabel("设置");
btnSet.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
btnSet_actionPerformed(e);
}
});
btnAbout.setLabel("说明");
btnAbout.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
btnAbout_actionPerformed(e);
}
});
choice1.addItem("叶子");
choice1.addItem("山");
choice1.addItem("Sierpinski三角");
choice1.addItem("枫叶");
choice1.addItem("怪物");
choice1.addItem("竹叶");
choice1.addItem("金字塔");
// choice1.addItem("枫叶");
choice2.addItem("平移-鼠标移动可平移");
choice2.addItem("缩放-鼠标从左向右放大,反之缩小");
rule = new double [6][6];
p = new double [6];
pp = new double [7];
for (int i=0;i<6;i++){
for(int j=0;j<ruleNumber;j++){
rule[i][j]=0;
}
}
ruleNumber=4;
scale[0]=30;
scale[1]=30;
rule[4][0]=0.16;
rule[0][1]=0.85; rule[1][1]=0.04; rule[3][1]=-0.04; rule[4][1]=0.85; rule[5][1]=1.6;
rule[0][2]=0.2; rule[1][2]=-0.26; rule[3][2]=0.23; rule[4][2]=0.22; rule[5][2]=1.6;
rule[0][3]=-0.15; rule[1][3]=0.28; rule[3][3]=0.26; rule[4][3]=0.24; rule[5][3]=0.44;
//p[0]=0.25; p[1]=0.25; p[2]=0.25; p[3]=0.25;
p[0]=0.01; p[1]=0.85; p[2]=0.07; p[3]=0.07;
pp[0]=0;
for (int i=1;i<ruleNumber+1;i++){
pp[i]=pp[i-1]+p[i-1];
}
choice1.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(ItemEvent e) {
choice1_itemStateChanged(e);
}
});
label1.setText("图像");
choice2.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(ItemEvent e) {
choice2_itemStateChanged(e);
}
});
reset.setLabel("重置");
reset.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
reset_actionPerformed(e);
}
});
label2.setForeground(Color.blue);
label2.setText("制作:keatskk");
add("South",pan);
pan.add("North",panMain);
panMain.add(btnStart);
panMain.add(btnSet);
panMain.add(btnAbout);
panMain.add(choice1);
panMain.add(label2, null);
pan.add("South",panMove);
panMove.add(label1, null);
panMove.add(choice2, null);
panMove.add(reset, null);
// reinit();//initial一次
//img.flush();
//gr=this.getGraphics();
// gr.clearRect(0,0,width,height);
// gr.setColor(Color.black);
// gr.fillRect(0,0,width,height);
//reinit();
}
public void reinit(){
started=true;
x=0;y=0;
pp[0]=0;
for (int i=1;i<ruleNumber+1;i++){
pp[i]=pp[i-1]+p[i-1];
}
//running=true;
repaint();
}
public void run() {
while (true) {
if (running && count<200000) {
/*产生一个介于1到100之间的随机数*/
double E = Math.random();
u=0;
for(int i=0;i<ruleNumber;i++){
if(E >= pp[i] && E< pp[i+1]){
u=rule[0][i]*x+rule[1][i]*y+rule[2][i];
y=rule[3][i]*x+rule[4][i]*y+rule[5][i];
x=u;
break;
}
}
//画点
if(startChange==false && change==true){
offsetX[1]=offsetX[1]+(getX[1]-getX[0]);
offsetY[1]=offsetY[1]+(getY[1]-getY[0]);
startChange=true;
}
else if(startChange==false && change==false){
double length;
length=Math.sqrt((getX[1]-getX[0])*(getX[1]-getX[0])+(getY[1]-getY[0])*(getY[1]-getY[0]));
length=length*0.1;
if(getX[1]-getX[0]>0){
scale[1]=scale[1]*length;
}
else if (getX[1]-getX[0]<0){
scale[1]=scale[1]/length;
}
startChange=true;
}
gr=this.getGraphics();
gr.setColor(c);
gr.fillRect(width/2+(int)(scale[1]*x)+offsetX[1],height+10-(int)(scale[1]*y)+offsetY[1],1,1);
showStatus("Count:"+(count++));
try{Thread.sleep(delay);}catch(InterruptedException e){};//每隔delay秒cpu运算一次,也就是做一次decision
}
else{try{Thread.sleep(500);}catch(InterruptedException e){};}
}
}
/**Start the applet*/
public void start() {
if(runner==null){runner=new Thread(this);runner.start();}//启用线程
}
/**Stop the applet*/
public void stop() {
if(runner!=null){
runner.stop();
runner = null;
}
}
/**Destroy the applet*/
public void destroy() {
if(runner!=null){
runner.stop();
runner = null;
}
}
/**Get Applet information*/
public String getAppletInfo() {
return "Applet Information";
}
/**Get parameter info*/
public String[][] getParameterInfo() {
return null;
}
/**Main met
fractal_java.rar_java 树形
版权申诉
169 浏览量
2022-09-24
12:21:28
上传
评论
收藏 33KB RAR 举报
林当时
- 粉丝: 100
- 资源: 1万+
最新资源
- 基于Vue的电商购物网站设计源码
- 基于Java的elasticsearch视频教程配套Maven工程eshelloword设计源码
- 基于Typescript的兔子饭店经营类游戏源码设计免费送cocoscreator
- 基于Java的web快速开发数据权限管理脚手架wonder-server设计源码
- 基于Apache Log4cxx的C++日志库设计源码
- 基于Vue3的likeadmin免费任意商用管理后台设计源码
- 基于JavaScript的Chrome扩展WeNote分享插件设计源码
- 基于C++的中泰EM9108S动态库开发示例源码
- gxlx2-p291-1g.dts和gxlx2-p291-1g.dtb
- STM32WBxx Keil芯片包
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈