POV-Ray : Newsgroups : povray.general : L-Systems in Povray : Re: L-Systems in Povray Server Time
1 Jun 2024 20:11:47 EDT (-0400)
  Re: L-Systems in Povray  
From: ingo
Date: 12 Jul 2023 13:05:00
Message: <web.64aedcd4453cebfc17bac71e8ffb8ce3@news.povray.org>
"Droj" <803### [at] drojde> wrote:

worked a bit on you lsys7. Simplified a few minor things. Changed a bit in
LVertices and added debugging.

We're at "Parse Error: Expected 'RValue to declare', End of File found instead"
now.

ingo


---%<---------%<---------%<---
/*Pov-Ray    : 3.8
Scene File : lsys.pov
Author     : Ingo Janssen
Date       : 2023-06-04
*/
#version 3.8;

global_settings{ assumed_gamma 1.0 }
#default{ finish{ ambient 0.1 diffuse 0.9 }}

#declare T_Pos = <0, 0, 0>;
#declare A_F = 14; // Angle increment
#declare Max_Items = 200;
#declare Curr_Items = 0;
#declare VXY_Arr = array[Max_Items]; // Pos stack for xy-plane
#declare AZZ_Arr = array[Max_Items]; // Angle stack for xy-plane


//build rules
#declare BuildRules = dictionary;


#macro F(T_Pos, AngleZZ)
 #local T_Pos = <0, 0, 0>;
    <T_Pos.x + cos(AngleZZ), T_Pos.y + sin(AngleZZ), T_Pos.z> // <x, y, 0>
#end
#declare BuildRules["F"] = 70; //chr(70) = F


#macro YawR(AngleZZ)
 #local AngleZZ = 0;
  AngleZZ + (tau/A_F)
#end
#declare BuildRules["+"] = 43;


#macro YawL(AngleZZ)
 #local AngleZZ = 0;
  AngleZZ - (tau/A_F)
#end
#declare BuildRules["-"] = 45;


#macro Turn(AngleZZ)
 #local AngleZZ = 0;
   AngleZZ - (tau/2)
#end
#declare BuildRules["|"] = 124;


// the following macros are needed for branching
#macro Push(T_Pos, AngleZZ)
  #declare VXY_Arr[Curr_Items] = T_Pos;
  #declare AZZ_Arr[Curr_Items] = AngleZZ;
  #declare Curr_Items = Curr_Items + 1;
#end
#declare BuildRules["["] = 91;


#macro Pop(T_Pos, AngleZZ)
  #declare Curr_Items = Curr_Items - 1;
  #declare T_Pos = VXY_Arr[Curr_Items];
  #declare AngleZZ = AZZ_Arr[Curr_Items];
#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>; // <x, y, z>
  #local AngleZZ = 0;
  //#local Curr_Item = 0;
  #declare Return = array; //{<T_Pos.x, T_Pos.y, T_Pos.z>};
 #declare Return[0] = <T_Pos.x, T_Pos.y, T_Pos.z>;
  #for (i, 0, strlen(Lstr)-1)
    #local CurrentSymbol = substr(Lstr, i, 1);
    #ifdef (BuildRules[CurrentSymbol])
      #switch (BuildRules[CurrentSymbol])
        #case(70)
          #debug "70 F \n"
          #local T_Pos = F(T_Pos, AngleZZ);
        #break
        #case(43)
          #debug "43 + \n"
          #local AngleZZ = YawR(AngleZZ);
        #break
        #case(45)
          #debug "45 - \n"
          #local AngleZZ = YawL(AngleZZ);
        #break
        #case(124)
          #debug "124 | \n"
          #local AngleZZ = Turn(AngleZZ);
        #break

        #case(91)
          #debug "91 [ \n"
          #local Curr_Item = Push(T_Pos, AngleZZ);
        #break


        #case(93)
          #debug "93 ] \n"
          #local Curr_Item = Pop(T_Pos, AngleZZ);
        #break

      #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.x, T_Pos.y, T_Pos.z>;
      #end
    #end
  #end
  #declare Vertices = Return;
  Vertices
#end

#declare Axiom = "FFFFX";
#declare Rules = dictionary{
  ["X"] : "F[-FX][+FX]",
  ["Y"] : "FX-Y"
};
#declare Iterations = 1;

#declare Lstr = Ltransform(Axiom, Rules, Iterations);

#declare Vertices = Lvertices(Lstr);

/*
#ifdef (Vertices)
 #debug "OK \n"
#else
 #debug "Undefined! \n"
#end
*/
/*#for(i, 0, dimension_size(Vertices,1)-2) // <== here Povray complains
  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{
  <3000,3000,-3000>
  color rgb 1
}
---%<---------%<---------%<---


Post a reply to this message

Copyright 2003-2023 Persistence of Vision Raytracer Pty. Ltd.