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