dfad27a51c
The first Implementation of the "KilianEhrmanPythagorasTree". this tree is just a crap... look at the code for calculating the angles yourself. looks nice though
85 lines
3.3 KiB
Java
85 lines
3.3 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) {
|
|
if (queue.size() == 0) return false;
|
|
PythagorasTree tree = queue.remove();
|
|
|
|
if (tree.momentaryDepth > tree.maximalDepth) return true;
|
|
|
|
tree.turtle.getFrame().setTitle("Pythagoras Tree - Depth: " + tree.momentaryDepth + " - Target Depth: " + tree.maximalDepth + " - Queuesize: " + queue.size());
|
|
|
|
tree.turtle.setPenColor(drawColor(tree.momentaryDepth, tree.maximalDepth));
|
|
tree.turtleState.returnToState(tree.turtle);
|
|
DrawingTools.drawSquare(tree.turtle, tree.size);
|
|
|
|
if (tree.momentaryDepth >= tree.maximalDepth) return true;
|
|
|
|
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,
|
|
KilianEhrmannPythagorasTree,
|
|
unselected,
|
|
}
|
|
}
|