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