# Pythagoras-Baum



## Rudi Rijkaard (25. Nov 2005)

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

```
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.



```
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);
	
	}}
	
}
```


----------



## bygones (25. Nov 2005)

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


----------



## rudirijkaard (25. Nov 2005)

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


----------



## Guest (25. Nov 2005)

Du kannst für jede Farbkomponente nur bis 255 gehen.
Ist die Rekursionstiefe > 50, dass ist "tiefe*5" > 255

```
public void drawTree(Graphics g,int ax,int ay,int bx,int by, int tiefe) {
  if(tiefe > 50)
    return;
  ...
}
```


----------



## Guest (25. Nov 2005)

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]


----------



## bygones (25. Nov 2005)

Anonymous hat gesagt.:
			
		

> also sollte ich die zeile
> 
> if((tiefe==0) ||(laenge<2)){
> 
> ...


weißt du wie man es am besten und schnellsten rausfinden...

man schreibt es in den code und lässt es mal laufen ?!


----------

