java分形树

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);
        }
    }
}

 

posted @ 2015-02-10 20:32  带狗狗带  Views(259)  Comments(0Edit  收藏  举报