pythagoreantree/src/PythagorasTree.java
Jan Christian Grünhage 254a02f89d Bugfix and Additional Information
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
2015-02-11 21:16:59 +01:00

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,
}
}