使用Java绘制带有线条和紧密度参数的阿基米德螺线

时间:2018-01-29 00:52:15

标签: java graphics geometry trigonometry stddraw

这使用一个名为StdDraw的库来绘制一条线。我正在尝试制作一个螺旋绘图方法,它采用中心坐标,要使用的线段数,最大半径和螺旋(spinRate)的“紧密度”。

到目前为止,这是我的代码:

public void spiral(double x0, double y0, double maxRadius, int 
numSegments, double spinRate) {
    double angle = 0;
    double x = x0;
    double y = y0;
    double R = maxRadius/(2*Math.PI);
    for (int i = 0; i < numSegments; ++i) {
        double x1 = x;
        double y1 = y;  
        angle += spinRate/maxRadius;
        x = x0 + R*angle*Math.cos(angle);
        y = y0 + R*angle*Math.sin(angle);
        StdDraw.line(x, y, x1, y1);

    }
}

现在它将绘制一个螺旋线,但是如果我将spinRate设置为1,我会得到这个:

img

如果我将spinRate设置为2,我会得到:

img

因此半径根据spinRate而不是保持不变而改变。显然,角度不会越来越紧。

Trig根本不是我的事情,我对此问题感到困惑。

以下是我希望它的样子:

旋转速度1:

img

旋转速度2:

img

所以你看,半径是恒定的,但它是一个更紧凑的螺旋。

编辑:

这是解决方案。

    public static void spiral(double x0, double y0, double maxRadius, int 
        numSegments, double spinRate) {
            double radius = 0;
            double x = x0;
            double y = y0;
            double deltaR = maxRadius/numSegments; 
            for (int i = 0; i < numSegments; ++i) {
                double x1 = x;
                double y1 = y;  
                radius += deltaR; 
                x = x0 + radius*Math.cos((2*Math.PI*i/numSegments) * spinRate);
                y = y0 + radius*Math.sin((2*Math.PI*i/numSegments) * spinRate);
                StdDraw.line(x, y, x1, y1);
            } 
    }

0 个答案:

没有答案