⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 leaf.java

📁 关于细胞自动机的例子
💻 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 + -