Sorry if I'm just dense, but...

What's the deliverable for this quiz? I *think* I understand the 
problem, but are we supposed to emit the points of the dome to a file? 
Are we supposed to do an OpenGL interface that draws the dome? Are we 
supposed to plug our script into an industrial robot and have it start 
cranking out full-size geodesic domes for use in construction projects?

Just curious what was expected. :)

- Jamis

Ruby Quiz wrote:
> The three rules of Ruby Quiz:
> 
> 1.  Please do not post any solutions or spoiler discussion for this quiz until
> 48 hours have passed from the time on this message.
> 
> 2.  Support Ruby Quiz by submitting ideas as often as you can:
> 
> http://www.grayproductions.net/ruby_quiz/
> 
> 3.  Enjoy!
> 
> -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
> 
> by Gavin Kistner
> 
> SUMMARY
> 
> Given the faces for a tetrahedron, octahedron, or isocahedron, create a geodesic
> dome of arbitrary frequency.
> 
> The (equilateral triangle) faces of each primitive are given as triplets of
> vertex points. Each vertex is itself a triplet of cartesian 3-space coordinates,
> all of unit-distance from 0,0,0. (See the supplied points at the end for an
> example.) The resulting geodesic should be an array of triangular faces; again
> each face is a triplet of points, and each point is unit-distance from 0,0,0.
> 
> DETAILS
> 
> A 'simple' solution (using recursion) exists to subdivide each primary face into
> 4^n sub-faces. Instead, the following (more flexible) algorithm should be used,
> which allows for n^2 sub-faces:
> 
> [See http://phrogz.net/CSS/Geodesics/index.html for a visual example of the
> following algorithm.]
> 
> Step 1) Start with the three points defining a primary face.
> 
> Step 2) Divide each side of the face into equal length pieces; the number of
> pieces is specified by the 'frequency'. (A frequency of 0 subdivides the face
> not at all, a frequency of 1 divides each side into two equal pieces, a
> frequency of 2 into three equal pieces, and so on.)
> 
> Step 3) Connect each division point along two sides with a line that is parallel
> to the third side.
> 
> Step 4) Repeat with lines parallel to all three sides.
> 
> Step 5) New points are defined wherever the lines intersect.
> 
> The combination of the initial face points, the edge points, and the
> intersection of the connecting lines provide the points for the faces of the
> geodesic. (As diagrammed in http://phrogz.net/CSS/Geodesics/index.html#step5,
> the 16 faces created by subdividing the primary face with frequency 3 can be
> described as Aqm, qfm, qrf, rgf, rsg, szg, sBz, mfn, fhn, fgh, gyh, gzy, nho,
> hxo, hyx, oxC. )
> 
> All points should be 'normalized', so that they are unit-distance from the
> origin.
> 
> For extra points, ensure that the points for each face are always specified in
> the same direction, clockwise or counter-clockwise when looking from the origin.
> (The above list of faces are all specified in a clockwise direction.)
> 
> STARTER DATA
> 
> The points for the three primitives follow. (Solving for any one of them solves
> for all of them.)
> 
> 	SQRT2 = Math.sqrt(2)
> 	SQRT3 = Math.sqrt(3)
> 	TETRA_Q = SQRT2 / 3
> 	TETRA_R = 1.0 / 3
> 	TETRA_S = SQRT2 / SQRT3
> 	TETRA_T = 2 * SQRT2 / 3
> 	GOLDEN_MEAN = (Math.sqrt(5)+1)/2
> 	
> 	PRIMITIVES = {
> 		:tetrahedron => {
> 			:points => {
> 				'a' => Vector[ -TETRA_S, -TETRA_Q, -TETRA_R ],
> 				'b' => Vector[  TETRA_S, -TETRA_Q, -TETRA_R ],
> 				'c' => Vector[        0,  TETRA_T, -TETRA_R ],
> 				'd' => Vector[        0,        0,        1 ]
> 			},
> 			:faces => %w| acb abd adc dbc |
> 		},
> 		:octahedron => {
> 			:points => {
> 				'a' => Vector[  0,  0,  1 ],
> 				'b' => Vector[  1,  0,  0 ],
> 				'c' => Vector[  0, -1,  0 ],
> 				'd' => Vector[ -1,  0,  0 ],
> 				'e' => Vector[  0,  1,  0 ],
> 				'f' => Vector[  0,  0, -1 ]
> 			},
> 			:faces => %w| cba dca eda bea
> 						  def ebf bcf cdf |
> 		},
> 		:icosahedron => {
> 			:points => {
> 				'a' => Vector[  1,  GOLDEN_MEAN, 0 ],
> 				'b' => Vector[  1, -GOLDEN_MEAN, 0 ],
> 				'c' => Vector[ -1, -GOLDEN_MEAN, 0 ],
> 				'd' => Vector[ -1,  GOLDEN_MEAN, 0 ],
> 				'e' => Vector[  GOLDEN_MEAN, 0,  1 ],
> 				'f' => Vector[ -GOLDEN_MEAN, 0,  1 ],
> 				'g' => Vector[ -GOLDEN_MEAN, 0, -1 ],
> 				'h' => Vector[  GOLDEN_MEAN, 0, -1 ],
> 				'i' => Vector[ 0,  1,  GOLDEN_MEAN ],
> 				'j' => Vector[ 0,  1, -GOLDEN_MEAN ],
> 				'k' => Vector[ 0, -1, -GOLDEN_MEAN ],
> 				'l' => Vector[ 0, -1,  GOLDEN_MEAN ]
> 			},
> 			:faces => %w| iea iad idf ifl ile
> 						  eha ajd dgf fcl lbe
> 						  ebh ahj djg fgc lcb
> 						  khb kjh kgj kcg kbc |
> 		}
> 	}
> 
> .
> 


-- 
Jamis Buck
jgb3 / email.byu.edu
http://www.jamisbuck.org/jamis