POV-Ray : Newsgroups : povray.binaries.images : Dry stone wall - help! [12.4KB] : Dry stone wall - help! [12.4KB] Server Time
16 Aug 2024 04:20:58 EDT (-0400)
  Dry stone wall - help! [12.4KB]  
From: Tom Melly
Date: 22 Mar 2002 08:23:27
Message: <3c9b304f@news.povray.org>
I'm working on a macro that will hopefully eventually generate a dry-stone wall,
but I'm running into problems. In the image below, the wall should approx. fill
the area marked out by the yellow cylinders, but it ain't.

If anyone can be bothered to:

a) work out what I'm trying to do
b) work out how I'm trying to do it
and
c) what's going wrong

then here is the code:

//start code

#version 3.5;

#include "colors.inc"

global_settings {
  assumed_gamma 1.0
}

// ----------------------------------------

camera {
  location  <0.0, 1.5, -100.0>
  look_at   <0.0, 1.5,  0.0>
}


light_source {
  <0, 0, 0>            // light's position (translated below)
  color rgb <1, 1, 1>  // light's color
  translate <-30, 30, -30>
}

// ----------------------------------------



#macro BuildWall()
  #declare Rand1 = seed(142);
  #declare Brick = sphere{0,1 pigment{Red}}
  #declare Ground = plane{y,0 pigment{Green}}
  #declare WallLen = 50;
  #declare WallHi = 15;
  #declare ThisLen = 0;
  #declare ThisHi = 0;
  #declare Wall = object{Ground}
  #while(ThisLen <= WallLen & ThisHi <= WallHi)
    #declare XScale = rand(Rand1)*2 + 0.5;
    #declare YScale = rand(Rand1)*2 + 0.5;
    #declare ZScale = rand(Rand1)*2 + 0.5;
    #declare ThisBrick = object{Brick scale<XScale, YScale, ZScale>}
    #if(ThisLen = 0)
      #declare Norm = <0, 0, 0>;
      #declare Start = <0,WallHi*2,0>;
      #declare InterA = trace ( Wall, Start, <0, -1, 0>, Norm );
      #declare Wall = union{
        object{Wall}
        object{ThisBrick translate y*(InterA.y + YScale)}
      }
      #declare ThisLen = XScale;
      #declare ThisHi = InterA.y + YScale;
    #else
      #declare Norm = <0, 0, 0>;
      #declare Start = <ThisLen+XScale,WallHi*2,0>;
      #declare InterA = trace ( Wall, Start, <0, -1, 0>, Norm );
      #if(InterA.y < ThisHi)
        #declare Norm = <0, 0, 0>;
        #declare Start = <WallLen*2,InterA.y + YScale,0>;
        #declare InterB = trace ( Wall, Start, <-1, 0, 0>, Norm );
        #declare Wall = union{
          object{Wall}
          object{ThisBrick translate<InterB.x + XScale, InterA.y + YScale, 0>}
        }
      #end
      #declare ThisLen = InterB.x + (XScale*2);
      #declare ThisHi = InterA.y + YScale;
      #if(ThisLen > WallLen & ThisHi <= WallHi)
        #declare ThisLen = 0;
      #end
    #end
  #end
#end

BuildWall()
object{Wall}

cylinder{0,y*25, 0.2 pigment{Yellow}}
cylinder{0,y*25, 0.2 pigment{Yellow} translate x*50}
cylinder{x*-10,x*60, 0.2 pigment{Yellow} translate y*15}

//end code

... and here is the image


--
#macro G(D,E,F)#local I=array[3]{D,E,F}#local B=0;triangle{#while(
B<3)#while(I[B])A[mod(I[B],10)]+#local I[B]=div(I[B],10);#end<-5,-
2,9>#local B=B+1;#end}#end #local A=array[7]{x,x*2,x*4,y,y*2,y*4,z
}light_source{-x*6-z*9,1}mesh{G(105,10,146)G(105,246,10)G(105,56,
146)G(105,1256,246)G(1256,126,220)G(22156,2216,201)pigment{rgb 1}}//TM


Post a reply to this message


Attachments:
Download 'dw1.jpg' (13 KB)

Preview of image 'dw1.jpg'
dw1.jpg


 

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