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