1+ package top .zoyn .particlelib .utils ;
2+
3+ import org .bukkit .util .Vector ;
4+
5+ import java .util .ArrayList ;
6+ import java .util .List ;
7+
8+ public class Icosahedron {
9+
10+ public static double X = 0.525731112119133606f ;
11+ public static double Z = 0.850650808352039932f ;
12+
13+ public static double [][] vdata = {{-X , +0 , +Z }, {+X , +0 , +Z }, {-X , +0 , -Z }, {+X , +0 , -Z }, {+0 , +Z , +X }, {+0 , +Z , -X },
14+ {+0 , -Z , +X }, {+0 , -Z , -X }, {+Z , +X , +0 }, {-Z , +X , +0 }, {+Z , -X , +0 }, {-Z , -X , +0 }};
15+
16+ public static int [][] tindx = {{0 , 4 , 1 }, {0 , 9 , 4 }, {9 , 5 , 4 }, {4 , 5 , 8 }, {4 , 8 , 1 }, {8 , 10 , 1 }, {8 , 3 , 10 },
17+ {5 , 3 , 8 }, {5 , 2 , 3 }, {2 , 7 , 3 }, {7 , 10 , 3 }, {7 , 6 , 10 }, {7 , 11 , 6 }, {11 , 0 , 6 }, {0 , 1 , 6 }, {6 , 1 , 10 },
18+ {9 , 0 , 11 }, {9 , 11 , 2 }, {9 , 2 , 5 }, {7 , 2 , 11 }};
19+ private final List <Triangle > triangles = new ArrayList <>();
20+
21+ public static double mod (double [] v ) {
22+ return Math .sqrt (v [0 ] * v [0 ] + v [1 ] * v [1 ] + v [2 ] * v [2 ]);
23+ }
24+
25+ public void drawIcosahedron (int depth , float radius ) {
26+ for (int i = 0 ; i < tindx .length ; i ++) {
27+ subdivide (
28+ vdata [tindx [i ][0 ]], //
29+ vdata [tindx [i ][1 ]], //
30+ vdata [tindx [i ][2 ]], depth , radius );
31+ }
32+ }
33+
34+ private void drawTriangle (double [] vA0 , double [] vB1 , double [] vC2 , float radius ) {
35+ Triangle triangle = new Triangle (
36+ new Vector (vA0 [0 ], vA0 [1 ], vA0 [2 ]).multiply (radius ),
37+ new Vector (vB1 [0 ], vB1 [1 ], vB1 [2 ]).multiply (radius ),
38+ new Vector (vC2 [0 ], vC2 [1 ], vC2 [2 ]).multiply (radius ));
39+ triangles .add (triangle );
40+ }
41+
42+
43+ private void subdivide (double [] vA0 , double [] vB1 , double [] vC2 , int depth , float radius ) {
44+
45+ double [] vAB = new double [3 ];
46+ double [] vBC = new double [3 ];
47+ double [] vCA = new double [3 ];
48+
49+ int i ;
50+
51+ if (depth == 0 ) {
52+ drawTriangle (vA0 , vB1 , vC2 , radius );
53+ return ;
54+ }
55+
56+ for (i = 0 ; i < 3 ; i ++) {
57+ vAB [i ] = (vA0 [i ] + vB1 [i ]) / 2 ;
58+ vBC [i ] = (vB1 [i ] + vC2 [i ]) / 2 ;
59+ vCA [i ] = (vC2 [i ] + vA0 [i ]) / 2 ;
60+ }
61+
62+ double modAB = mod (vAB );
63+ double modBC = mod (vBC );
64+ double modCA = mod (vCA );
65+
66+ for (i = 0 ; i < 3 ; i ++) {
67+ vAB [i ] /= modAB ;
68+ vBC [i ] /= modBC ;
69+ vCA [i ] /= modCA ;
70+ }
71+
72+ subdivide (vA0 , vAB , vCA , depth - 1 , radius );
73+ subdivide (vB1 , vBC , vAB , depth - 1 , radius );
74+ subdivide (vC2 , vCA , vBC , depth - 1 , radius );
75+ subdivide (vAB , vBC , vCA , depth - 1 , radius );
76+ }
77+
78+ public List <Triangle > getTriangles () {
79+ return triangles ;
80+ }
81+
82+ public static class Triangle {
83+ public Vector point1 ;
84+ public Vector point2 ;
85+ public Vector point3 ;
86+
87+ public Triangle (Vector point1 , Vector point2 , Vector point3 ) {
88+ this .point1 = point1 ;
89+ this .point2 = point2 ;
90+ this .point3 = point3 ;
91+ }
92+
93+ }
94+ }
0 commit comments