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