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; 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; } public void addPythagorasTree(PythagorasTreeQueue queue) { if (momentaryDepth + 1 >= maximalDepth) return; turtle.forward(size); turtle.pushState(); turtle.right(triangles.getLeftAngle(momentaryDepth)); PythagorasTree treeOne = queue.remove(); treeOne.drawPythagorasTree(queue); turtle.popState(); turtle.setPenColor(drawColor(momentaryDepth, maximalDepth)); turtle.left(triangles.getRightAngle(momentaryDepth)); turtle.forward(size * triangles.getRightSizeFactor(momentaryDepth)); PythagorasTree treeTwo = queue.remove(); treeTwo.drawPythagorasTree(queue); treeOne.addPythagorasTree(queue); treeTwo.addPythagorasTree(queue); } public void drawPythagorasTree(PythagorasTreeQueue queue) { rightSubTree = new PythagorasTree(variant, triangles, turtle, size * triangles.getRightSizeFactor(momentaryDepth), momentaryDepth + 1, maximalDepth); queue.add(rightSubTree); leftSubTree = new PythagorasTree(variant, triangles, turtle, size * triangles.getLeftSizeFactor(momentaryDepth), momentaryDepth + 1, maximalDepth); queue.add(leftSubTree); DrawingTools.drawSquare(turtle, size); } 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, } }