001/* 002 003*/ 004 005package renderer.models; 006import renderer.scene.*; 007 008/** 009 Create a wireframe model of a regular icosahedron 010 with its center at the origin, having edge length 011 <pre>{@code 012 4/(1+sqrt(5)) = 1.2361, 013 }</pre> 014 and with its vertices on a sphere of radius 015 <pre>{@code 016 4/(1+sqrt(5)) * sin(2Pi/5) = 1.1756. 017 }</pre> 018<p> 019 See <a href="https://en.wikipedia.org/wiki/Regular_icosahedron" target="_top"> 020 https://en.wikipedia.org/wiki/Regular_icosahedron</a> 021 022 @see Tetrahedron 023 @see Cube 024 @see Octahedron 025 @see Dodecahedron 026*/ 027public class Icosahedron extends Model 028{ 029 /** 030 Create a regular icosahedron with its center at 031 the origin, having edge length 032 <pre>{@code 033 4/(1+sqrt(5)) = 1.2361, 034 }</pre> 035 and with its vertices on a sphere of radius 036 <pre>{@code 037 4/(1+sqrt(5)) * sin(2Pi/5) = 1.1756. 038 }</pre> 039 */ 040 public Icosahedron() 041 { 042 super(); 043 044 // Create the icosahedron's geometry. 045 // It has 12 vertices and 30 edges. 046 double t = (1 + Math.sqrt(5))/2; // golden ratio 047 double r = 1/t; 048 Vertex[] v = new Vertex[20]; 049 //https://en.wikipedia.org/wiki/Regular_icosahedron#Cartesian_coordinates 050 // All cyclic permutations of (0, ±r, ±1). 051 v[0] = new Vertex(-r, 1, 0); 052 v[1] = new Vertex( r, 1, 0); 053 v[2] = new Vertex(-r, -1, 0); 054 v[3] = new Vertex( r, -1, 0); 055 v[4] = new Vertex( 0, -r, 1); 056 v[5] = new Vertex( 0, r, 1); 057 v[6] = new Vertex( 0, -r, -1); 058 v[7] = new Vertex( 0, r, -1); 059 v[8] = new Vertex( 1, 0, -r); 060 v[9] = new Vertex( 1, 0, r); 061 v[10] = new Vertex(-1, 0, -r); 062 v[11] = new Vertex(-1, 0, r); 063/* 064 // These vertices create a icosahedron with edge length 2, 065 // and vertices on a sphere of radius 066 // sqrt(10+2sqrt(5))/2 = 2sin(2Pi/5) = 1.90211. 067 //https://en.wikipedia.org/wiki/Regular_icosahedron#Cartesian_coordinates 068 // All cyclic permutations of (0, ±1, ±t). 069 v[0] = new Vertex(-1, t, 0); 070 v[1] = new Vertex( 1, t, 0); 071 v[2] = new Vertex(-1, -t, 0); 072 v[3] = new Vertex( 1, -t, 0); 073 v[4] = new Vertex( 0, -1, t); 074 v[5] = new Vertex( 0, 1, t); 075 v[6] = new Vertex( 0, -1, -t); 076 v[7] = new Vertex( 0, 1, -t); 077 v[8] = new Vertex( t, 0, -1); 078 v[9] = new Vertex( t, 0, 1); 079 v[10] = new Vertex(-t, 0, -1); 080 v[11] = new Vertex(-t, 0, 1); 081*/ 082 // Create 30 line segments. 083 // To figure out the edges, look at the orthogonal projection in the z-direction. 084 // https://en.wikipedia.org/wiki/Regular_icosahedron#Orthogonal_projections 085 086 // The edge from v[0] to v[1] is the top horizontal edge. 087 // The edge from v[2] to v[3] is the bottom horizontal edge. 088 // The edge from v[4] to v[5] is the front vertical edge. 089 // The edge from v[6] to v[7] is the back vertical edge. 090 // The edge from v[8] to v[9] is the right horizontal edge. 091 // The edge from v[10] to v[11] is the left horizontal edge. 092 093 // Working, more or less, from the top down. 094 addLineSegment(new LineSegment(new Vertex(v[ 0]), new Vertex(v[ 1]))); 095 addLineSegment(new LineSegment(new Vertex(v[ 0]), new Vertex(v[ 5]))); 096 addLineSegment(new LineSegment(new Vertex(v[ 0]), new Vertex(v[ 7]))); 097 addLineSegment(new LineSegment(new Vertex(v[ 0]), new Vertex(v[11]))); 098 addLineSegment(new LineSegment(new Vertex(v[ 0]), new Vertex(v[10]))); 099 addLineSegment(new LineSegment(new Vertex(v[ 1]), new Vertex(v[ 5]))); 100 addLineSegment(new LineSegment(new Vertex(v[ 1]), new Vertex(v[ 7]))); 101 addLineSegment(new LineSegment(new Vertex(v[ 1]), new Vertex(v[ 9]))); 102 addLineSegment(new LineSegment(new Vertex(v[ 1]), new Vertex(v[ 8]))); 103 addLineSegment(new LineSegment(new Vertex(v[ 5]), new Vertex(v[11]))); 104 addLineSegment(new LineSegment(new Vertex(v[ 5]), new Vertex(v[ 9]))); 105 addLineSegment(new LineSegment(new Vertex(v[ 5]), new Vertex(v[ 4]))); 106 addLineSegment(new LineSegment(new Vertex(v[ 7]), new Vertex(v[10]))); 107 addLineSegment(new LineSegment(new Vertex(v[ 7]), new Vertex(v[ 8]))); 108 addLineSegment(new LineSegment(new Vertex(v[ 7]), new Vertex(v[ 6]))); 109 addLineSegment(new LineSegment(new Vertex(v[11]), new Vertex(v[10]))); 110 addLineSegment(new LineSegment(new Vertex(v[11]), new Vertex(v[ 4]))); 111 addLineSegment(new LineSegment(new Vertex(v[11]), new Vertex(v[ 2]))); 112 addLineSegment(new LineSegment(new Vertex(v[ 9]), new Vertex(v[ 8]))); 113 addLineSegment(new LineSegment(new Vertex(v[ 9]), new Vertex(v[ 4]))); 114 addLineSegment(new LineSegment(new Vertex(v[ 9]), new Vertex(v[ 3]))); 115 addLineSegment(new LineSegment(new Vertex(v[10]), new Vertex(v[ 6]))); 116 addLineSegment(new LineSegment(new Vertex(v[10]), new Vertex(v[ 2]))); 117 addLineSegment(new LineSegment(new Vertex(v[ 8]), new Vertex(v[ 6]))); 118 addLineSegment(new LineSegment(new Vertex(v[ 8]), new Vertex(v[ 3]))); 119 addLineSegment(new LineSegment(new Vertex(v[ 4]), new Vertex(v[ 2]))); 120 addLineSegment(new LineSegment(new Vertex(v[ 4]), new Vertex(v[ 3]))); 121 addLineSegment(new LineSegment(new Vertex(v[ 6]), new Vertex(v[ 2]))); 122 addLineSegment(new LineSegment(new Vertex(v[ 6]), new Vertex(v[ 3]))); 123 addLineSegment(new LineSegment(new Vertex(v[ 2]), new Vertex(v[ 3]))); 124 } 125}//Icosahedron