001/*
002
003*/
004
005package renderer.models;
006import  renderer.scene.*;
007
008/**
009   Create a wireframe model of a regular dodecahedron
010   with its center at the origin, having edge length
011   <pre>{@code
012     2*(sqrt(5)-1)/(1+sqrt(5)) = (1/2)*(sqrt(5)-1)^2 = 0.7639,
013   }</pre>
014   and with its vertices on a sphere of radius
015   <pre>{@code
016     2*sqrt(3)/(1+sqrt(5)) = 1.0705.
017   }</pre>
018<p>
019   See <a href="https://en.wikipedia.org/wiki/Regular_dodecahedron" target="_top">
020                https://en.wikipedia.org/wiki/Regular_dodecahedron</a>
021
022   @see Tetrahedron
023   @see Cube
024   @see Octahedron
025   @see Icosahedron
026*/
027public class Dodecahedron extends Model
028{
029   /**
030      Create a regular dodecahedron with its center at
031      the origin, having edge length
032      <pre>{@code
033        2*(sqrt(5)-1)/(1+sqrt(5)) = (1/2)*(sqrt(5)-1)^2 = 0.7639,
034      }</pre>
035      and with its vertices on a sphere of radius
036      <pre>{@code
037        2*sqrt(3)/(1+sqrt(5)) = 1.0705.
038     }</pre>
039   */
040   public Dodecahedron()
041   {
042      super();
043
044      // Create the dodecahedron's geometry.
045      // It has 20 vertices and 30 edges.
046      double t = (1 + Math.sqrt(5))/2;   // golden ratio
047      double r = 1/t;
048      double r2 = r * r;
049      Vertex[] v = new Vertex[20];
050      //https://en.wikipedia.org/wiki/Regular_dodecahedron#Cartesian_coordinates
051      // (±r, ±r, ±r)
052      v[0] = new Vertex(-r, -r, -r);
053      v[1] = new Vertex(-r, -r,  r);
054      v[2] = new Vertex(-r,  r, -r);
055      v[3] = new Vertex(-r,  r,  r);
056      v[4] = new Vertex( r, -r, -r);
057      v[5] = new Vertex( r, -r,  r);
058      v[6] = new Vertex( r,  r, -r);
059      v[7] = new Vertex( r,  r,  r);
060
061      // (0, ±r2, ±1)
062      v[8] = new Vertex( 0, -r2, -1);
063      v[9] = new Vertex( 0, -r2,  1);
064     v[10] = new Vertex( 0,  r2, -1);
065     v[11] = new Vertex( 0,  r2,  1);
066
067      // (±r2, ±1, 0)
068     v[12] = new Vertex(-r2, -1,  0);
069     v[13] = new Vertex(-r2,  1,  0);
070     v[14] = new Vertex( r2, -1,  0);
071     v[15] = new Vertex( r2,  1,  0);
072
073      // (±1, 0, ±r2)
074     v[16] = new Vertex(-1,  0, -r2);
075     v[17] = new Vertex( 1,  0, -r2);
076     v[18] = new Vertex(-1,  0,  r2);
077     v[19] = new Vertex( 1,  0,  r2);
078/*
079      // These vertices create a dodecahedron with vertices
080      // on a sphere of radius sqrt(3), and with edge length
081      //    2/t = 4/(1 + sqrt(5)) = sqrt(5) - 1 = 1.2361.
082      //https://en.wikipedia.org/wiki/Regular_dodecahedron#Cartesian_coordinates
083      // (±1, ±1, ±1)
084      v[0] = new Vertex(-1, -1, -1);
085      v[1] = new Vertex(-1, -1,  1);
086      v[2] = new Vertex(-1,  1, -1);
087      v[3] = new Vertex(-1,  1,  1);
088      v[4] = new Vertex( 1, -1, -1);
089      v[5] = new Vertex( 1, -1,  1);
090      v[6] = new Vertex( 1,  1, -1);
091      v[7] = new Vertex( 1,  1,  1);
092
093      // (0, ±r, ±t)
094      v[8] = new Vertex( 0, -r, -t);
095      v[9] = new Vertex( 0, -r,  t);
096     v[10] = new Vertex( 0,  r, -t);
097     v[11] = new Vertex( 0,  r,  t);
098
099      // (±r, ±t, 0)
100     v[12] = new Vertex(-r, -t,  0);
101     v[13] = new Vertex(-r,  t,  0);
102     v[14] = new Vertex( r, -t,  0);
103     v[15] = new Vertex( r,  t,  0);
104
105      // (±t, 0, ±r)
106     v[16] = new Vertex(-t,  0, -r);
107     v[17] = new Vertex( t,  0, -r);
108     v[18] = new Vertex(-t,  0,  r);
109     v[19] = new Vertex( t,  0,  r);
110*/
111      // Create 30 line segments (that make up 12 faces).
112//https://github.com/mrdoob/three.js/blob/master/src/geometries/DodecahedronGeometry.js
113      addLineSegment(new LineSegment(new Vertex(v[ 3]), new Vertex(v[11])));
114      addLineSegment(new LineSegment(new Vertex(v[11]), new Vertex(v[ 7])));
115      addLineSegment(new LineSegment(new Vertex(v[ 7]), new Vertex(v[15])));
116      addLineSegment(new LineSegment(new Vertex(v[15]), new Vertex(v[13])));
117      addLineSegment(new LineSegment(new Vertex(v[13]), new Vertex(v[ 3])));
118
119      addLineSegment(new LineSegment(new Vertex(v[ 7]), new Vertex(v[19])));
120      addLineSegment(new LineSegment(new Vertex(v[19]), new Vertex(v[17])));
121      addLineSegment(new LineSegment(new Vertex(v[17]), new Vertex(v[ 6])));
122      addLineSegment(new LineSegment(new Vertex(v[ 6]), new Vertex(v[15])));
123
124      addLineSegment(new LineSegment(new Vertex(v[17]), new Vertex(v[ 4])));
125      addLineSegment(new LineSegment(new Vertex(v[ 4]), new Vertex(v[ 8])));
126      addLineSegment(new LineSegment(new Vertex(v[ 8]), new Vertex(v[10])));
127      addLineSegment(new LineSegment(new Vertex(v[10]), new Vertex(v[ 6])));
128
129      addLineSegment(new LineSegment(new Vertex(v[ 8]), new Vertex(v[ 0])));
130      addLineSegment(new LineSegment(new Vertex(v[ 0]), new Vertex(v[16])));
131      addLineSegment(new LineSegment(new Vertex(v[16]), new Vertex(v[ 2])));
132      addLineSegment(new LineSegment(new Vertex(v[ 2]), new Vertex(v[10])));
133
134      addLineSegment(new LineSegment(new Vertex(v[ 0]), new Vertex(v[12])));
135      addLineSegment(new LineSegment(new Vertex(v[12]), new Vertex(v[ 1])));
136      addLineSegment(new LineSegment(new Vertex(v[ 1]), new Vertex(v[18])));
137      addLineSegment(new LineSegment(new Vertex(v[18]), new Vertex(v[16])));
138
139      addLineSegment(new LineSegment(new Vertex(v[ 2]), new Vertex(v[13])));
140
141      addLineSegment(new LineSegment(new Vertex(v[18]), new Vertex(v[ 3])));
142
143      addLineSegment(new LineSegment(new Vertex(v[ 1]), new Vertex(v[ 9])));
144      addLineSegment(new LineSegment(new Vertex(v[ 9]), new Vertex(v[11])));
145
146      addLineSegment(new LineSegment(new Vertex(v[ 4]), new Vertex(v[14])));
147      addLineSegment(new LineSegment(new Vertex(v[14]), new Vertex(v[12])));
148
149      addLineSegment(new LineSegment(new Vertex(v[ 9]), new Vertex(v[ 5])));
150      addLineSegment(new LineSegment(new Vertex(v[ 5]), new Vertex(v[19])));
151
152      addLineSegment(new LineSegment(new Vertex(v[ 5]), new Vertex(v[14])));
153   }
154}//Dodecahedron