围绕另一个点旋转点

问题描述

我想用 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;
}

现在您可能会问金额是多少?所以简单地说就是初始化对象时创建的点数。这是一个简单的数学运算,比如获得点到点的最长距离,然后除以每个点之间的空间值。

现在情况有点复杂了,所以我为你准备了图形:)

3D graph

我想围绕最长轴旋转点以形成某种形式的螺旋,我希望用户设置起点和新点之间的最大距离。

像这样:

Blue points are an example of new points that belong to spiral

一个围绕一个向量 (x,y) 的正弦曲线图

Sinusoid around vector(x,y)

老实说,我需要一些帮助。

这里是 GitHub object link

我知道我需要做的事情:

  1. 获取我将围绕其旋转点的轴(这是点之间的最长距离)

  2. 为其余值添加一些值 (x+something,y+something)

  3. 添加角度,该点将旋转,(例如每个点将旋转 22,5)。

解决方法

好吧,所以我做到了,甚至没有那么难:

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 链接中。