// Ein rekursiver Baum module r_baum( h_schrittweite, r_schrittweite, ht_init, haupt_tiefe, z_init, skalierung, s_varianz, at_init, abzweig_tiefe, abzweig_winkel, abzweig_min_gr, abzweig_max_gr ){ zufall = rands( 0, 1, 10, z_init ); function z(von, bis, idx) = zufall[idx] * (bis - von) + von; if ((abzweig_tiefe < 1) && ($children > 1)) { color("green") rotate([(floor(z_init) % 2 == 0) ? 45 : -45,0,0]) linear_extrude(height = 0.1) children(1); } else { sf = skalierung + z(-1, 1 ,1) * s_varianz; linear_extrude( height = h_schrittweite, scale = sf ) children(0); // Sollen wir abweigen? if ( (abzweig_tiefe > 0) && (z(0, 0.8 ,2) < ((ht_init - haupt_tiefe) / ht_init) ) ){ r_winkel = z(0, 720, 3); a_winkel = abzweig_winkel / 2 + z(0, 0.5, 4) * abzweig_winkel; neue_schrittweite = h_schrittweite - h_schrittweite / 2.5 * pow(r_schrittweite, abzweig_tiefe); // wird 0, wenn a_winkel groß ist // wird 1, wenn a_winkel klein ist abzweig_verhaeltnis = (abzweig_winkel / a_winkel) - 1.0; abzweig_skalierung = abzweig_min_gr * abzweig_verhaeltnis + abzweig_max_gr * (1.0 - abzweig_verhaeltnis); haupt_skalierung = sf * abzweig_verhaeltnis + abzweig_max_gr * (1.0 - abzweig_verhaeltnis); translate( [0, 0, h_schrittweite] ) rotate( [0, 0, r_winkel] ) rotate( [a_winkel, 0, 0] ) r_baum( neue_schrittweite, r_schrittweite, ht_init, ht_init, z(0,100, 5), skalierung, s_varianz, at_init, abzweig_tiefe - 1, abzweig_winkel, abzweig_min_gr, abzweig_max_gr ) { scale( [abzweig_skalierung, abzweig_skalierung] ) children(0); if ($children > 1) children(1); } // Verbindung zum abzweigenden Ast glätten hull() { translate( [0, 0, h_schrittweite] ) linear_extrude( height = 0.01 ) scale([sf,sf]) children(0); translate( [0, 0, h_schrittweite] ) rotate( [0, 0, r_winkel] ) rotate( [a_winkel, 0, 0] ) linear_extrude( height = neue_schrittweite / 2, scale = pow(skalierung,1/3) ) scale( [abzweig_skalierung, abzweig_skalierung] ) children(0); } // in gegenrichtung gedrehter Hauptast if (haupt_tiefe > 0) { translate( [0, 0, h_schrittweite] ) rotate( [0, 0, r_winkel] ) rotate( [-(abzweig_winkel - a_winkel), 0, 0] ) r_baum( neue_schrittweite, r_schrittweite, ht_init, haupt_tiefe - 1 - z(0,2, 6), z(0,100, 7), skalierung, s_varianz, at_init, abzweig_tiefe, abzweig_winkel, abzweig_min_gr, abzweig_max_gr ) { scale( [haupt_skalierung, haupt_skalierung] ) children(0); if ($children > 1) children(1); } // Verbindung zum Haupt glätten hull() { translate( [0, 0, h_schrittweite] ) linear_extrude( height = 0.01 ) scale([sf,sf]) children(0); translate( [0, 0, h_schrittweite] ) rotate( [0, 0, r_winkel] ) rotate( [-(abzweig_winkel - a_winkel), 0, 0] ) linear_extrude( height = neue_schrittweite / 2, scale = pow(skalierung,1/3) ) scale( [haupt_skalierung, haupt_skalierung] ) children(0); } } } else { if (haupt_tiefe > 0) { translate( [0, 0, h_schrittweite] ) r_baum( h_schrittweite, r_schrittweite, ht_init, haupt_tiefe - 1 - z(0,2,0), z(0,100,9), skalierung, s_varianz, at_init, abzweig_tiefe, abzweig_winkel, abzweig_min_gr, abzweig_max_gr ) { scale( [sf, sf] ) children(0); if ($children > 1) children(1); } } if ((abzweig_tiefe < 2) && ($children > 1)) { color("green") rotate([(floor(z_init) % 2 == 0) ? 45 : -45,0,0]) linear_extrude(height = 0.1) children(1); } } } } srnd = rands(0,1000,1)[0]; echo(srnd); r_baum( h_schrittweite = 10, r_schrittweite = 0.7, ht_init = 20, haupt_tiefe = 20, z_init = 42, skalierung = 0.97, s_varianz = 0.1, at_init = 3, abzweig_tiefe = 3, abzweig_winkel = 70, abzweig_min_gr = 0.3, abzweig_max_gr = 0.8 ) { circle( d = 10, $fn=8); square([2,2]); }