p_umbilic.pov :

// Persistence of Vision Ray Tracer Scene Description File
// File: p_umbilic.pov
// Vers: 3.5
// Desc: Demo scene showing various ways of generating a
//       parametric surface. An umbilic torus
// Date: 2002/10/20
// Auth: Ingo


#version 3.5;

#include "param.inc"

global_settings {assumed_gamma 1.0}
camera {location <0,0.5,-20> look_at <-1,0,0>} 
light_source {<500,500,-500> rgb <1,0.9,0.8>}
light_source {<-100,100,-500> rgb <0.3,0.3,0.5>}


#declare Set=1; //1, 2, 3 or 4

#switch (Set)
  #case (1)
    // The set of functions is not declared, but defined in Parametric directly.
  #break
  
  #case (2)
    // Set below is for use with Parametric. 
    #declare F1= function(u,v){sin((u/3)-(2*v)) + 2*sin((u/3)+v)}
    #declare F2= function(u,v){cos(u)*((7+cos((u/3)-(2*v))+(2*cos((u/3)+v))))}
    #declare F3= function(u,v){sin(u)*((7+cos((u/3)-(2*v))+(2*cos((u/3)+v))))}
  #break
  
    // The two sets below are for use with Paramcalc. The functions or macros
    // need to have the names __Fx, __Fy, __Fz.
  #case (3)
    #declare __Fx= function(u,v){sin((u/3)-(2*v)) + 2*sin((u/3)+v)}
    #declare __Fy= function(u,v){cos(u)*((7+cos((u/3)-(2*v))+(2*cos((u/3)+v))))}
    #declare __Fz= function(u,v){sin(u)*((7+cos((u/3)-(2*v))+(2*cos((u/3)+v))))}
  #break
  
  #case (4)
    #macro __Fx(U,V)sin((U/3)-(2*V)) + 2*sin((U/3)+V)#end               
    #macro __Fy(U,V)cos(U)*((7+cos((U/3)-(2*V))+(2*cos((U/3)+V))))#end
    #macro __Fz(U,V)sin(U)*((7+cos((U/3)-(2*V))+(2*cos((U/3)+V))))#end
  #break
#end


object {
  
  #if (Set=1) 
    Parametric(
      function(u,v){sin((u/3)-(2*v)) + 2*sin((u/3)+v)}             
      function(u,v){cos(u)*((7+cos((u/3)-(2*v))+(2*cos((u/3)+v))))}
      function(u,v){sin(u)*((7+cos((u/3)-(2*v))+(2*cos((u/3)+v))))}
      <-pi, -pi>, < pi, pi>,
      50,50,""
    )
  #end

  #if (Set=2) 
    Parametric(
      F1, F2, F3,
      <-pi, -pi>, < pi, pi>,
      50,50,""
    )
  #end
    
  #if (Set=3 | Set=4)
    Paramcalc(
       <-pi, -pi>, < pi, pi>,
       50,50,""
    )
  #end
  
  pigment {rgb 1}
  rotate <0,55,0>
  rotate <25,0,0>
}