📄 leaf.java
字号:
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 keatskk@sina.com * @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 method*/ public static void main(String[] args) { leaf applet = new leaf(); applet.isStandalone = true; Frame frame; frame = new Frame() { protected void processWindowEvent(WindowEvent e) { super.processWindowEvent(e); if (e.getID() == WindowEvent.WINDOW_CLOSING) { System.exit(0); } } public synchronized void setTitle(String title) { super.setTitle(title); enableEvents(AWTEvent.WINDOW_EVENT_MASK); } }; frame.setTitle("Applet Frame"); frame.add(applet, BorderLayout.CENTER); applet.init(); applet.start(); frame.setSize(300,370); Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); frame.setLocation((d.width - frame.getSize().width) / 2, (d.height - frame.getSize().height) / 2); frame.setVisible(true); } public void paint (Graphics g) { if (started=true){ g.clearRect(0,0,300,300); g.setColor(bg); g.fillRect(0,0,300,300); count=0; started=false; } else{count=0;}; /*将指定点画为绿色*/// g=this.getGraphics();// g.setColor();// g.fillRect(150+(int)(30*x),310-(int)(30*y),1,1); //putpixel(300+(int)(45*x),465-(int)(45*y),GREEN); } void btnStart_actionPerformed(ActionEvent e) { if(btnStart.getLabel()=="开始"){ running=true; btnStart.setLabel("暂停"); } else if(btnStart.getLabel()=="暂停"){ running=false; btnStart.setLabel("开始"); } } void btnSet_actionPerformed(ActionEvent e) { running=false; IFSControl ctl=new IFSControl(this); ctl.setSize(750,250); ctl.show(); } void btnAbout_actionPerformed(ActionEvent e) { running=false; IFSAbout cml=new IFSAbout(this); cml.setSize(500,400); cml.show(); } void choice1_itemStateChanged(ItemEvent e) { int k=choice1.getSelectedIndex(); //count=-50; //给定参数(试验) for (int i=0;i<6;i++){ for(int j=0;j<ruleNumber;j++){ rule[i][j]=0; } p[i]=0; } if(k==0){ ruleNumber=4; scale[0]=30; scale[1]=30; offsetX[0]=0;offsetY[0]=0; offsetX[1]=0;offsetY[1]=0; 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[] //参数给定结束 } if(k==1){ ruleNumber=4; scale[0]=75; scale[1]=75; offsetX[0]=-100;offsetY[0]=-30; offsetX[1]=-100;offsetY[1]=-30; rule[0][0]=0.5; rule[1][0]=0; rule[2][0]=0; rule[3][0]=0; rule[4][0]=0.5;rule[5][0]=0; rule[0][1]=0.5; rule[1][1]=0; rule[2][1]=2; rule[3][1]=0; rule[4][1]=0.5; rule[5][1]=0; rule[0][2]=-0.4; rule[1][2]=0; rule[2][2]=0; //rule[3][2]=1; rule[4][2]=0.4; rule[5][2]=1; rule[3][2]=-0.4; rule[4][2]=0.4; rule[5][2]=1; rule[0][3]=-0.5; rule[1][3]=0; rule[2][3]=2; rule[3][3]=0; rule[4][3]=0.5; rule[5][3]=1; p[0]=0.25;p[1]=0.25;p[2]=0.25;p[3]=0.25; } if(k==2){ ruleNumber=3; scale[0]=1; scale[1]=2.9; offsetX[0]=-150;offsetY[0]=15; offsetX[1]=-150;offsetY[1]=15; rule[0][0]=0.5; rule[1][0]=0; rule[2][0]=1; rule[3][0]=0; rule[4][0]=0.5;rule[5][0]=1; rule[0][1]=0.5; rule[1][1]=0; rule[2][1]=50; rule[3][1]=0; rule[4][1]=0.5; rule[5][1]=1; rule[0][2]=0.5; rule[1][2]=0; rule[2][2]=50; //rule[3][2]=1; rule[4][2]=0.4; rule[5][2]=1; rule[3][2]=0; rule[4][2]=0.5; rule[5][2]=50; p[0]=0.33;p[1]=0.33;p[2]=0.34; } if(k==3){ ruleNumber=4; scale[0]=410; scale[1]=410; offsetX[0]=-180;offsetY[0]=100; offsetX[1]=-180;offsetY[1]=100; rule[0][0]=0.6; rule[1][0]=0; rule[2][0]=0.18; rule[3][0]=0; rule[4][0]=0.6;rule[5][0]=0.36; rule[0][1]=0.6; rule[1][1]=0; rule[2][1]=0.18; rule[3][1]=0; rule[4][1]=0.6; rule[5][1]=0.12; rule[0][2]=0.4; rule[1][2]=0.3; rule[2][2]=0.27; //rule[3][2]=1; rule[4][2]=0.4; rule[5][2]=1; rule[3][2]=-0.3; rule[4][2]=0.4; rule[5][2]=0.36; rule[0][3]=0.4; rule[1][3]=-0.3; rule[2][3]=0.27; rule[3][3]=0.3; rule[4][3]=0.4; rule[5][3]=0.09; p[0]=0.25;p[1]=0.25;p[2]=0.25;p[3]=0.25; }if(k==4){ ruleNumber=2; scale[0]=6; scale[1]=6; offsetX[0]=0;offsetY[0]=-100; offsetX[1]=0;offsetY[1]=-100; rule[0][0]=0.8; rule[1][0]=0.3; rule[2][0]=-0.2; rule[3][0]=0.9; rule[4][0]=-0.9;rule[5][0]=-0.1; rule[0][1]=0.09; rule[1][1]=0.52; rule[2][1]=-0.46; rule[3][1]=-0.38; rule[4][1]=0.79; rule[5][1]=8.10; //rule[0][2]=0.4; rule[1][2]=0.3; rule[2][2]=0.27; p[0]=0.79;p[1]=0.21; }if(k==5){ ruleNumber=4; scale[0]=400; scale[1]=400; offsetX[0]=-50;offsetY[0]=-20; offsetX[1]=-50;offsetY[1]=-20; rule[0][0]=0.29; rule[1][0]=0.4; rule[2][0]=-0.4; rule[3][0]=0.3; rule[4][0]=0.28;rule[5][0]=0.44; rule[0][1]=0.33; rule[1][1]=-0.34; rule[2][1]=0.39; rule[3][1]=0.4; rule[4][1]=0.41; rule[5][1]=0; rule[0][2]=0.42; rule[1][2]=0; rule[2][2]=0; //rule[3][2]=1; rule[4][2]=0.4; rule[5][2]=1; rule[3][2]=0.63; rule[4][2]=0.29; rule[5][2]=0.36; rule[0][3]=0.61; rule[1][3]=0; rule[2][3]=0; rule[3][3]=0.61; rule[4][3]=0.19; rule[5][3]=0.23; p[0]=0.25;p[1]=0.25;p[2]=0.25;p[3]=0.25; } if(k==6){ ruleNumber=3; scale[0]=150; scale[1]=150; offsetX[0]=-150;offsetY[0]=0; offsetX[1]=-150;offsetY[1]=0; rule[0][0]=0.5; rule[1][0]=0; rule[2][0]=0; rule[3][0]=0; rule[4][0]=0.5;rule[5][0]=0; rule[0][1]=0.5; rule[1][1]=0; rule[2][1]=1; rule[3][1]=0; rule[4][1]=0.5; rule[5][1]=0; rule[0][2]=0.5; rule[1][2]=0; rule[2][2]=0.5; rule[3][2]=0; rule[4][2]=0.5; rule[5][2]=0.5; p[0]=0.33;p[1]=0.33;p[2]=0.33;p[3]=0.34; } reinit(); } void this_mousePressed(MouseEvent e) { startChange=true; getX[0]=e.getX(); getY[0]=e.getY(); } void choice2_itemStateChanged(ItemEvent e) { int k=choice2.getSelectedIndex(); if (k==0){ change=true;// setCursor(MOVE_CURSOR); } if (k==1){ change=false;// setCursor(SW_RESIZE_CURSOR); } } void this_mouseReleased(MouseEvent e) { //e. getX[1]=e.getX(); getY[1]=e.getY(); startChange=false; reinit(); } void reset_actionPerformed(ActionEvent e) { offsetX[1]=offsetX[0]; offsetY[1]=offsetY[0]; scale[1]=scale[0]; reinit(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -