2015-02-10 16:51:44 +00:00
|
|
|
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;
|
2015-02-10 17:13:13 +00:00
|
|
|
private TurtleState turtleState;
|
2015-02-10 16:51:44 +00:00
|
|
|
|
|
|
|
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;
|
2015-02-10 17:13:13 +00:00
|
|
|
this.turtleState = new TurtleState(turtle);
|
2015-02-10 16:51:44 +00:00
|
|
|
}
|
|
|
|
|
2015-02-10 17:13:13 +00:00
|
|
|
public void addSubTrees(PythagorasTreeQueue queue) {
|
2015-02-10 16:51:44 +00:00
|
|
|
turtle.pushState();
|
|
|
|
turtle.right(triangles.getLeftAngle(momentaryDepth));
|
2015-02-10 17:13:13 +00:00
|
|
|
rightSubTree = new PythagorasTree(variant, triangles, turtle, size * triangles.getRightSizeFactor(momentaryDepth), momentaryDepth + 1, maximalDepth);
|
|
|
|
queue.add(rightSubTree);
|
2015-02-10 16:51:44 +00:00
|
|
|
|
|
|
|
turtle.popState();
|
|
|
|
turtle.left(triangles.getRightAngle(momentaryDepth));
|
|
|
|
turtle.forward(size * triangles.getRightSizeFactor(momentaryDepth));
|
|
|
|
leftSubTree = new PythagorasTree(variant, triangles, turtle, size * triangles.getLeftSizeFactor(momentaryDepth), momentaryDepth + 1, maximalDepth);
|
|
|
|
queue.add(leftSubTree);
|
2015-02-10 17:13:13 +00:00
|
|
|
}
|
2015-02-10 16:51:44 +00:00
|
|
|
|
2015-02-10 17:13:13 +00:00
|
|
|
public boolean drawPythagorasTree(PythagorasTreeQueue queue) {
|
|
|
|
turtle.setPenColor(drawColor(momentaryDepth, maximalDepth));
|
|
|
|
turtleState.returnToState(turtle);
|
2015-02-10 16:51:44 +00:00
|
|
|
DrawingTools.drawSquare(turtle, size);
|
2015-02-10 17:23:13 +00:00
|
|
|
turtle.forward(size);
|
2015-02-10 17:13:13 +00:00
|
|
|
if (momentaryDepth + 1 >= maximalDepth) return false;
|
|
|
|
addSubTrees(queue);
|
|
|
|
return true;
|
2015-02-10 16:51:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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,
|
|
|
|
}
|
|
|
|
}
|