Der Pythagoras-Baum


Zusätzlich zu dem Applet habe ich noch ein Perl-Skript geschrieben, welches einen Pythagoras-Baum in xfig esrtellt. Dazu ersteinmal ein paar Bilder zu verschiedenen Iterationstiefen. Wenn man auf die Bilder klickt, erhält man zusätzlich die xfig-Dateien.

Iterationstiefe: 10
Iterationstiefe: 15

Hier nun der Perl-Code:

 pythagorasbaum.pl 
1 #!/usr/bin/perl -w 2 ####################################### 3 # Zeichnen eines Pythagoras-Baums 4 # Letzte Aenderung: 10.02.2008 5 ####################################### 6 use POSIX qw /floor ceil/; 7 use Math::Trig; 8 9 sub RtoB { # Grad -> Bogenmass 10 my $wert = shift(@_); 11 return $wert * pi() / 180; 12 } 13 14 sub BtoR { # Bogenmass -> Grad 15 my $wert = shift(@_); 16 return $wert * 180 / pi(); 17 } 18 19 sub differenz { # Bogenmass -> Grad 20 my ( $a, $b ) = @_; 21 if ( $a > $b ) { 22 return $a - $b; 23 } 24 else { 25 return $b - $a; 26 } 27 } 28 29 sub zeichneBaum { 30 my ( $a_x, $a_y, $laenge, $winkel, $winkelz, $schritt, $aenderungwinkel ) = 31 @_; 32 if ( $aenderungwinkel == 1 ) { $winkelz = rand(85); } 33 my $winkelerg = 90 - $winkelz - $winkel; 34 my $winkelb = RtoB($winkel); 35 my $winkelzb = RtoB($winkelz); 36 my $winkelergb = RtoB($winkelerg); 37 my $b_x = sprintf( "%0.3f", $a_x + cos($winkelb) * $laenge ); 38 my $b_y = sprintf( "%0.3f", $a_y + sin($winkelb) * $laenge ); 39 my $c_x = sprintf( "%0.3f", $b_x - sin($winkelb) * $laenge ); 40 my $c_y = sprintf( "%0.3f", $b_y + cos($winkelb) * $laenge ); 41 my $d_x = sprintf( "%0.3f", $a_x - sin($winkelb) * $laenge ); 42 my $d_y = sprintf( "%0.3f", $a_y + cos($winkelb) * $laenge ); 43 if ( $schritt == 0 ) { } 44 else { 45 $schritt--; 46 if ( ( differenz( $a_x, $b_x ) == 0 ) 47 || ( differenz( $b_x, $c_x ) == 0 ) 48 || ( differenz( $c_x, $d_x ) == 0 ) ) 49 { 50 printf("plotpolygon layer=90 farbe=0,20,4 "); 51 printf("linienart=0 liniendicke=0.1 punkte=5 \n"); 52 printf( "plotxy wert=%s,%s\n", $a_x, $a_y ); 53 printf( "plotxy wert=%s,%s\n", $b_x, $b_y ); 54 printf( "plotxy wert=%s,%s\n", $c_x, $c_y ); 55 printf( "plotxy wert=%s,%s\n", $d_x, $d_y ); 56 printf( "plotxy wert=%s,%s\n", $a_x, $a_y ); 57 printf("ende\n"); 58 } 59 else { 60 if ( ( differenz( $a_x, $b_x ) > 0.085 ) 61 || ( differenz( $b_x, $c_x ) > 0.085 ) 62 || ( differenz( $c_x, $d_x ) > 0.085 ) ) 63 { 64 printf("plotpolygon layer=90 farbe=0,20,4 "); 65 printf("linienart=0 liniendicke=1 punkte=5 \n"); 66 printf( "plotxy wert=%s,%s\n", $a_x, $a_y ); 67 printf( "plotxy wert=%s,%s\n", $b_x, $b_y ); 68 printf( "plotxy wert=%s,%s\n", $c_x, $c_y ); 69 printf( "plotxy wert=%s,%s\n", $d_x, $d_y ); 70 printf( "plotxy wert=%s,%s\n", $a_x, $a_y ); 71 printf("ende\n"); 72 } 73 else { 74 } 75 } 76 77 # Neuer Punkt im Dreieck, 78 # dazu werden die neuen Laengen 79 # und die naechste Koordinate berechnet. 80 my $laengede = cos($winkelzb) * $laenge; 81 my $laengeec = sqrt( $laenge * $laenge - $laengede * $laengede ); 82 my $laengedf = cos($winkelergb) * $laengede; 83 my $laengefe = sin($winkelergb) * $laengede; 84 my $e_x = sprintf( "%0.3f", $d_x + $laengefe ); 85 my $e_y = sprintf( "%0.3f", $d_y + $laengedf ); 86 87 # Den Baum fuer die Kathetenquadrate zeichnen 88 zeichneBaum( $d_x, $d_y, $laengede, $winkel + $winkelz, 89 $winkelz, $schritt, $aenderungwinkel ); 90 zeichneBaum( $e_x, $e_y, $laengeec, ( -$winkelerg ), 91 $winkelz, $schritt, $aenderungwinkel ); 92 } 93 } 94 printf("skalierung 0.1 \n"); 95 zeichneBaum( 0, 0, 5, 0, 50, 15, 0 );

Letzte Änderung: 22.08.2009: 11:59:58 von X. Rendtel