home *** CD-ROM | disk | FTP | other *** search
- // Persistence of Vision Raytracer
- // 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)!. }
-
- { 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 0.0 0.0 1.0 0.0 4.0 2.0 0.0 -2.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 3.0 0.0 4.0 0.0 -4.0
- 1.0 0.0 -2.0 0.0 1.0 >
- end_quartic
-
- { 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.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 -1.0
- 0.0 0.0 0.0 0.0 0.0 >
- end_quartic
-
- { 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 0.0 -0.5 0.0 0.0 0.0 0.0 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 1.0 0.0 0.0 0.0 0.0
- 0.0 0.0 1.0 0.0 0.0 >
- end_quartic
-
- { a cubic saddle. The equation is: z = x^3 - y^3. }
- #declare Cubic_Saddle_1 =
- 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.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.0 0.0 0.0
- 0.0 0.0 0.0 -1.0 0.0 >
- end_quartic
-
- { 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.0 0.0 0.0 0.0 -2.0 0.0 0.36
- 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.25 0.0 0.0 0.0 0.0
- -1.0 0.0 0.0 0.0 0.0 >
- end_quartic
-
- { 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.0 0.0 0.0 0.0 0.0 2.0
- 0.0 0.0 -3.0 0.0 0.0 0.0 0.0 -3.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.0 0.0 1.0 0.0 0.0 >
- end_quartic
-
- { 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.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 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.0
- 0.0 0.0 0.0 1.0 0.0 0.0 >
- end_poly
-
- { 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.0 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.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.0
- 1.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 >
- end_poly
-
- { 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 =
- object
- intersection
- quadric Cylinder_Z
- scale <2.0 2.0 2.0>
- texture color Clear end_texture
- end_quadric
- plane <0.0 0.0 1.0> 1.4142 texture color Clear end_texture end_plane
- plane <0.0 0.0 -1.0> 0.0 texture color Clear end_texture end_plane
- 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.1666 0.0 1.0 0.0
- 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 -1.0
- 0.0 0.0 0.0 0.0 0.0 >
- end_quartic
- end_intersection
- end_object
-
- { This is an alternate Helix, using clipped_by instead of csg intersection. }
- #declare Helix_1 =
- object
- 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.1666 0.0 1.0 0.0
- 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 -1.0
- 0.0 0.0 0.0 0.0 0.0 >
- end_quartic
- clipped_by
- quadric Cylinder_Z scale <2.0 2.0 2.0> end_quadric
- plane <0.0 0.0 1.0> 1.4142 end_plane
- plane <0.0 0.0 -1.0> 0.0 end_plane
- end_clip
- bounded_by
- intersection
- quadric Cylinder_Z scale <2.0 2.0 2.0> end_quadric
- plane <0.0 0.0 1.0> 1.4142 end_plane
- plane <0.0 0.0 -1.0> 0.0 end_plane
- end_intersection
- end_bound
- end_object
-
- { 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 0.0 0.0 2.0 0.0 0.0 -2.0 0.0 -104.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 -2.0 0.0 56.0 0.0 0.0 0.0 0.0
- 1.0 0.0 104.0 0.0 784.0 >
- end_quartic
-
- { 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.0 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 0.0
- 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0
- 0.0 0.0 1.0 0.0 0.0 >
- end_quartic
-
- { 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.0 0.0 -40.0 98.0 0.0 0.0 98.0 0.0 -99.0
- 0.0 0.0 -40.0 0.0 0.0 0.0 0.0 -40.0 0.0 0.0
- -1.0 0.0 0.0 -2.0 0.0 1.0 0.0 0.0 0.0 0.0
- -1.0 0.0 1.0 0.0 0.0 >
- end_quartic
-
- { 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.0 0.0 1.0 0.0 0.0 0.0 0.0 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.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 >
- end_quartic
-
- { 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 0.0 0.0 2.0 0.0 0.0 0.0 -2.0 -104.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 -2.0 56.0 0.0 0.0 0.0 0.0
- 0.0 0.0 1.0 104.0 784.0 >
- end_quartic
-
- { 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.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 1.0 0.0 0.0 0.0 0.0
- 0.0 0.0 1.0 0.0 0.0 >
- end_quartic
-
- { 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 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 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 -1.0 0.0 0.9 >
- end_quartic
-
- { Quartic Cylinder - a Space Needle? }
- #declare Quartic_Cylinder =
- quartic
- < 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.01
- 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.0 0.0
- 0.0 0.0 0.01 0.0 -0.01 >
- end_quartic
-
- { Steiners quartic surface }
- #declare Steiner_Surface =
- quartic
- < 0.0 0.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0
- 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 1.0 0.0 0.0 0.0 0.0 0.0 0.0
- 0.0 0.0 0.0 0.0 0.0 >
- end_quartic
-
- { Torus having major radius sqrt(40), minor radius sqrt(12) }
- #declare Torus_40_12 =
- quartic
- < 1.0 0.0 0.0 0.0 2.0 0.0 0.0 2.0 0.0 -104.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 2.0 0.0 56.0 0.0 0.0 0.0 0.0
- 1.0 0.0 -104.0 0.0 784.0 >
- end_quartic
-
- { Witch of Agnesi }
- #declare Witch_Hat =
- quartic
- < 0.0 0.0 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 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.04
- 0.0 0.0 0.0 0.0 0.04 >
- end_quartic
-
- { 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 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
- 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 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 >
- end_poly
-
- { 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.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 >
- end_quartic
- }
-