Drachenkurve

Bratkartoffel

gebratene Kartoffel
Premium-User
Hallo Leute,

habe heute in der Schule die Aufgabe bekommen, eine Drachenkurve in einem Applet zu zeichnen.
Leider stecke ich da komplett fest.

Habe mir den Wiipedia Artikel mindestens 10x durchgelesen und komme einfach nicht weiter.
Vom Prinzip her (glaube ich) hab ichs verstanden. Also zumindest weitestgehend... Ich weiß nur nicht, wie ich der Drachenkurve sagen soll, dass er bei der Mitte dann statt rechts mal links gehen soll. Soll ich da einen Parameter mitgeben, der ihn sagt, wohin er soll? Woher weiß ich dann, dass er schon einmal links gegangen ist, und nicht die ganze Zeit nach links geht?

Ich hoffe ich konnte mich einigermaßen ausdrücken und ihr versteht was ich meine.
Hier ist meine Funktion, so wie sie bisher aussieht.

Java:
public void drawDrachenkurve(int Ordnung, int KantenLaenge) {
		switch(Ordnung) {
		case 0:
			this.drehen(90);
			this.movVor(KantenLaenge);
			return;
		case 1:
			drawDrachenkurve(0, KantenLaenge);
			this.drehen(90);
			this.movVor(KantenLaenge);
			return;
		default:
			drawDrachenkurve(Ordnung-1, KantenLaenge);
			this.drehen(90);
			this.movVor(KantenLaenge);
			drawDrachenkurve(Ordnung-1, KantenLaenge);   // Hier weiß ich nicht weiter :(
			return;
		}
	}

Ach ja, ich verwende eine einfache Turtle-Klasse. Zur Erklärung:

drehen(Grad: int): void ............... Dreht die Turtle um x Grad
movVor(Strecke: int) : void .................... Bewegt die Turtle um x Pixel nach vorne


Gruß
Bratkartoffel
 
ich weiß zwar nicht was du mit drachen kurve meist....
aber vielleicht hilft dir der befehl drawline ja weiter...

Java:
import java.applet.Applet;
import java.awt.Graphics;

public class Anwendung extends Applet{

	private static final long serialVersionUID = 1L;
	public void paint(Graphics g) {
		
		this.setSize(170,90);
		g.drawLine(110, 10, 160, 40);
		g.drawLine(160, 40, 110, 80);
		g.drawLine(110, 80, 10, 40);
		g.drawLine(10, 40, 110, 10);
		
		g.drawLine(110, 10, 110, 80);
		g.drawLine(10, 40, 160, 40);
	}
}
 
also ich glaub ich bin zu blöd....
ich raf nicht wie sich diese Drachen kurve weiterentwickelt..
Code:
R
R RL
R RL RRLL
R RL RRLL RRRLL RLL
R RL RRLL RRRLL RLL RRRLRRLLLRRLLRLL

aber ich hab ka, wie die nächste Zeile aussehen würde
 
Also soweit ich weiß wird die Drachenkurve N erstellt, indem man die Drachenkurve n-1 zeichnet, dann einmal rechts zeichnet und dann nochmal die Drachenkurve n-1 zeichnet, da wird dann allerdings genau in der Mitte einmal nit nach rechts sondern nach links gezeichnet.

Das ist auch mein problem. Wie sag ich ihm dass,
a) wo ist genau die Mitte
b) gehe nur dort einmal nach links

Gruß
Kartoffel
 
also würde sich die Reihe so fortsetzen?
Code:
R
RRL
RRL R RLL
RRLRRLL R RRLLRLL
RRLRRLLRRRLLRLL R RRLRRLLLRRLLRLL
RRLRRLLRRRLLRLLRRRLRRLLLRRLLRLL R RRLRRLLRRRLLRLLRRRLRRLLLRRLLRLL
RRLRRLLRRRLLRLLRRRLRRLLLRRLLRLLRRRLRRLLRRRLLRLLRRRLRRLLLRRLLRLL R RRLRRLLRRRLLRLLRRRLRRLLLRRLLRLLRRRLRRLLRRRLLRLLRRRLRRLLLRRLLRLL
 
Oh mein Gott, ne die ganzen Buchstaben schaue ich mir nicht an ;) Aber ich denke dass du es vom Prinzip her verstanden hast....

Jetzt brauche ich nur noch ne Lösung :D
Das Problem an der Sache ist nur, ich krieg darauf ne Note... Ich wäre für alles dankbar, auch für eine Komplettlösung, also nur die Funktion...
 
http://did.mat.uni-bayreuth.de/~alfred/Dragon/d1.html
Java:
import java.awt.*;
import java.applet.*;

public class Anwendung extends Applet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	Image im = null;
	Graphics gr = null;
	Dimension d = null;
	Panel leiste = null;
	
	double ds;
	int startx, starty;
	double turtx, turty, wi;
	int grad, mgrad;

	public void init() {
		leiste = new Panel();
		leiste.add(new Button("less"));
		leiste.add(new Button("more"));
		leiste.add(new Button("reset"));
		add("North",leiste);

		d = size();
		im = createImage( d.width, d.height );
		gr = im.getGraphics();

	}	
	
	public void start() {
		startx = 150;
		starty = 250;
		turtx = startx;
		turty = starty;
		wi = 0;
		grad = 1;
		ds = (double)d.width/((double)grad*10.0);
		show();	
	}	
	
	public boolean action(Event e, Object arg) {
		if ("less".equals(arg)) {
			turtx = startx;
			turty = starty;
			wi = 0;
			if (grad>1) {
				ds *= 1.4142;
				grad--;
			}
			repaint();
			return true;
		}

		if ("more".equals(arg)) {
			turtx = startx;
			turty = starty;
			wi = 0;
			ds /= 1.4142;
			grad++;
			repaint();
			return true;
		}
				
		if ("reset".equals(arg)) {
			turtx = startx;
			turty = starty;
			wi = 0;
			grad = 1;
			ds = (double)d.width/((double)grad*10.0);
			repaint();
			return true;
		}
		return super.action(e,arg);
	}
			
	void forward (double h) {
		double dx = h * Math.cos( wi*Math.PI/180.0 );
		double dy = 2.0 * h * Math.sin( wi*Math.PI/180.0 );
		double tx = turtx + dx;
		double ty = turty + dy;

		gr.drawLine((int)(2.0*turtx),(int)(turty),(int)(2.0*tx),(int)ty);
		turtx = tx;
		turty = ty;
		
	}
	
	void turn (int alpha) {
		wi += alpha;
	}
	
	void dragon (int grad) {
		if (grad==0) {
			forward(ds);
		} else {
			if (grad>0) {
				if (mgrad==grad) gr.setColor(Color.black);
				dragon(grad-1);
				turn(90);
				if (mgrad==grad) gr.setColor(Color.red);
				dragon(1-grad);
			} else {
				dragon(-grad-1);
				turn(-90);
				dragon(grad+1);
			}
		}
	}
		
	public void paint( Graphics g ) {
		gr.clearRect(0,0, d.width, d.height );
		gr.setColor(Color.black);
		mgrad = grad;
		dragon(grad);
		g.drawImage( im, 0, 0, d.width, d.height, this );
	}
}
 
Zurück