/* Pov-Ray : 3.8 * Scene File : lsys.pov * Author : Ingo Janssen, Oswald "Droj". * Date : 2023-06-04 */ #version 3.8; global_settings{assumed_gamma 1} #default {finish {ambient .1 diffuse .9 emission 0}} #declare T_Pos = <0, 0, 0>; #declare A_F = 14; // Angle increment #declare Max_Items = 200; #declare VXY_Arr = array[Max_Items]; // Pos stack for xy-plane #declare AZZ_Arr = array[Max_Items]; // Angle stack for xy-plane #include "foreach.inc" #macro m_vertex(i_,elem_) #local s_ = concat("[i] = ",str(i_,0,0)," "); #local s_ = concat(s_," V = <",vstr(3,elem_,",",0,3),">"); #debug concat(s_,"\n") #end #macro m_debug(symb_,pos_,angl_) #local s_ = concat("symb: ",symb_," @ <",vstr(3,pos_,",",0,3),"> "); #local s_ = concat(s_,"angle ",str(angl_,0,3)); #debug concat(s_,"\n") #end /* build rules */ #declare BuildRules = dictionary; #declare BuildRules["X"] = 88; #macro F(T_Pos, AngleZZ) #local T_Pos = <0, 0, 0>; #end #declare BuildRules["F"] = 70; #macro rulePlus(AngleZZ) AngleZZ + (tau/A_F) #end #declare BuildRules["+"] = 43; #macro ruleMinus(AngleZZ) AngleZZ - (tau/A_F) #end #declare BuildRules["-"] = 45; #macro Turn(AngleZZ) AngleZZ - (tau/2) #end #declare BuildRules["|"] = 124; #macro Push(Curr_Item, T_Pos, AngleZZ) #debug "push macro runs\n" #declare VXY_Arr[Curr_Item] = T_Pos; #declare AZZ_Arr[Curr_Item] = AngleZZ; #local Curr_Item = Curr_Item + 1; Curr_Item #end #declare BuildRules["["] = 91; #macro Pop(Curr_Item, T_Pos, AngleZZ) #debug "pop macro runs\n" #local Curr_Item = Curr_Item - 1; #declare T_Pos = VXY_Arr[Curr_Item]; #declare AngleZZ = AZZ_Arr[Curr_Item]; Curr_Item #end #declare BuildRules["]"] = 93; /* I left Ingo's brilliant rewrite macro untouched */ #macro Ltransform(Axiom, Rules, Iterations) #local Result = Axiom; #for (i, 1, Iterations) #local NewResult = ""; #local N = strlen(Result); #local j = 1; #while (j <= N) #local CurrentSymbol = substr(Result, j, 1); #ifdef(Rules[CurrentSymbol]) #local NewResult = concat(NewResult, Rules[CurrentSymbol]); #else #local NewResult = concat(NewResult, CurrentSymbol); #end #local j = j + 1; #end #local Result = NewResult; #debug concat(Result, "\n") #end Result #end #macro Lvertices(Lstr) #local T_Pos = <0, 0, 0>; #local AngleZZ = 0; #local Curr_Item = 0; #declare Return = array; #declare Return[0] = T_Pos; #for (i, 1, strlen(Lstr)) #local CurrentSymbol = substr(Lstr, i, 1); #switch (BuildRules[CurrentSymbol]) #case(88) #break #case(70) m_debug("F",T_Pos,AngleZZ) #local T_Pos = F(T_Pos, AngleZZ); #break #case(43) m_debug("+",T_Pos,AngleZZ) #local AngleZZ = rulePlus(AngleZZ); #break #case(45) m_debug("-",T_Pos,AngleZZ) #local AngleZZ = ruleMinus(AngleZZ); #break #case(124) m_debug("|",T_Pos,AngleZZ) #local AngleZZ = Turn(AngleZZ); #break #case(91) m_debug("[",T_Pos,AngleZZ) #local Curr_Item = Push(Curr_Item, T_Pos, AngleZZ); #break #case(93) m_debug("]",T_Pos,AngleZZ) #local Curr_Item = Pop(Curr_Item, T_Pos, AngleZZ); #break #else m_debug(BuildRules[CurrentSymbol],T_Pos,AngleZZ) #end #local InArr = Return[dimension_size(Return,1)-1]; #if (T_Pos.x != InArr.x | T_Pos.y != InArr.y | T_Pos.z != InArr.z) #declare Return[dimension_size(Return,1)] = T_Pos; #end #end #declare Vertices = Return; Vertices #end #declare Axiom = "FFFFX"; #declare Rules = dictionary { ["X"] : "F[-FX][+FX]", ["Y"] : "FX-Y" }; #declare Iterations = 4; #debug concat("iterations = ",str(Iterations,0,0),".\n") #declare Lstr = Ltransform(Axiom, Rules, Iterations); #debug concat("length 'Lstr' = ",str(strlen(Lstr),0,0),".\n") #declare Vertices = Lvertices(Lstr); Foreach(Vertices,dictionary {.Macro: "m_vertex"}) #for(i, 0, dimension_size(Vertices,1)-2) cylinder { Vertices[i],Vertices[i+1],0.1 texture {pigment{rgb 1}} translate <-25, -5, 0> rotate <0, 0, 0> } #end camera { location <0,0,-30> look_at <0,0,0> angle 120 right x*image_width/image_height } light_source {<3,3,-3>*1e3 color rgb 1 parallel}