Итак, это для задания, и я так близко к разгадке. По сути, нам дали код для создания черепахи, а тестовый клиент рисует многоугольник с n сторонами. Инструкции заключаются в том, чтобы изменить тестовый клиент так, чтобы он рисовал звезду с n точками. Сделать это с нечетными значениями n было легко, потому что я просто сделал изменение от turtle.turnLeft(угол) к черепахе.turnLeft(угол*2).
Я думаю, что большая часть моих проблем связана с полным незнанием геометрии звезд. Я попытался нарисовать его и как бы сделать треугольники между точками, и я проверил несколько разных вещей, но я продолжаю получать линии, похожие на это: ВВВВ и повернуть немного влево.
исходный код:
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 по какой-то причине.
n*2
сегментов, чередуя углы, на которые вы поворачиваете свою черепаху. Имеет ли это смысл? Вам нужна моя помощь в расчете углов? - person Dawood ibn Kareem   schedule 10.03.2014360.0/n
. Итак, какой бы угол вы ни использовали для внешних вершин, просто вычтите360.0/n
и поверните в противоположном направлении. - person Dawood ibn Kareem   schedule 10.03.2014turn2
, наdouble turn2 = angle - turn;
? (Извините, у меня нет удобного программного обеспечения, чтобы попробовать это самостоятельно) - person Dawood ibn Kareem   schedule 10.03.2014n = 11
и когдаn = 13
, или они работают нормально? - person Dawood ibn Kareem   schedule 10.03.2014q
наdouble q = ((N-2)*180.0)/N;
- сейчас происходит целочисленное деление, поэтомуq
немного отличается от того, что вы хотите. - person Dawood ibn Kareem   schedule 10.03.2014