// see http://www.lrdev.com/lr/java/javaturtle.html // use http://www.lrdev.com/lr/java/javaturtle.zip (a jar, Java class bytecode and sources) import com.lrdev.turtle.PersistentTurtle; import com.lrdev.turtle.Turtle; import java.awt.BorderLayout; import java.awt.Graphics; import javax.swing.JFrame; import javax.swing.JPanel; public class simplefractaltree extends JPanel { private final PersistentTurtle turtle_ = createTree(); public static void main(final String[] args) { (new simplefractaltree()).createUI(createFrame()); } protected static JFrame createFrame() { final JFrame frame = new JFrame("simple fractal tree"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(300, 300, 600, 600); frame.setPreferredSize(frame.getSize()); // hint to pack() return frame; } protected void createUI(final JFrame frame) { frame.getContentPane().add(this, BorderLayout.CENTER); frame.pack(); frame.setVisible(true); } protected PersistentTurtle createTree() { final PersistentTurtle turtle = new PersistentTurtle(); turtle.center(); turtle.setHeadingMode(Turtle.DEGREE); turtle.left(90); // up draw(turtle); return turtle; } protected void paintComponent(final Graphics g) { super.paintComponent(g); // let draw background turtle_.paint(g, getBounds()); // PersistentTurtle already drawn, paints now } protected void draw(final Turtle turtle) { draw(turtle, 1, 0.7, 25, 8); } // draws everything twice, as the pen isn't taken off when going back protected void draw(final Turtle turtle, final double distance, final double distanceFactor, final double omega, final int depth) { if (depth> 0) { // recursion-end check turtle.forward(distance); // trunk turtle.left(omega); // orient towards left branch draw(turtle, distance * distanceFactor, distanceFactor, omega, depth - 1); turtle.right(2 * omega); // orient towards right branch draw(turtle, distance * distanceFactor, distanceFactor, omega, depth - 1); turtle.left(omega); // back to origin turtle.back(distance); } } }