Pythagoras-Baum

  • Themenstarter Themenstarter Rudi Rijkaard
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
R

Rudi Rijkaard

Gast
hallo
ich hab ein kleines applet geschrieben, dass den pythagorasbaum rekursiv zeichnen soll
den code habe ich beigefügt
lieber gleich im voraus:ich bin noch blutiger java-anfänger
also nicht erschrecken, falls ein paar blöde fehler darin auftauchen
aber ich denke mal bis zur eigentlichen rekursion habe ich alles einigermaßen richtig gemacht
und zwar soll dann noch zusätzlich die farbe des quadrats in abhängigkeit der rekursionstiefe so variiert werden,dass die blätter des baumes immer grüner werden
ich hab das auch einigermaßen hinbekommen aber wenn ich das applet dann ausführe kommt manchmal die fehlermeldung(ebenfalls beigefügt), dass wohl anscheinend die zeile "farbebaum=new Color(80,tiefe*5,0);" fehlerhaft ist
wie kann ich diesen fehler am besten korrigieren?
sind zudem insbesondere die zeilen
Code:
if((tiefe==0) ||(laenge<2)){
	    g.drawLine(b-ax,h-ay,b-bx,h-by);
	}else{

drawTree(g,dx,dy,ex,ey,tiefe+1);
drawTree(g,ex,ey,cx,cy,tiefe+1);

richtig?
bitte um schnelle antwort


java.lang.IllegalArgumentException: Color parameter outside of expected range: Green
at java.awt.Color.testColorValueRange(Unknown Source)
at java.awt.Color.<init>(Unknown Source)
at java.awt.Color.<init>(Unknown Source)
at pythagoras.drawTree(pythagoras.java:23)
at pythagoras.drawTree(pythagoras.java:50)
at pythagoras.drawTree(pythagoras.java:51)
at pythagoras.paint(pythagoras.java:11)
at sun.awt.RepaintArea.paint(Unknown Source)
at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
java.lang.IllegalArgumentException: Color parameter outside of expected range: Green
at java.awt.Color.testColorValueRange(Unknown Source)
at java.awt.Color.<init>(Unknown Source)
at java.awt.Color.<init>(Unknown Source)
at pythagoras.drawTree(pythagoras.java:23)
at pythagoras.drawTree(pythagoras.java:50)
usw.


Code:
import java.applet.Applet;
import java.awt.*;

public class pythagoras extends Applet {
		

	public void init(){
	}

	public void paint (Graphics g){
	    drawTree(g,50,100,150,100,20);
	}
    public void drawTree(Graphics g,int ax,int ay,int bx,int by, int tiefe){
        int abx=bx-ax;
	    int aby=by-ay;
	    double laenge=Math.sqrt(abx*abx+aby*aby);
	int b=getWidth()-100;
	int h=getHeight()-100;
	if((tiefe==0) ||(laenge<2)){
	    g.drawLine(b-ax,h-ay,b-bx,h-by);
	}else{
		Color farbebaum;
		farbebaum=new Color(80,tiefe*5,0);
		g.setColor(farbebaum);
		
    int bcx=aby;
    int bcy=-abx;
	int cx=bx-bcx;
	int cy=by-bcy;
	int dx=ax-bcx;
	int dy=ay-bcy;
	
    g.drawLine(b-ax,h-ay,b-bx,h-by);
	g.drawLine(b-bx,h-by,b-cx,h-cy);
	g.drawLine(b-ax,h-ay,b-dx,h-dy);
	g.drawLine(b-dx,h-dy,b-cx,h-cy);
	
	double r1=0.2;
	double r2=0.8;
    double r=(r1+Math.random()*(r2-r1));
	double dpx=r*abx;
	double dpy=r*aby;
	
	double PE=Math.sqrt(r*(1-r))*laenge;
	double einheitsvektorx=(1/laenge)*bcx;
	double einheitsvektory=(1/laenge)*bcy;
	int ex= (int) (dx+dpx-(PE*einheitsvektorx));
	int ey= (int) (dy+dpy-(PE*einheitsvektory));
	
    drawTree(g,dx,dy,ex,ey,tiefe+1);
	drawTree(g,ex,ey,cx,cy,tiefe+1);
	
	}}
	
}
 
naja - die range, die man bei farbwerten angeben kann ist 0-255. Du hast eine zahl die größer ist als 255, daher der Fehler
 
du meinst wohl die zeile : farbebaum=new Color(80,tiefe*5,0);
aber wieso wird der der grün-farbwert größer als 255
ich hab doch tiefe=20
da kann doch farbwert maximal den wert 20*5=100 annehmen oder hab ich da was komplett falsch verstanden?

gruß
rudi
 
Du kannst für jede Farbkomponente nur bis 255 gehen.
Ist die Rekursionstiefe > 50, dass ist "tiefe*5" > 255
Code:
public void drawTree(Graphics g,int ax,int ay,int bx,int by, int tiefe) {
  if(tiefe > 50)
    return;
  ...
}
 
also sollte ich die zeile

if((tiefe==0) ||(laenge<2)){

einfach durch

if(tiefe > 50) ||(laenge<2)){

ersetzen und dann sollte es funktionieren oder wie?[/code]
 
Anonymous hat gesagt.:
also sollte ich die zeile

if((tiefe==0) ||(laenge<2)){

einfach durch

if(tiefe > 50) ||(laenge<2)){

ersetzen und dann sollte es funktionieren oder wie?
weißt du wie man es am besten und schnellsten rausfinden...

man schreibt es in den code und lässt es mal laufen ?!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben