Skip to content

Commit 7e03ae3

Browse files
committed
更新: 正二十边形生成工具, 向量工具类
1 parent 68e4b02 commit 7e03ae3

2 files changed

Lines changed: 105 additions & 0 deletions

File tree

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
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+
}

src/main/java/top/zoyn/particlelib/utils/VectorUtils.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,17 @@
1010
*/
1111
public class VectorUtils {
1212

13+
/**
14+
* 只通过数字本身相减得到向量, 减少额外克隆的损耗
15+
*
16+
* @param start 起点
17+
* @param end 终点
18+
* @return {@link Vector}
19+
*/
20+
public static Vector createVector(Location start, Location end) {
21+
return new Vector(end.getX() - start.getX(), end.getY() - start.getY(), end.getZ() - start.getZ());
22+
}
23+
1324
public static Vector getLeftDirection(Location location) {
1425
return rotateAroundAxisY(location.getDirection().clone(), 90);
1526
}

0 commit comments

Comments
 (0)