Below is my solution to the homework:
import java.awt.Graphics;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Fractal extends JPanel {
private double length;
public int numLevels;
public void paintComponent(Graphics g) {
g.setColor(Color.black);
System.out.println("Drawing");
Point from = new Point(150,200);
Point to = new Point(450,200);
length = 0;
// drawFractalLineDragon(g,from,to,numLevels,Direction.Right);
drawFractalLine(g,from,to,numLevels);
// from = new Point(100,400);
// Point top = new Point(300,100);
// to = new Point(500,400);
// drawFractalLineSierpinsky(g,from,top,to,numLevels);
System.out.println("Length of curve is " + length);
}
/**
* Draw the Sierpinsky triangle http://en.wikipedia.org/wiki/Sierpinski_triangle
* @param g
* @param from bottom-left
* @param top
* @param to bottom-right
* @param level
*/
public void drawFractalLineSierpinsky(Graphics g, Point from, Point top, Point to, int level) {
if (level == 0) {
g.drawLine(from.getX(), from.getY(), to.getX(), to.getY());
length += from.getVectorTo(to).getMagnitude();
g.drawLine(from.getX(), from.getY(), top.getX(), top.getY());
length += from.getVectorTo(top).getMagnitude();
g.drawLine(top.getX(), top.getY(), to.getX(), to.getY());
length += top.getVectorTo(to).getMagnitude();
return;
}
Point midFromTop = from.getMidPoint(top);
Point midFromTo = from.getMidPoint(to);
Point midTopTo = top.getMidPoint(to);
drawFractalLineSierpinsky(g,from, midFromTop, midFromTo,level-1);
drawFractalLineSierpinsky(g,midFromTop, top, midTopTo, level-1);
drawFractalLineSierpinsky(g,midFromTo, midTopTo, to, level-1);
}
/**
* Draws the Levy C Curve http://en.wikipedia.org/wiki/Levy_C_curve
* @param g
* @param from start point
* @param to end point
* @param level number of recursive levels.
*/
public void drawFractalLine(Graphics g, Point from, Point to, int level) {
if (level == 0) {
g.drawLine(from.getX(), from.getY(), to.getX(), to.getY());
length += from.getVectorTo(to).getMagnitude();
// System.out.println(from + " " + to);
return;
}
Point mid = from.getMidPoint(to);
Vector delta = from.getVectorTo(to);
delta = delta.getPerpendicularRight();
delta = delta.multiplyBy(0.5); //half its magnitude
mid = mid.addVector(delta);
drawFractalLine(g,from,mid,level-1);
drawFractalLine(g,mid,to,level-1);
}
public enum Direction {Right,Left};
/**
* Draws the Dragon curve http://en.wikipedia.org/wiki/Dragon_curve
* @param g
* @param from
* @param to
* @param level
* @param d
*/
public void drawFractalLineDragon(Graphics g, Point from, Point to, int level, Direction d) {
if (level == 0) {
g.drawLine(from.getX(), from.getY(), to.getX(), to.getY());
length += from.getVectorTo(to).getMagnitude();
// System.out.println(from + " " + to);
return;
}
Point mid = from.getMidPoint(to);
Vector delta = from.getVectorTo(to);
if (d == Direction.Right) {
delta = delta.getPerpendicularRight();
} else {
delta = delta.getPerpendicularLeft();
}
delta = delta.multiplyBy(0.5); //half its magnitude
mid = mid.addVector(delta);
drawFractalLineDragon(g,from,mid,level-1,Direction.Right);
drawFractalLineDragon(g,mid,to,level-1,Direction.Left);
}
/**
* @param args
*/
public static void main(String[] args) {
JFrame frame = new JFrame("Fractal Curve");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Fractal panel = new Fractal();
frame.add(panel);
frame.setSize(600,600);
frame.setVisible(true);
try {
do {
String userInput = JOptionPane.showInputDialog("How Many Levels?");
panel.numLevels = Integer.parseInt(userInput);
frame.repaint(); //don't forget to re-paint it !
} while (true);
} catch (NumberFormatException e) {
//ignore it, just exit program
System.exit(0);
}
}
}