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