麻烦用Java中的乌龟绘制偶数点的星

时间:2014-03-10 02:15:08

标签: java graphics geometry draw turtle-graphics

好吧,所以这是一个作业,我已经如此接近想通了。基本上,我们获得了创建乌龟的代码,测试客户端绘制了具有n个边的多边形。说明是修改测试客户端,以便绘制一个有n个点的星。要使用n的奇数值,这很容易,因为我只是将turtle.turnLeft(angle)更改为turtle.turnLeft(angle * 2)。

我认为我的大部分麻烦来自对星形几何的完全无知。我试图绘制它并在点之间制作三角形,我测试了几个不同的东西,但我不断得到类似这样的线:VVVV并略微向左转。

原始代码:

public class Turtle
{
private double x, y;
private double angle;

public Turtle(double x0, double y0, double a0)
{ x=x0; y=y0; angle=a0;}

public void turnLeft(double delta)
{angle += delta;}

public void goForward(double step)
{
    double oldx=x, oldy=y;
    x+=step*Math.cos(Math.toRadians(angle));
    y+=step*Math.sin(Math.toRadians(angle));
    StdDraw.line(oldx, oldy, x, y);
}

public static void main(String[] args)
{
    int N=Integer.parseInt(args[0]);
    double angle = 360.0/N;
    double step = Math.sin(Math.toRadians(angle/2));

    Turtle turtle= new Turtle(0.5, 0.0, angle/2);

    for (int i=0;i<N;i++)
    {
        turtle.goForward(step);
        turtle.turnLeft(angle);
}}}

再次编辑:

修订后的代码(再次):

  public static void main(String[] args)
{
    int N=Integer.parseInt(args[0]);
    double angle = 360.0/N;

    double q = ((N-2)*180)/N;
    double p = ((180-q)/2);
    double t = (180-q);
    double v = (180 - 2*t);

    double step = Math.sin(Math.toRadians(angle/2));


    Turtle turtle= new Turtle(0.5, 0.0, (angle/2 + p));

    for (int i=0;i<N;i++)
    {


        turtle.goForward(step/2);
        turtle.turnLeft(-t);
        turtle.goForward(step/2);
        turtle.turnLeft(180-v);
}}}

这个为N的所有值提供了一个完美的恒星,除了7由于某种原因。

enter image description here

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

double q = ((N-2)*180.)/N;

这是为了确保使用双精度计算整个表达式并避免截断小数部分...(N = 3,4,5,6,8,9,10,12,15不是问题, 18,20 ......)。