// Persistence Of Vision Raytracer 2.0
// Standard include file.

// Quartic shapes include file
//
// Several cubic and quartic shape definitions 
// by Alexander Enzmann 

/* In the following descriptions, multiplication of two terms is
  shown as the two terms next to each other (i.e. x y, rather than
  x*y.  The expression c(n, m) is the binomial coefficient, n!/m!(n-m)!. */

#declare ShapesQ_Inc_Temp = version

#version 2.0

/* Bicorn
  This curve looks like the top part of a paraboloid, bounded
  from below by another paraboloid.  The basic equation is:
     y^2 - (x^2 + z^2) y^2 - (x^2 + z^2 + 2 y - 1)^2 = 0.  */
#declare Bicorn =
 quartic
  {< 1,   0,   0,   0,  1,   0,   4,   2,   0, -2,
     0,   0,   0,   0,  0,   0,   0,   0,   0,  0,
     0,   0,   0,   1,  0,   3,   0,   4,   0, -4,
     1,   0,  -2,   0,  1>
  }

/* Crossed Trough
  This is a surface with four pieces that sweep up from the x-z plane.
  The equation is: y = x^2 z^2.  */
#declare Crossed_Trough =
 quartic 
  {< 0,   0,   0,   0,  0,   0,   0,   4,   0,  0,
     0,   0,   0,   0,  0,   0,   0,   0,   0,  0,
     0,   0,   0,   0,  0,   0,   0,   0,   0, -1,
     0,   0,   0,   0,  0>
  }

/* a drop coming out of water? This is a curve formed by using the equation
  y = 1/2 x^2 (x + 1) as the radius of a cylinder having the x-axis as
  its central axis. The final form of the equation is:
     y^2 + z^2 = 0.5 (x^3 + x^2) */
#declare Cubic_Cylinder =
 quartic 
  {< 0,   0,   0,   -0.5, 0,   0,   0,   0,   0, -0.5,
     0,   0,   0,    0,   0,   0,   0,   0,   0,  0,
     0,   0,   0,    0,   0,   1,   0,   0,   0,  0,
     0,   0,   1,    0,   0>
  }

/* a cubic saddle. The equation is: z = x^3 - y^3. */
#declare Cubic_Saddle_1 =
 quartic 
  {< 0,   0,   0,    1,   0,   0,   0,   0,   0,  0,
     0,   0,   0,    0,   0,   0,   0,   0,   0,  0,
     0,   0,  -1,    0,   0,   0,   0,   0,   0,  0,
     0,   0,   0,   -1,   0>
  }

/* Variant of a devil's curve in 3-space.  This figure has a top and
  bottom part that are very similar to a hyperboloid of one sheet,
  however the central region is pinched in the middle leaving two
  teardrop shaped holes. The equation is:
     x^4 + 2 x^2 z^2 - 0.36 x^2 - y^4 + 0.25 y^2 + z^4 = 0.  */
#declare Devils_Curve =
 quartic 
  {<-1,   0,   0,    0,  0,   0,    0,  -2,   0,  0.36,
     0,   0,   0,    0,  0,   0,    0,   0,   0,  0,
     1,   0,   0,    0,  0,  -0.25, 0,   0,   0,  0,
    -1,   0,   0,    0,  0>
   }

/* Folium
  This is a folium rotated about the x-axis.  The formula is:
     2 x^2 - 3 x y^2 - 3 x z^2 + y^2 + z^2 = 0. */
#declare Folium =
 quartic 
  {< 0,   0,   0,    0,  0,   0,   0,   0,   0,  2,
     0,   0,  -3,    0,  0,   0,   0,  -3,   0,  0,
     0,   0,   0,    0,  0,   1,   0,   0,   0,  0,
     0,   0,   1,    0,  0>
  }

/* Glob - sort of like basic teardrop shape. The equation is:
   y^2 + z^2 = 0.5 x^5 + 0.5 x^4. */
#declare Glob_5 =
 poly 
  {5,
   <-0.5, 0,   0,  -0.5, 0,   0,   0,   0,   0,  0,
     0,   0,   0,   0,   0,   0,   0,   0,   0,  0,
     0,   0,   0,   0,   0,   0,   0,   0,   0,  0,
     0,   0,   0,   0,   0,   0,   0,   0,   0,  0,
     0,   0,   0,   0,   1,   0,   0,   0,   0,  0,
     0,   0,   0,   1,   0,   0>
  }

