【问题标题】:How do I calculate the coordinates of the points of an helix?如何计算螺旋点的坐标?
【发布时间】:2015-01-30 21:06:26
【问题描述】:

以下代码每 50 毫秒调用一次。

// Start point
private double x;
private double y;
private double z;

private double y1;
@Override
public void run() {
    double x1 = Math.cos(y1);
    double z1 = Math.sin(y1);
    double y2 = 4D - y1;
    double x2 = Math.sin(y2);
    double z2 = Math.cos(y2);
    // First new point
    double pX1 = x + x1;
    double pY1 = y + y1;
    double pZ1 = z + z1;
    // Second new point
    double pX2 = x + x2;
    double pY2 = y + y2;
    double pZ2 = z + z2;

    if (y1 > 4D) {
        y1 = 0D;
    } else {
        y1 = y1 + 0.1D;
    }
}

这是游戏中的输出。它产生两个螺旋。 除了半径之外,我无法控制。

我正在寻找可以轻松自定义以符合我的偏好的代码。 如何控制以下几个方面?

  • 螺旋上升的速度有多快。

  • 螺旋开始的地方。

【问题讨论】:

    标签: java math geometry coordinates helix


    【解决方案1】:

    螺旋是圆形的,平面的“线性”运动

    • 您使用平面 xz 作为螺旋底,使用 y 轴作为高度
    • 所以你需要:
    • r - 半径
    • d - 两个螺丝之间的距离(整圈后的 y 运动)
    • t - 参数<0,1> 确定螺旋上的位置
    • h0,h1 - 螺旋线的起点和终点高度(y 轴)
    • a0 - 角度起始位置 [rad]

    现在如何将螺旋上的点作为参数这些参数的函数

    aa=fabs(h1-h0)*2.0*M_PI/d; // angular speed coefficient
    // if you need opposite angular direction then add aa=-aa;
    x=r*cos(a0+aa*t);
    z=r*sin(a0+aa*t);
    y=h0+((h1-h0)*t);
    
    • aa 可以预计算一次
    • 现在如果t=0.0 那么你得到了螺旋的起点
    • 如果t=1.0 那么你得到了螺旋的端点
    • 所以速度就是您在每个计时器周期的动画期间添加到 t 的量
    • d 控制螺旋圈数
    • h1-h0 是螺旋高度
    • 代码是 C++(对不起,我不是 JAVA 编码器)

    【讨论】:

    • @Joiner 如果您还需要角度末端位置,那么您必须调整 aa 以便 a0+aa=a1+k*2.0*M_PI 其中 k=...-2,-1,0,1,2,... 会稍微扭曲 d 但这不应该太明显除非你正在测量它......
    【解决方案2】:

    螺旋的一部分开始于:

    (x, y, z) = (1.0, 0.0, 0.0)
    

    另一个在:

    (x, y, z) = (-0.8, 4.0, -0.7)
    

    粒子以0.1(来自y1 = y1 + 0.1D)的速率上升。

    因此,要控制粒子上升的速度,只需更改此值即可。

    要控制螺旋线的起点,您需要更改角度。例如,为正弦和余弦添加一些值。像这样:

    Math.cos(y1 + dy);
    

    要在从地面重新开始之前进行更多旋转,您可以乘以角度。让它快两倍:

    Math.cos(2 * y1);
    

    【讨论】:

    • dy 代表什么?
    • dy 代表一个额外的角度。它可用于更改螺旋线的开始位置(在用户前面、在左侧等)。
    【解决方案3】:

    螺旋线是具有渐进Y值的圆形。

    // Start point
    private double x;
    private double y;
    private double z;
    
    private double degree;
    private double rY;
    @Override
    public void run() {
        // We use the same formula that is used to find a point of a circumference
        double rX = Math.cos(degree);
        double rZ = Math.sin(degree);
        // New point
        double pX = x + rX;
        double pY = y + rY;
        double pZ = z + rZ;
    
        if (degree > 2D * Math.PI) {
            degree = 0D;
        } else {
            degree = degree + 0.2D;
        }
        if (pY > 2D) {
            pY = 0D;
        } else {
            pY = pY + 0.02D;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 2023-01-29
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      相关资源
      最近更新 更多