Проблема рисования звезды с четным количеством точек с черепахой в Java

Итак, это для задания, и я так близко к разгадке. По сути, нам дали код для создания черепахи, а тестовый клиент рисует многоугольник с 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 по какой-то причине.

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения


person Community    schedule 10.03.2014    source источник
comment
Вам нужен только контур звезды? Или вы хотите, чтобы он выглядел как вершины с нечетными номерами, где каждая вершина соединена со своим предпоследним соседом?   -  person Dawood ibn Kareem    schedule 10.03.2014
comment
Честно говоря, я не думаю, что это имеет значение, но я стремился к контуру. Если сделать это похожим на нечетные номера будет проще, я готов сделать это таким образом.   -  person    schedule 10.03.2014
comment
Нет, я думаю, что пойти на наброски будет проще. Итак, вам нужно определить угол между вершинами звезды и внутренними вершинами звезды, а затем нарисовать n*2 сегментов, чередуя углы, на которые вы поворачиваете свою черепаху. Имеет ли это смысл? Вам нужна моя помощь в расчете углов?   -  person Dawood ibn Kareem    schedule 10.03.2014
comment
Это помогает, но я не знаю, как вычислить углы точек или внутренние вершины звезды.   -  person    schedule 10.03.2014
comment
ХОРОШО. Итак, вы хорошо разобрались с внешними вершинами? Здесь есть немного свободы, в зависимости от того, насколько острой вы хотите, чтобы звезда была. Важно то, что разница между двумя углами равна 360.0/n. Итак, какой бы угол вы ни использовали для внешних вершин, просто вычтите 360.0/n и поверните в противоположном направлении.   -  person Dawood ibn Kareem    schedule 10.03.2014
comment
это также помогает: алгебра.com/алгебра/домашняя работа /Многоугольники/   -  person    schedule 10.03.2014
comment
Вы потрясающие, спасибо.   -  person    schedule 10.03.2014
comment
Добро пожаловать. Не забывайте, что угол, на который вы хотите повернуть черепаху, всегда равен 180 МИНУС фактического угла, который вы хотите нарисовать. Итак, в пятиконечном примере, чтобы сделать угол заострения равным 36 градусам, вам нужно повернуть черепаху на 144 градуса. Я надеюсь, что в этом есть смысл.   -  person Dawood ibn Kareem    schedule 10.03.2014
comment
Я продолжаю подбираться очень близко, но не совсем там. редактируя исходный пост и надеясь, что вы это увидите.   -  person    schedule 10.03.2014
comment
Хорошо, я видел вашу версию. Что произойдет, если вы измените строку, в которой вы установили turn2, на double turn2 = angle - turn;? (Извините, у меня нет удобного программного обеспечения, чтобы попробовать это самостоятельно)   -  person Dawood ibn Kareem    schedule 10.03.2014
comment
О, я не видел вашу последнюю версию до сих пор. Мне это кажется ошибкой округления - возможно, ваше программное обеспечение черепахи допускает только целые числа градусов для угла. У вас возникает та же проблема, когда n = 11 и когда n = 13, или они работают нормально?   -  person Dawood ibn Kareem    schedule 10.03.2014
comment
n = 11 и n = 13 имеют один и тот же небольшой крест. Странный.   -  person    schedule 10.03.2014
comment
Ты не знаешь, есть ли способ исправить это?   -  person    schedule 10.03.2014
comment
и еще раз огромное всем спасибо за помощь!   -  person    schedule 10.03.2014
comment
Я думал о том, как это исправить. Любой метод, о котором я думаю, кажется слишком сложным для того, что вас просят сделать. Так что я уверен, что ваш учитель не заметит эти маленькие неприятные вещи. Если вы можете сказать мне, какое программное обеспечение для черепах вы используете, я мог бы немного поиграть и посмотреть, смогу ли я придумать какие-нибудь умные идеи.   -  person Dawood ibn Kareem    schedule 10.03.2014
comment
Кроме того, не хотите ли вы, чтобы я взглянул на другой вопрос, который вы задали, - тот, о пересекающихся прямоугольниках? Из комментариев не было ясно, нашли ли вы ответ на него или нет.   -  person Dawood ibn Kareem    schedule 10.03.2014
comment
Я собираюсь добавить к моему лабораторному отчету, что ошибка округления, вероятно, ответственна за маленький крестик. Но под программным обеспечением для черепах я не совсем уверен, что вы имеете в виду. Я отвечу, что, как я думаю, вы имеете в виду: рисунки генерируются стандартной отрисовкой (introcs.cs.princeton.edu/java/stdlib/StdDraw.java.html), который предоставляется вместе с учебником. Я храню копию StdDraw в той же папке, что и моя программа. Вот API: introcs.cs.princeton.edu/java/stdlib/ javadoc/StdDraw.html   -  person    schedule 10.03.2014
comment
Мне удалось выяснить мои прямоугольники! Я разместил отредактированный код, и кто-то сказал мне, что он неправильный; однако он/она не осознавал, что значения x и y были центром прямоугольника.   -  person    schedule 10.03.2014
comment
Прохладный! Хорошо получилось с прямоугольниками. Тогда я не буду рассматривать вопрос о прямоугольнике, если вы довольны тем, как это сработало. Но позже я посмотрю на Standard Draw и посмотрю, смогу ли я что-нибудь сделать с вашей ошибкой округления. Наверное, через несколько часов.   -  person Dawood ibn Kareem    schedule 10.03.2014
comment
Я нашел вашу проблему. Вам нужно изменить строку, которая устанавливает q на double q = ((N-2)*180.0)/N; - сейчас происходит целочисленное деление, поэтому q немного отличается от того, что вы хотите.   -  person Dawood ibn Kareem    schedule 10.03.2014


Ответы (1)


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

Это делается для того, чтобы все выражение вычислялось с использованием удвоения и чтобы избежать усечения десятичной части... (не проблема для N=3, 4, 5, 6, 8, 9, 10, 12, 15, 18, 20 ...).

person Yves Daoust    schedule 10.03.2014
comment
(ранее не видел комментарий @David Wallace) - person Yves Daoust; 10.03.2014
comment
Ничего страшного. Моя вина в том, что я проработал это с amaleemur комментарием за комментарием, а не дал один связный ответ. - person Dawood ibn Kareem; 10.03.2014