/* Variant of a lemniscate - the two lobes are much more teardrop-like. */
#declare Twin_Glob =
 poly 
  {6,
   < 4,   0,   0,   0,   0,   0,   0,   0,   0, -4,
     0,   0,   0,   0,   0,   0,   0,   0,   0,  0,
     0,   0,   0,   0,   0,   0,   0,   0,   0,  0,
     0,   0,   0,   0,   0,   0,   0,   0,   0,  0,
     0,   0,   0,   0,   0,   0,   0,   0,   0,  0,
     0,   0,   0,   0,   0,   0,   0,   0,   0,  0,
     0,   0,   0,   0,   0,   0,   0,   0,   0,  0,
     1,   0,   0,   0,   0,   0,   0,   0,   0,  0,
     0,   1,   0,   0>
  }

/*  Approximation to the helix z = arctan(y/x).

   The helix can be approximated with an algebraic equation (kept to the
   range of a quartic) with the following steps:

      tan(z) = y/x   =>  sin(z)/cos(z) = y/x   =>

   (1) x sin(z) - y cos(z) = 0

   Using the taylor expansions for sin, cos about z = 0,

      sin(z) = z - z^3/3! + z^5/5! - ...
      cos(z) = 1 - z^2/2! + z^6/6! - ...

   Throwing out the high order terms, the expression (1) can be written as:

      x (z - z^3/6) - y (1 + z^2/2) = 0, or

  (2) -1/6 x z^3 + x z + 1/2 y z^2 - y = 0

  This helix (2) turns 90 degrees in the range 0 <= z <= sqrt(2)/2.  By using
  scale <2 2 2>, the helix defined below turns 90 degrees in the range
  0 <= z <= sqrt(2) = 1.4042.
*/
#declare Helix =
 quartic 
  {<  0,   0,   0,    0,  0,   0,   0,      0,   0,  0,
      0,   0,   0,    0,  0,   0,  -0.1666, 0,   1,  0,
      0,   0,   0,    0,  0,   0,   0,      0.5, 0, -1,
      0,   0,   0,    0,  0>
   clipped_by
    {object {Cylinder_Z scale 2}
     plane  { z, 1.4142}
     plane  {-z, 0}
    }
   bounded_by{clipped_by}
  }

/* This is an alternate Helix, using clipped_by instead of csg intersection. */
#declare Helix_1 = object {Helix}

/* Hyperbolic Torus having major radius sqrt(40), minor radius sqrt(12).
  This figure is generated by sweeping a circle along the arms of a
  hyperbola.  The equation is:

     x^4 + 2 x^2 y^2 - 2 x^2 z^2 - 104 x^2 + y^4 - 2 y^2 z^2 +
     56 y^2 + z^4 + 104 z^2 + 784 = 0.

  See the description for the torus below. */
#declare Hyperbolic_Torus_40_12 =
 quartic 
  {< 1,   0,   0,    0,     2,   0,   0,  -2,   0, -104,
     0,   0,   0,    0,     0,   0,   0,   0,   0,    0,
     1,   0,   0,   -2,     0,  56,   0,   0,   0,    0,
     1,   0, 104,    0,   784>
  }

/* Lemniscate of Gerono
  This figure looks like two teardrops with their pointed ends connected.
  It is formed by rotating the Lemniscate of Gerono about the x-axis.
  The formula is:
     x^4 - x^2 + y^2 + z^2 = 0. */
#declare Lemniscate =
 quartic 
  {< 1,   0,   0,   0,   0,   0,   0,   0,   0, -1,
     0,   0,   0,   0,   0,   0,   0,   0,   0,  0,
     0,   0,   0,   0,   0,   1,   0,   0,   0,  0,
     0,   0,   1,   0,   0>
  }

/* This is a figure with a bumpy sheet on one side and something that
  looks like a paraboloid (but with an internal bubble).  The formula
  is:
     (x^2 + y^2 + a c x)^2 - (x^2 + y^2)(c - a x)^2.

   -99*x^4+40*x^3-98*x^2*y^2-98*x^2*z^2+99*x^2+40*x*y^2+40*x*z^2+y^4+2*y^2*z^2
   -y^2+z^4-z^2

*/
#declare Quartic_Loop_1 =
 quartic 
  {<99,   0,   0, -40,  98,   0,   0,  98,   0, -99,
     0,   0, -40,   0,   0,   0,   0, -40,   0,   0,
    -1,   0,   0,  -2,   0,   1,   0,   0,   0,   0,
    -1,   0,   1,   0,   0>
  }

/* Monkey Saddle
  This surface has three parts that sweep up and three down.  This gives
  a saddle that has a place for two legs and a tail... The equation is:

     z = c (x^3 - 3 x y^2).

  The value c gives a vertical scale to the surface - the smaller the
  value of c, the flatter the surface will be (near the origin). */
#declare Monkey_Saddle =
 quartic 
  {< 0,   0,   0,   1,  0,   0,   0,   0,   0,  0,
     0,   0,  -3,   0,  0,   0,   0,   0,   0,  0,
     0,   0,   0,   0,  0,   0,   0,   0,   0,  0,
     0,   0,   0,  -1,  0>
  }

