首页 文章

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

提问于
浏览
1

好吧,所以这是一个任务,我有这么近的想法 . 基本上,我们获得了创建乌龟的代码,测试客户端绘制了一个带有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的所有值提供了一个完美的恒星 .

enter image description here

enter image description here

enter image description here

1 回答

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

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

相关问题