问题描述
我想用 Java 中的粒子(或任何实体)创建“螺旋效果”。
我是目标编程(以及 Java)的新手,所以我从更简单的事情开始。我首先创建了一个 Path 对象,它的值是 Locations[] 签名,它从用户那里获取:起始位置、结束位置和双值,这告诉他,路径中每个位置之间有多少空间.
private void setLocations() {
//initialize vars
Location start = getStart();
World world = start.getWorld();
Location[] locations = new Location[amount];
double x = start.getX();
double y = start.getY();
double z = start.getZ();
//loop that will set values for locations
for (int i = 0; i < amount; i++) {
locations[i] = new Location(
world,x + divideddistanceX * (i + 1),y + divideddistanceY * (i + 1),z + divideddistanceZ * (i + 1)
);
}
this.locations = locations;
}
现在您可能会问金额是多少?所以简单地说就是初始化对象时创建的点数。这是一个简单的数学运算,比如获得点到点的最长距离,然后除以每个点之间的空间值。
现在情况有点复杂了,所以我为你准备了图形:)
我想围绕最长轴旋转点以形成某种形式的螺旋,我希望用户设置起点和新点之间的最大距离。
像这样:
老实说,我需要一些帮助。
这里是 GitHub object link
我知道我需要做的事情:
解决方法
好吧,所以我做到了,甚至没有那么难:
public Location[] createSpiral(double radius,float angle,Location[] path) {
final int length = path.length;
Location[] result = path.clone();
Location start = path[0];
Location end = path[length - 1];
double startX = start.getX();
double startY = start.getY();
double startZ = start.getZ();
double endX = end.getX();
double endY = end.getY();
double endZ = end.getZ();
double distanceX = setDistance(startX,endX);
double distanceY = setDistance(startY,endY);
double distanceZ = setDistance(startZ,endZ);
double highestOffset = getHighestOffset(new double[]{distanceX,distanceY,distanceZ});
if (highestOffset == abs(distanceX)) {
for (int i = 0; i < length; i++) {
double sin = radius * sin(angle * i / length);
double cos = radius * cos(angle * i / length);
result[i].setY(result[i].getY() + cos);
result[i].setZ(result[i].getZ() + sin);
}
} else if (highestOffset == abs(distanceY)) {
for (int i = 0; i < length; i++) {
double sin = radius * sin(angle * i / length);
double cos = radius * cos(angle * i / length);
result[i].setX(result[i].getX() + cos);
result[i].setZ(result[i].getZ() + sin);
}
} else if (highestOffset == abs(distanceZ)) {
for (int i = 0; i < length; i++) {
double sin = radius * sin(angle * i / length);
double cos = radius * cos(angle * i / length);
result[i].setX(result[i].getX() + cos);
result[i].setY(result[i].getY() + sin);
}
} else {
return path;
}
return result;
}
只是
double sin = radius * sin(angle * i / length);
double cos = radius * cos(angle * i / length);
如果 Z 与某个位置的距离最大,则将这些值添加到相应的 X、Y 等。
其余的代码和方法位于上面的 GitHub 链接中。