POV-Ray : Newsgroups : povray.binaries.images : Gothic cathedral window generator : Re: Gothic cathedral window generator Server Time
20 May 2024 02:22:21 EDT (-0400)
  Re: Gothic cathedral window generator  
From: Mike Miller
Date: 18 Jul 2023 00:10:00
Message: <web.64b6101237209b7fb5177e91dabc9342@news.povray.org>
"Samuel B." <stb### [at] hotmailcom> wrote:
> "Samuel B." <stb### [at] hotmailcom> wrote:
> > Macro incoming...
>
> Here's the macro. It's not exactly easy to invoke, as you can see by the number
> of parameters. Be warned that the arch height cannot fall below the window
> width, nor can the window height be less than the arch height. (If that seems
> confusing, just play with the params.)
>
> Scroll below the macro definition to see how it's used (includes comments).
>
> #macro Gothic_Window(WW, AH, WH, WD, LT, ET, NA, PT, BW)
>  #local Eps = .0001; // a small value
>
>  union{
>
>   // -< window width, arch height, 0 >
>   #local P = -<WW, AH, 0>;
>
>   // arch circle center
>   #local CC = <.5*(P.x-P.y/(WW/AH)), -AH, 0>;
>
>   // arch circle radius
>   #local CR = vlength(CC);
>
>   // window box
>   box{<-WW, -WH+ET, -Eps>, <-WW+ET, -AH, WD+Eps>}
>   box{<WW-ET, -WH+ET, -Eps>, <WW, -AH, WD+Eps>}
>   box{<-WW, -WH, -Eps>, <WW, -WH+ET, WD+Eps>}
>   difference{
>    box{<-WW, -AH, 0>, <WW, 0, WD>}
>    intersection{
>     cylinder{<CC.x, CC.y, -Eps>, <CC.x, CC.y, WD+Eps>, CR-ET}
>     cylinder{<-CC.x, CC.y, -Eps>, <-CC.x, CC.y, WD+Eps>, CR-ET}
>    }
>   }
>
>   #local LT2 = .4 * LT;
>
>   // horizonals
>   cylinder{-<WW, AH, 0>, <WW, -AH, 0>, LT}
>   cylinder{-<WW, AH, LT>, <WW, -AH, -LT>, LT2}
>
>   cylinder{-<WW, WH, 0>, <WW, -WH, 0>, LT}
>   cylinder{-<WW, WH, LT>, <WW, -WH, -LT>, LT2}
>
>   // bottom horizontal, if there's enough room
>   #if(WH-AH > 16*LT)
>    cylinder{-<WW, WH-8*LT, 0>, <WW, -WH+8*LT, 0>, LT}
>    cylinder{-<WW, WH-8*LT, LT>, <WW, -WH+8*LT, -LT>, LT2}
>   #end
>
>   // fancy multiarch setup
>   #for(I, 0, NA)
>
>    #if(I<NA)
>
>     #local ArchPiece =
>      intersection{
>       merge{
>        torus{
>         CR, LT
>         rotate x*90
>         translate CC+2*x*WW*I/NA
>        }
>        torus{
>         CR, LT2
>         rotate x*90
>         translate CC-z*LT+2*x*WW*I/NA
>        }
>       }
>       plane{y, -AH inverse}
>       // use vertical cut for first item, otherwise use a cylinder
>       #if(I=0)
>        plane{x, 0}
>       #else
>        cylinder{<-CC.x, CC.y, -2*LT>, <-CC.x, CC.y, 2*LT>, CR}
>       #end
>      }
>
>     object{ArchPiece}
>     object{ArchPiece scale <-1, 1, 1>}
>
>    #end
>
>    cylinder{-<WW, WH, 0>, -<WW, AH, 0>, LT translate x*2*WW*I/NA}
>    cylinder{-<WW, WH, LT>, -<WW, AH, LT>, LT2 translate x*2*WW*I/NA}
>
>   #end
>
>   // fill the corners
>   sphere{-<WW, WH, 0>, LT}
>   sphere{<WW, -WH, 0>, LT}
>   sphere{-<WW, WH, LT>, LT2}
>   sphere{<WW, -WH, -LT>, LT2}
>
>   #local TexWindow =
>    texture{
>     pigment{rgb .75 transmit .85}
>     finish{reflection{0, 1 fresnel} conserve_energy}
>    }
>
>   // window pane
>   box{
>    <-WW+Eps, -WH+Eps, PT>, <WW-Eps, -Eps, PT>
>    texture{TexWindow}
>    inverse
>   }
>   box{
>    <-WW+Eps, -WH+Eps, Eps>, <WW-Eps, -Eps, Eps>
>
>    texture{
>     TexWindow
>     normal{
>     //pigment{ // debug
>      #local CX = CC.x;
>      #local CY = CC.y;
>      #local FA =
>       function{
>        min(
>         1
>         #for(I, 0, NA-1)
>          ,abs(sqrt(pow(x-CX-2*WW*I/NA, 2)+pow(y-CY, 2)*(y>-AH))-CR)
>         #end
>        )
>       }
>      function{
>       min(
>        1,
>        min(
>         FA(x, y, 0),
>         FA(-x, y, 0),
>         abs(y+AH),
>         abs(y+WH)
>         #if(WH-AH > 16*LT)
>          ,abs(y+WH-8*LT)
>         #end
>        ) / BW
>       )
>      }
>      bump_size 1
>      accuracy .003
>     }
>    }
>    interior{ior 1.5}
>    double_illuminate
>   }
>
>   // place object at y=0
>   translate y*WH
>  }
> #end
>
> // invoke the macro
> object{
>  Gothic_Window(
>   1.0,   // window width (total_width/2)
>   1.875, // arch height (>=WW & <=WH)
>   4.0,   // window height
>   0.75,  // window depth
>   .05/1,  // line thickness
>   .01,  // thickness of enclosure around window (window box)
>   3,   // number of arch pieces
>   .1,   // window pane thickness
>   .2   // window pane bevel width
>  )
>  pigment{rgb .75}
> }

Nice Job! ...and thank you for the macro.
Mike


Post a reply to this message

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