/* Parabolic Torus having major radius sqrt(40), minor radius sqrt(12).
  This figure is generated by sweeping a circle along the arms of a
  parabola.  The equation is:

     x^4 + 2 x^2 y^2 - 2 x^2 z - 104 x^2 + y^4 - 2 y^2 z +
     56 y^2 + z^2 + 104 z + 784 = 0.

  See the description for the torus below. */
#declare Parabolic_Torus_40_12 =
 quartic 
  {< 1,   0,   0,    0,     2,   0,   0,   0,  -2, -104,
     0,   0,   0,    0,     0,   0,   0,   0,   0,    0,
     1,   0,   0,    0,    -2,  56,   0,   0,   0,    0,
     0,   0,   1,  104,   784>
  }

/* Piriform
  This figure looks like a hersheys kiss. It is formed by sweeping
  a Piriform about the x-axis.  a basic form of the equation is:
     (x^4 - x^3) + y^2 + z^2 = 0.
*/
#declare Piriform =
 quartic 
  {< 4,   0,   0,   -4,  0,   0,   0,   0,   0,  0,
     0,   0,   0,    0,  0,   0,   0,   0,   0,  0,
     0,   0,   0,    0,  0,   1,   0,   0,   0,  0,
     0,   0,   1,    0,  0>
  }

/* n-Roll Mill
  This curve in the plane looks like several hyperbolas with their
  bumps arranged about the origin.  The general formula is:

     x^n - c(n,2) x^(n-2) y^2 + c(n,4) x^(n-4) y^4 - ... = a

  When rendering in 3-Space, the resulting figure looks like a
  cylinder with indented sides.
*/

/* Quartic parabola - a 4th degree polynomial (has two bumps at the bottom)
  that has been swept around the z axis. The equation is:
     0.1 x^4 - x^2 - y^2 - z^2 + 0.9 = 0. */
#declare Quartic_Paraboloid =
 quartic 
  {< 0.1, 0,   0,  0,   0,   0,   0,   0,   0,  -1,
     0,   0,   0,  0,   0,   0,   0,   0,   0,   0,
     0,   0,   0,  0,   0,   0,   0,   0,   0,  -1,
     0,   0,  -1,  0,   0.9>
  }

/* Quartic Cylinder - a Space Needle?  */
#declare Quartic_Cylinder =
 quartic 
  {< 0,   0,   0,    0,   1,   0,   0,   0,   0,   0.01,
     0,   0,   0,    0,   0,   0,   0,   0,   0,   0,
     0,   0,   0,    1,   0,   0,   0,   0,   0,   0,
     0,   0,   0.01, 0,  -0.01>
  }

/* Steiners quartic surface */
#declare Steiner_Surface =
 quartic 
  {< 0,   0,   0,  0,  1,   0,   0,   1,   0,   0,
     0,   0,   0,  0,  1,   0,   0,   0,   0,   0,
     0,   0,   0,  1,  0,   0,   0,   0,   0,   0,
     0,   0,   0,  0,  0>
  }

/* Torus having major radius sqrt(40), minor radius sqrt(12) */
#declare Torus_40_12 =
 quartic 
  {< 1,   0,   0,    0,     2,   0,   0,   2,   0, -104,
     0,   0,   0,    0,     0,   0,   0,   0,   0,    0,
     1,   0,   0,    2,     0,  56,   0,   0,   0,    0,
     1,   0, -104,   0,   784>
  }

/* Witch of Agnesi */
#declare Witch_Hat =
 quartic 
  {<  0,   0,   0,   0,   0,   0,   1,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   1,   0,   0.04,
      0,   0,   0,   0,   0.04>
  }

/* very rough approximation to the sin-wave surface z = sin(2 pi x y).
  In order to get an approximation good to 7 decimals at a distance of
  1 from the origin would require a polynomial of degree around 60.  This
  would require around 200k coefficients. For best results, scale by
  something like <1 1 0.2>. */
#declare Sinsurf =
 poly 
  {6,
   <    0,   0,   0,    0,  0,   0,   0,   0,   0,  0,
    -1116.226, 0, 0,    0,  0,   0,   0,   0,   0,  0,
        0,   0,   0,    0,  0,   0,   0,   0,   0,  0,
        0,   0,   0,    0,  0,   0,   0,   0,   0,  0,
        0,   0,   0,    0,  0,   0,   0,   0,   0, 18.8496,
        0,   0,   0,    0,  0,   0,   0,   0,   0,  0,
        0,   0,   0,    0,  0,   0,   0,   0,   0,  0,
        0,   0,   0,    0,  0,   0,   0,   0,   0,  0,
        0,   0,  -1,    0>
   }

/* Empty quartic equation.  Ready to be filled with numbers...
  quartic
   {< 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
      0,   0,   0,   0,   0>
   }
*/

#version ShapesQ_Inc_Temp 
