# weihnachtsbaum



## annawald (4. Dez 2009)

Halllo!

Ich muss mit einer for-schleife ein programm schreiben, das mir einen weihnachtsbaum zeichnet. das ganze mit lines. ich habe es schon mit triangle gemacht, aber da sieht es einfachnicht gleichmäßig aus.



kann mir jemand helfen (ich arbeite mit processing)

hier ist der code (mit triangle)


```
void setup() {  
  
  size(500, 500);
  
  baum(140, 10, 3);
  
}


void baum(int x, int y, int ebenen) {
  
 int breite = 40;
   fill(#00ff00);
   noStroke();
   
 for(int i = 1; i <= ebenen; i = i + 1) {
  
 triangle(x, y, x + breite, y+100, x-breite, y+100);
  
  y = y + 75;
  breite = breite + 20;
  } 
}
```

wär schön, wenn mir jemand helfen könnte den umzuschreiben mit "line"

danke


----------



## Marco13 (6. Dez 2009)

Hab' zwar noch nicht selbst mit Processing gearbeitet, aber ... was meinst du mit "gleichmäßig"? Ist der Baum irgendwie verschoben? Ich könnte mir vorstellen, dass man auch die X-Koordinate verändern müßte

```
void baum(int x, int y, int ebenen) 
{
....
    for(int i = 1; i <= ebenen; i = i + 1) 
    {
  
        triangle(x, y, x + breite, y+100, x-breite, y+100);
  
        y = y + 75;
        breite = breite + 20;
        [b]x = x - 10;[/b] // Sowas in der Art...
    } 
}
```


----------



## annawald (6. Dez 2009)

nein, der baum sollte nur aus "line" bestehen (ich glaube in java heißt das DrawLine) und eben nicht aus triangle(dreiecken)

also so wie abbildung 2 und nicht wie abbildung 1 (natürlich sollten die linien gleichmäßig sein und nicht so wie auf der zeichnung; ich habe das jetzt nur mit paint gemacht )







und dann sollte der baum auch grün sein...

hier ist mein neuer code...der ist aber immer noch nicht richtig...

```
void setup() {  
  
  size(500, 500);
  
  baum(140, 10, 3);
  
}


void baum(int x, int y, int ebenen) {
  
 int breite = 40;
   
 for(int i = 1; i <= ebenen; i = i + 1) {
   //Spitze
   //rechts
   line(x, y, x + breite, y + 100);
   //links
   line(x - breite, y + 100, x, y);
 
   
 //Rechts waagrecht
 line(x + breite, y + 100, x + breite/2, y + 100);
 //Links waagrecht
 line(y -100, y - breite*5/4, y - breite , y -100 );


  
  y = y + 65;
  breite = breite + 20;
  
 }


 }
```

also:  Die innere Ecke zwischen 2 ebnen ist immer auf dem selben x-Wert, der Y-Wert schrumft um dasselbe pro Ebene. Der Abstand zwischen den Aussenecken einer Ebene wächst ebenfalls um einen bestimmten Wert pro Ebene.

aber wie mache ich das?


----------



## Marco13 (6. Dez 2009)

OK, die Überesetzung in Processing überlasse ich dann mal dir :bae:, aber ... so ganz grob überlegt:

Die Spitze und die "Bodenlinie" sollten vermutlich getrennt (außerhalb der Schleife) gezeichnet werden - die sind nämlich so "anders als alle anderen" Stufen. Also im Sinne von

```
maleSpitze()
for (alle stufen)
{
    maleStufe();
}
maleBodenlinie();
```
Das eigentliche Malen der Spitze, was du schon hast, stimmt wohl so in etwa, müßte aber eben aus der Schleife raus.

In den eigentlichen Stufen müßten dann nur immer die beiden Hälften gemalt werden, die wie eine 7 und eine horizontal gespiegelte 7 aussehen. 
Ich schreib' mal ein bißchen Pseudocode vor mich hin, ohne groß nachzudenken und ohne Gewähr 


```
void baum(int x, int y, int ebenen) 
{
    int innereBreite = 30;
    int äußereBreite = 50;

    // Die Spitze
    line(x, y, x - äußereBreite, y + 100);
    line(x, y, x + äußereBreite, y + 100);

    y += 100;   
    for(int i = 1; i <= ebenen; i = i + 1) 
    {
        // Die 7
        line(x - äußereBreite, y, x - innereBreite, y);
        line(x - innereBreite, y, x - äußereBreite, y+65);

        // Die gespiegelte 7
        line(x + äußereBreite, y, x + innereBreite, y);
        line(x + innereBreite, y, x + äußereBreite, y+65);

        y = y + 65;
        äußereBreite = äußereBreite + 20;
    }

    // Bodenlinie
    äußereBreite = äußereBreite - 20;
    line(x - äußereBreite, y, x + äußereBreite, y);
}
```

Häm. So in etwa, vielleicht...


----------



## annawald (6. Dez 2009)

ja genau so  danke!!!!!


----------



## spyboot (9. Dez 2009)

Sorry dass ich dass Thema nochmal rauskrame: Hätte er nicht einfach erst die Dreiecke mit drawTriangle() zeichnen können und dann mit 1 Pixel in jede Richtung kleineren weißen Dreiecken übermalen können (fillTriangle())?

Oder hab ich da nen Denkfehler?


----------

