254a02f89d
The window header now includes which level the tree has at the moment and which is the target depth. also fixed the bug causing one additional line at the end of each square. this line wold be part of the next square, but when the tree is finished, the final squares should not have little additional lines coming out of them
81 lines
3.1 KiB
Java
81 lines
3.1 KiB
Java
import ch.aplu.turtle.Turtle;
|
|
|
|
import java.awt.*;
|
|
import java.util.LinkedList;
|
|
|
|
/**
|
|
* Created by Christian on 10.02.2015.
|
|
*/
|
|
public class PythagorasTree {
|
|
private PythagorasTree rightSubTree;
|
|
private PythagorasTree leftSubTree;
|
|
private PythagorasTreeVariant variant;
|
|
private PythagorasTriangleList triangles;
|
|
private Turtle turtle;
|
|
private double size;
|
|
private int momentaryDepth;
|
|
private int maximalDepth;
|
|
private TurtleState turtleState;
|
|
|
|
public PythagorasTree(PythagorasTreeVariant variant, PythagorasTriangleList triangles, Turtle turtle, double size, int momentaryDepth, int maximalDepth) {
|
|
this.variant = variant;
|
|
this.triangles = triangles;
|
|
this.turtle = turtle;
|
|
this.size = size;
|
|
this.momentaryDepth = momentaryDepth;
|
|
this.maximalDepth = maximalDepth;
|
|
this.turtleState = new TurtleState(turtle);
|
|
}
|
|
|
|
public static boolean drawNextTree(PythagorasTreeQueue queue) {
|
|
PythagorasTree tree = queue.remove();
|
|
|
|
tree.turtle.getFrame().setTitle("Pythagoras Tree - Depth: " + tree.momentaryDepth + " - Target Depth: " + tree.maximalDepth);
|
|
|
|
tree.turtle.setPenColor(drawColor(tree.momentaryDepth, tree.maximalDepth));
|
|
tree.turtleState.returnToState(tree.turtle);
|
|
DrawingTools.drawSquare(tree.turtle, tree.size);
|
|
|
|
if (tree.momentaryDepth + 1 >= tree.maximalDepth) return false;
|
|
|
|
tree.turtle.forward(tree.size);
|
|
|
|
tree.turtle.pushState();
|
|
tree.turtle.right(tree.triangles.getLeftAngle(tree.momentaryDepth));
|
|
tree.rightSubTree = new PythagorasTree(tree.variant, tree.triangles, tree.turtle, tree.size * tree.triangles.getRightSizeFactor(tree.momentaryDepth), tree.momentaryDepth + 1, tree.maximalDepth);
|
|
queue.add(tree.rightSubTree);
|
|
|
|
tree.turtle.popState();
|
|
tree.turtle.left(tree.triangles.getRightAngle(tree.momentaryDepth));
|
|
|
|
tree.turtle.penUp();
|
|
tree.turtle.forward(tree.size * tree.triangles.getRightSizeFactor(tree.momentaryDepth));
|
|
tree.turtle.penDown();
|
|
|
|
|
|
tree.leftSubTree = new PythagorasTree(tree.variant, tree.triangles, tree.turtle, tree.size * tree.triangles.getLeftSizeFactor(tree.momentaryDepth), tree.momentaryDepth + 1, tree.maximalDepth);
|
|
queue.add(tree.leftSubTree);
|
|
return true;
|
|
}
|
|
|
|
public static Color drawColor(int momentaryDepth, int maximalDepth) {
|
|
|
|
double colorFactor = 255 / maximalDepth;
|
|
|
|
int red = (int) (colorFactor * (maximalDepth - momentaryDepth));
|
|
if (red > 139) red = 139;
|
|
if (red < 0) red = 0;
|
|
int green = 255 - (int) (colorFactor * (maximalDepth - momentaryDepth));
|
|
if (green < 69) green = 69;
|
|
int blue = (int) (colorFactor * ((maximalDepth - momentaryDepth) / 5));
|
|
if (blue > 19) blue = 19;
|
|
return new Color(red, green, blue);
|
|
}
|
|
|
|
public enum PythagorasTreeVariant {
|
|
SymetricPythagorasTree, AsymetricPythagorasTree, RegularRandomPythagorasTree,
|
|
PisanoPythagorasTreeOne, PisanoPythagorasTreeTwo, PisanoPythagorasTreeThree, PisanoPythagorasTreeFour, PisanoPythagorasTreeFive,
|
|
unselected,
|
|
}
|
|
}
|