import javax.swing.JFrame;


@SuppressWarnings("serial")
public class TurtleHilbertCurve extends TurtlePanel { // https://en.wikipedia.org/wiki/Hilbert_curve 4/20/26
	
	private int depth = 7;
	private double size, lineLength, margin = 0.9;
	
	/*
	 * Adapted from https://github.com/asweigart/the-recursive-book-of-recursion/blob/main/hilbertCurve.py
	 */
	
	private void quadrant(int level, double angle) {
		if (level > 0) {
			right(angle);
			quadrant(level - 1, -angle);
			forward(lineLength);
			left(angle);
			quadrant(level - 1, angle);
			forward(lineLength);
			quadrant(level - 1, angle);
			left(angle);
			forward(lineLength);
			quadrant(level - 1, -angle);
			right(angle);
		}
	}
	
	
	@Override
	public void turtleMain() {
		// move to the lower left facing right
		size = Math.min(width, height);
		up();
		backward(margin * size / 2);
		right(90);
		forward (margin * size / 2);
		left(90);
		down();
		// produce the Hilbert space-filling curve
		lineLength = margin * size / Math.pow(2, depth);
		quadrant(depth, -90);
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(250, 250);
		frame.setTitle("Turtle Koch Curve Fractal");
		frame.add(new TurtleHilbertCurve());
		frame.setVisible(true);
	}

}
