分形树,递归研究

package com.test;

 
import java.awt.*; 
import java.awt.event.*;
import java.util.Random; 
import javax.swing.*; 
/**  *   * @author http://javaflex.iteye.com/  *  */ 
public class GraphicsTest extends JFrame implements ActionListener 
{     public static final double PI = Math.PI / 180; 
  JPanel panel;     
  JPanel pnlCtl;     
  JButton button;     
  JButton button2;     
  Graphics2D g2;      
  public GraphicsTest(String string){         
  super(string);     
  }      
  public void init(){         
  panel = new JPanel();         
  pnlCtl = new JPanel();         
  button = new JButton("分形树");         
  button2 = new JButton("清除");         
  this.add(panel, BorderLayout.CENTER);         
  button.addActionListener(this);         
  button2.addActionListener(this);         
  pnlCtl.add(button);         
  pnlCtl.add(button2);         
  this.add(pnlCtl, BorderLayout.NORTH);         
  setSize(800, 600);         
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         
  this.setVisible(true);         
  Dimension winSize = Toolkit.getDefaultToolkit().getScreenSize();         
  this.setLocation((winSize.width - this.getWidth()) / 2,   
  (winSize.height - this.getHeight()) / 2);         
  g2 = (Graphics2D) panel.getGraphics();     
 }      
   public static void main(String[] args) throws ClassNotFoundException,
   InstantiationException, IllegalAccessException,  UnsupportedLookAndFeelException {         
   UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());         
   GraphicsTest testPanel = new GraphicsTest("分形树:QQ:三2824七676");         
   testPanel.init();     
   }           
   @Override     
   public void actionPerformed(ActionEvent e) {         
   if ("分形树".equals(e.getActionCommand())) {             
   drawLeaf(g2, 400, 500, 100, 210+random.nextInt(100));         
  
   else if ("清除".equals(e.getActionCommand())) {            
   panel.getGraphics().clearRect(0, 0, 800, 800);         
   }     
   }     
   Random random=new Random();     
   public void  drawLeaf(Graphics g, double x, double y, double L, double a) {         
   //random=new Random();         //可以方面速度画以了解其算法 //      
   /*try { //          
   Thread.sleep(1000); //      
   } catch (InterruptedException e) { 
   //          // TODO Auto-generated catch block //          
   e.printStackTrace(); //      
   }  */       
   int red = random.nextInt(127);         
   int green = random.nextInt(127);         
   int blue = random.nextInt(127); 
   //随机颜色         
   g.setColor(new Color(red, green, blue));         
   double x1, x2, x1L, x2L, x2R, x1R, y1, y2, y1L, y2L, y2R, y1R;         
   float deflection = 50-random.nextInt(20);
   //侧干主干的夹角         
   float intersection = random.nextInt(40)-20;
   //主干偏转角度         
   float depth = 2+random.nextInt(2);
   //限制递归深度         
   float ratio = 3f;
   //主干侧干长度比(可调整使其更茂密或稀疏)         
   float ratio2 = 1.2f;
   //上级主干与本级主干长度比(可调整使其变高低)        
   if (L > depth) {             
   x2=x+L*Math.cos(a*PI);             
   y2=y+L*Math.sin(a*PI);             
   x2R=x2+L/ratio*Math.cos((a+deflection)*PI);             
   y2R=y2+L/ratio*Math.sin((a+deflection)*PI);             
   x2L=x2+L/ratio*Math.cos((a-deflection)*PI);             
   y2L=y2+L/ratio*Math.sin((a-deflection)*PI);             
   x1=x+L/ratio*Math.cos(a*PI);             
   y1=y+L/ratio*Math.sin(a*PI);             
   x1L=x1+L/ratio*Math.cos((a-deflection)*PI);             
   y1L=y1+L/ratio*Math.sin((a-deflection)*PI);             
   x1R=x1+L/ratio*Math.cos((a+deflection)*PI);             
   y1R=y1+L/ratio*Math.sin((a+deflection)*PI);             
   g.drawLine((int)x,(int)y,(int)x2,(int)y2);            
   g.drawLine((int)x2,(int)y2,(int)x2R,(int)y2R);             
   g.drawLine((int)x2,(int)y2,(int)x2L,(int)y2L);            
   g.drawLine((int)x1,(int)y1,(int)x1L,(int)y1L);          
   g.drawLine((int)x1,(int)y1,(int)x1R,(int)y1R);             
   drawLeaf(g,x2,y2,L/ratio2,a+intersection);             
   drawLeaf(g,x2R,y2R,L/ratio,a+deflection);            
   drawLeaf(g,x2L,y2L,L/ratio,a-deflection);            
   drawLeaf(g,x1L,y1L,L/ratio,a-deflection);            
   drawLeaf(g,x1R,y1R,L/ratio,a+deflection);        
   }     
  
  
  
 
}


 

你可能感兴趣的:(递归,分形树)