// 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