好吧,所以这是一个作业,我已经如此接近想通了。基本上,我们获得了创建乌龟的代码,测试客户端绘制了具有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由于某种原因。
答案 0 :(得分:1)
double q = ((N-2)*180.)/N;
这是为了确保使用双精度计算整个表达式并避免截断小数部分...(N = 3,4,5,6,8,9,10,12,15不是问题, 18,20 ......)。