Newer
Older
src / java / KochscheKurve.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 *  Kochsche Kurve
 *
 * @author     Andreas Jaggi
 * @created    26. März 2004
 * @version    1.0
 */

public class KochscheKurve
		 extends JFrame {
	/**
	 *  Constructor for the KochscheKurve object
	 */
	public KochscheKurve() {
		setSize( 600, 600 );
		setTitle( "Die Kochsche Kurve" );
	}


	/**
	*  Überladene "interne" Methode, die aufgerufen wird, wenn das Fenster neu
	*  gezeichnet werden muss
	*
	* @param  g  Graphik-Objekt, auf dem gezeichnet wird
	*/
	public void paint( Graphics g ) {
		super.paint( g );

		double  x1;
		double  x2;
		double  x3;
		double  y1;
		double  y2;
		double  y3;
		int     depth  = 15;

		x1 = 100;
		y1 = 400;
		x2 = 500;
		y2 = 400;
		x3 = ( x2 - x1 ) * Math.cos( -Math.PI / 3 ) -
				( y2 - y1 ) * Math.sin( -Math.PI / 3 ) + x1;
		y3 = ( x2 - x1 ) * Math.sin( -Math.PI / 3 ) +
				( y2 - y1 ) * Math.cos( -Math.PI / 3 ) + y1;

		koch( g, depth, x2, y2, x1, y1 );
		koch( g, depth, x1, y1, x3, y3 );
		koch( g, depth, x3, y3, x2, y2 );
	}


	/**
	*  Rekursive Funktion, welche den Fraktal zwischen zwei Punkten bis zu einer
	*  bestimmten Tiefe zeichnet.
	*
	* @param  g      Graphik-Objekt, auf dem gezeichnet wird
	* @param  depth  Rekursionstiefe
	* @param  x1     X-Koordinate des ersten Punktes
	* @param  y1     Y-Koordinate des ersten Punktes
	* @param  x2     X-Koordinate des zweiten Punktes
	* @param  y2     X-Koordinate des zweiten Punktes
	*/
	public void koch( Graphics g, int depth, double x1, double y1, double x2,
			double y2 ) {
		double  x13  = x1 + ( x2 - x1 ) / 3.0;
		double  x23  = x1 + 2.0 * ( x2 - x1 ) / 3.0;

		double  y13  = y1 + ( y2 - y1 ) / 3.0;
		double  y23  = y1 + 2.0 * ( y2 - y1 ) / 3.0;

		double  xd   = ( x23 - x13 ) * Math.cos( -Math.PI / 3 ) -
				( y23 - y13 ) * Math.sin( -Math.PI / 3 ) + x13;
		double  yd   = ( x23 - x13 ) * Math.sin( -Math.PI / 3 ) +
				( y23 - y13 ) * Math.cos( -Math.PI / 3 ) + y13;

		if ( depth > 0 ) {
			koch( g, depth - 1, x1, y1, x13, y13 );
			koch( g, depth - 1, x13, y13, xd, yd );
			koch( g, depth - 1, xd, yd, x23, y23 );
			koch( g, depth - 1, x23, y23, x2, y2 );
		} else {
			g.drawLine( (int) x1, (int) y1, (int) x2, (int) y2 );
		}
	}


	/**
	*  The main program for the KochscheKurve class
	*
	* @param  args  The command line arguments
	*/
	public static void main( String[] args ) {
		KochscheKurve  graf  = new KochscheKurve();

		graf.setVisible( true );

		graf.addWindowListener(
			new WindowAdapter() {
				public void windowClosing( WindowEvent e ) {
					System.exit( 0 );
				}
			}
				 );

	}

}