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 icosidodecahedron
014   with its center at the origin, having edge length
015   <pre>{@code
016     4/(1+sqrt(5)) = 1.2361,
017   }</pre>
018   and with its vertices on a sphere of radius
019   <pre>{@code
020     4/(1+sqrt(5)) * sin(2Pi/5) = 1.1756.
021   }</pre>
022<p>
023   See <a href="https://en.wikipedia.org/wiki/Icosidodecahedron" target="_top">
024                https://en.wikipedia.org/wiki/Icosidodecahedron</a>
025
026   @see Tetrahedron
027   @see Cube
028   @see Octahedron
029   @see Dodecahedron
030   @see Icosahedron
031*/
032public class Icosidodecahedron extends Model
033{
034   /**
035      Create a icosidodecahedron with its center at
036      the origin, having edge length
037      <pre>{@code
038        4/(1+sqrt(5)) = 1.2361,
039      }</pre>
040      and with its vertices on a sphere of radius
041      <pre>{@code
042        4/(1+sqrt(5)) * sin(2Pi/5) = 1.1756.
043      }</pre>
044   */
045   public Icosidodecahedron()
046   {
047      super("Icosidodecahedron");
048
049      // Create the icosidodecahedron's geometry.
050      // It has 30 vertices and 60 edges.
051      //https://en.wikipedia.org/wiki/Icosidodecahedron#Cartesian_coordinates
052      //http://www.georgehart.com/virtual-polyhedra/vrml/icosidodecahedron.wrl
053      final double t = (1 + Math.sqrt(5))/2;  // golden ratio
054      final double r = t - 1; // (-1 + Math.sqrt(5))/2;
055      addVertex(new Vertex( 0,          0,          1.051462),
056                new Vertex( r,          0,          0.8506508),
057                new Vertex( 0.2763932,  0.5527864,  0.8506508),
058                new Vertex(-r,          0,          0.8506508),
059                new Vertex(-0.2763932, -0.5527864,  0.8506508),
060                new Vertex( 1,          0,          0.3249197),
061                new Vertex( 0.7236068, -0.5527864,  0.5257311),
062                new Vertex(-0.1708204,  0.8944272,  0.5257311),
063                new Vertex( 0.4472136,  0.8944272,  0.3249197),
064                new Vertex(-1,          0,          0.3249197),
065                new Vertex(-0.7236068,  0.5527864,  0.5257311),
066                new Vertex( 0.1708204, -0.8944272,  0.5257311),
067                new Vertex(-0.4472136, -0.8944272,  0.3249197),
068                new Vertex( 1,          0,         -0.3249197),
069                new Vertex( 0.8944272,  0.5527864,  0),
070                new Vertex( 0.5527864, -0.8944272,  0),
071                new Vertex(-0.5527864,  0.8944272,  0),
072                new Vertex( 0.4472136,  0.8944272, -0.3249197),
073                new Vertex(-1,          0,         -0.3249197),
074                new Vertex(-0.8944272, -0.5527864,  0),
075                new Vertex(-0.4472136, -0.8944272, -0.3249197),
076                new Vertex( r,          0,         -0.8506508),
077                new Vertex( 0.7236068, -0.5527864, -0.5257311),
078                new Vertex( 0.1708204, -0.8944272, -0.5257311),
079                new Vertex(-0.7236068,  0.5527864, -0.5257311),
080                new Vertex(-0.1708204,  0.8944272, -0.5257311),
081                new Vertex( 0.2763932,  0.5527864, -0.8506508),
082                new Vertex(-r,          0,         -0.8506508),
083                new Vertex(-0.2763932, -0.5527864, -0.8506508),
084                new Vertex( 0,          0,         -1.051462));
085
086      // Create 60 line segments (as 12 pentagon faces).
087      addPrimitive(new LineSegment( 0,  2),
088                   new LineSegment( 2,  7),
089                   new LineSegment( 7, 10),
090                   new LineSegment(10,  3),
091                   new LineSegment( 3,  0),
092
093                   new LineSegment( 0,  4),
094                   new LineSegment( 4, 11),
095                   new LineSegment(11,  6),
096                   new LineSegment( 6,  1),
097                   new LineSegment( 1,  0),
098
099                   new LineSegment( 1,  5),
100                   new LineSegment( 5, 14),
101                   new LineSegment(14,  8),
102                   new LineSegment( 8,  2),
103                   new LineSegment( 2,  1),
104
105                   new LineSegment( 3,  9),
106                   new LineSegment( 9,  19),
107                   new LineSegment(19, 12),
108                   new LineSegment(12,  4),
109                   new LineSegment( 4,  3),
110
111                   new LineSegment( 5,  6),
112                   new LineSegment( 6, 15),
113                   new LineSegment(15, 22),
114                   new LineSegment(22, 13),
115                   new LineSegment(13,  5),
116
117                   new LineSegment( 7,  8),
118                   new LineSegment( 8, 17),
119                   new LineSegment(17, 25),
120                   new LineSegment(25, 16),
121                   new LineSegment(16,  7),
122
123                   new LineSegment( 9, 10),
124                   new LineSegment(10, 16),
125                   new LineSegment(16, 24),
126                   new LineSegment(24, 18),
127                   new LineSegment(18,  9),
128
129                   new LineSegment(11, 12),
130                   new LineSegment(12, 20),
131                   new LineSegment(20, 23),
132                   new LineSegment(23, 15),
133                   new LineSegment(15, 11),
134
135                   new LineSegment(13, 21),
136                   new LineSegment(21, 26),
137                   new LineSegment(26, 17),
138                   new LineSegment(17, 14),
139                   new LineSegment(14, 13),
140
141                   new LineSegment(18, 27),
142                   new LineSegment(27, 28),
143                   new LineSegment(28, 20),
144                   new LineSegment(20, 19),
145                   new LineSegment(19, 18),
146
147                   new LineSegment(21, 22),
148                   new LineSegment(22, 23),
149                   new LineSegment(23, 28),
150                   new LineSegment(28, 29),
151                   new LineSegment(29, 21),
152
153                   new LineSegment(24, 25),
154                   new LineSegment(25, 26),
155                   new LineSegment(26, 29),
156                   new LineSegment(29, 27),
157                   new LineSegment(27, 24));
158   }
159}//Icosidodecahedron