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      //https://en.wikipedia.org/wiki/Regular_dodecahedron#Cartesian_coordinates
050      // (±r, ±r, ±r)
051      Vertex v00 = new Vertex(-r, -r, -r);
052      Vertex v01 = new Vertex(-r, -r,  r);
053      Vertex v02 = new Vertex(-r,  r, -r);
054      Vertex v03 = new Vertex(-r,  r,  r);
055      Vertex v04 = new Vertex( r, -r, -r);
056      Vertex v05 = new Vertex( r, -r,  r);
057      Vertex v06 = new Vertex( r,  r, -r);
058      Vertex v07 = new Vertex( r,  r,  r);
059
060      // (0, ±r2, ±1)
061      Vertex v08 = new Vertex( 0, -r2, -1);
062      Vertex v09 = new Vertex( 0, -r2,  1);
063      Vertex v10 = new Vertex( 0,  r2, -1);
064      Vertex v11 = new Vertex( 0,  r2,  1);
065
066      // (±r2, ±1, 0)
067      Vertex v12 = new Vertex(-r2, -1,  0);
068      Vertex v13 = new Vertex(-r2,  1,  0);
069      Vertex v14 = new Vertex( r2, -1,  0);
070      Vertex v15 = new Vertex( r2,  1,  0);
071
072      // (±1, 0, ±r2)
073      Vertex v16 = new Vertex(-1,  0, -r2);
074      Vertex v17 = new Vertex( 1,  0, -r2);
075      Vertex v18 = new Vertex(-1,  0,  r2);
076      Vertex v19 = new Vertex( 1,  0,  r2);
077/*
078      // These vertices create a dodecahedron with vertices
079      // on a sphere of radius sqrt(3), and with edge length
080      //    2/t = 4/(1 + sqrt(5)) = sqrt(5) - 1 = 1.2361.
081      //https://en.wikipedia.org/wiki/Regular_dodecahedron#Cartesian_coordinates
082      // (±1, ±1, ±1)
083      Vertex v00 = new Vertex(-1, -1, -1);
084      Vertex v01 = new Vertex(-1, -1,  1);
085      Vertex v02 = new Vertex(-1,  1, -1);
086      Vertex v03 = new Vertex(-1,  1,  1);
087      Vertex v04 = new Vertex( 1, -1, -1);
088      Vertex v05 = new Vertex( 1, -1,  1);
089      Vertex v06 = new Vertex( 1,  1, -1);
090      Vertex v07 = new Vertex( 1,  1,  1);
091
092      // (0, ±r, ±t)
093      Vertex v08 = new Vertex( 0, -r, -t);
094      Vertex v09 = new Vertex( 0, -r,  t);
095      Vertex v10 = new Vertex( 0,  r, -t);
096      Vertex v11 = new Vertex( 0,  r,  t);
097
098      // (±r, ±t, 0)
099      Vertex v12 = new Vertex(-r, -t,  0);
100      Vertex v13 = new Vertex(-r,  t,  0);
101      Vertex v14 = new Vertex( r, -t,  0);
102      Vertex v15 = new Vertex( r,  t,  0);
103
104      // (±t, 0, ±r)
105      Vertex v16 = new Vertex(-t,  0, -r);
106      Vertex v17 = new Vertex( t,  0, -r);
107      Vertex v18 = new Vertex(-t,  0,  r);
108      Vertex v19 = new Vertex( t,  0,  r);
109*/
110      // Create 30 line segments (that make up 12 faces).
111//https://github.com/mrdoob/three.js/blob/master/src/geometries/DodecahedronGeometry.js
112      addLineSegment(v03, v11);
113      addLineSegment(v11, v07);
114      addLineSegment(v07, v15);
115      addLineSegment(v15, v13);
116      addLineSegment(v13, v03);
117
118      addLineSegment(v07, v19);
119      addLineSegment(v19, v17);
120      addLineSegment(v17, v06);
121      addLineSegment(v06, v15);
122
123      addLineSegment(v17, v04);
124      addLineSegment(v04, v08);
125      addLineSegment(v08, v10);
126      addLineSegment(v10, v06);
127
128      addLineSegment(v08, v00);
129      addLineSegment(v00, v16);
130      addLineSegment(v16, v02);
131      addLineSegment(v02, v10);
132
133      addLineSegment(v00, v12);
134      addLineSegment(v12, v01);
135      addLineSegment(v01, v18);
136      addLineSegment(v18, v16);
137
138      addLineSegment(v02, v13);
139
140      addLineSegment(v18, v03);
141
142      addLineSegment(v01, v09);
143      addLineSegment(v09, v11);
144
145      addLineSegment(v04, v14);
146      addLineSegment(v14, v12);
147
148      addLineSegment(v09, v05);
149      addLineSegment(v05, v19);
150
151      addLineSegment(v05, v14);
152   }
153}//Dodecahedron