C++ для начинающих Рисование правильного многоугольника

Рисование правильного многоугольника, как и рисование звезды, может вызвать определенные затруднения у любого начинающего. Странно, ведь это распространенная учебная задача, а найти практический пример решения достаточно проблематично.
Помню, когда я искал способы рисования звезды, в одном месте было написано: «сначала нужно нарисовать многоугольник» и бла бла бла бла. Для меня такая ситуация была тупиковой, поскольку я понятия не имел, как это делать. Но после того как я отыскал способ рисования этой злополучной звезды, почти сразу решил нарисовать правильный многоугольник, ориентируясь на найденное.

  • Сам по себе подход к рисованию многоугольника по алгоритму рисования звезды неверен

Его неправильность заключается в том, что необходимы лишние вычисления. Этот пример плох, но подходит для выхода из затруднительного положения. Очевидно: чтобы решить какую-либо задачу, достаточно включить немного соображалки.

В общем, будет создан правильный многоугольник, а в коде основой этого рисования станет алгоритм построения правильной звезды.

  

В общем, здесь код строит правильный многоугольник из алгоритма построения правильной звезды

Код С++ рисование правильного n-угольника

Сама суть построения этого правильного n-угольника находится в построении звезды. Наиболее внимательный читатель скорее всего увидит последствия моего плохого понимания темы. Конечно, здесь идет расчёт лишних точек, которые рассчитываются для вершин звезды и, по идее, совсем не нужны. С учётом того, что я не обладаю хорошими математическими знаниями, и, принимая во внимание то, от чего я отталкивался, всё объясняется легко: так для меня оказалось проще.

Наверное, кто-то может искренне возрадоваться: вот то, что нужно. Но нужное здесь будет показано только сейчас.
Код C++ Построение правильного многоугольника.

Время пояснений.
В окружности 360 градусов.
В правильном многоугольнике все углы равны, значит деление этих 360-ти градусов на n углов n-угольника даст внутренний угол многоугольника. Там, где мы запоминаем каждую координату, использована формула окружности.

Если говорить условно, но понятно, то можно сказать так: «Точка (x, y) движется по окружности, делая остановки. Вот эти места остановок запоминаются в массив. После прохождения всего маршрута цикл завершается». После завершения цикла можно соединять все найденные места поочередно.

Эти соединения можно выполнять сразу внутри первого цикла, но рекомендуется запоминать в массив и уже потом массив использовать (это чтоб расчеты не замедляли прорисовку).

  В формуле, где мы запоминаем координаты, нужно переводить меру из радианов в градусы.
Для этого (Угол * (ПИ/180)).
Эту формулу легко найти в интернете.

  Еще можно вот что сказать. Сначала у меня не получалось строить многоугольники например при n=200. Но изменив тип данных у всех переменных даже тысячеугольник получился/ А если поменять мои double на float — шеститысячеугольник!!
В структуре сделать int + остальное float — Десятитысячеугольник
(это я не разбираюсь просто)

Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

15 комментариев: C++ для начинающих Рисование правильного многоугольника

  • Дмитрий говорит:

    Подскажите,как правильно подключать graphics.h?или какой компилятор его знает?Неужто нужно или использовать борлданд 3.0 или прийдётся ради простой функции как построение линии использовать ОпенГЛ?

  • das говорит:

    graphics.h это для Борландовских компиляторов, следовательно знать его должны те что Borland C++. При этом, его можно подключить в Dev C++ http://kpolyakov.narod.ru/school/c/faq.htmВ Visual C++ при программировании под Windows, средств прямого доступа к аппаратуре нет. Все взаимодействие с ней производится через функции API либо с помощью специальных библиотек таких как DirectX или OpenGlВ понятие С++ понятие графики не входит и все рисование обеспечивается либо средствами Операционной системы (например как Visual Studio c Win Api) либо с помощью специальных графических библиотек (например как использование graphics.h в Borland C++)Приблизительно так все выглядит

  • Дмитрий говорит:

    А не подскажете тогда как его заставить работать в Borland C++ 5 или 6?Ибо он там не установлен сначала,я его качаю в папку C:Program FilesBorlandCBuilder6Includeзатем он просит jview.h ,затем InterfaceKit.h , а потом и все хедеры из InterfaceKit.h.

  • das говорит:

    Для того чтоб я смог ответить мне нужно скачать один этих компиляторов. Интернет у меня МТС, значит скачивание займет некоторое время (много людей знает, что такое такой интернет) вы можете мне помочь если выложите ненадолго на каком-нибудь Яндекс Диске образ диска или установщик. Если выложите, то ссылку дайте по почте daslex@yandex.ru Так я быстрее скачаю чем с торрентов Если вы в такой же ситуации как я, то выложить вы не сможете, ибо долго. Вы готовы немного подождать? (дня 2 или 3) При этом при всем я не могу дать гарантий, что у меня все получится, но попробовать мне ничто не мешает

  • Дмитрий говорит:

    Я в такой же ситуации ) интернет у меня от МТС ЮА. я готов подождать и был бы очень благодарен за помощь,так как задача стоит какраз в построение обходя опенГЛ и ему подобные библиотеки.

  • das говорит:

    Думаю вам не нужен graphics.hРисовать можно по формеForm1->Canvas->LineTo(100,100); //Это код, например при клике по кнопкеЭто обычная линия без использования всяких OpenGl,DirectX, WinApi и всего подобногоНу или разместить на форме Image (вкладка Additional) и Image1->Canvas->LineTo(100,100);никаких библиотек можно не подключатьFile ->New Application и дерзайтеНадеюсь в остальном всё быстро сообразите и надеюсь это то что вам нужно

  • Дмитрий говорит:

    Спасибо, то что нужно)

  • 3 говорит:
  • Андр говорит:

    Это просто шикарно! Спасибо!

  • newJS говорит:

    Админ, я б тебе руки поотрывал за чёрный фон.
    Это не читабельно.

    код забрал, попробую перевести на нужный мне язык

  • newJS говорит:

    Код перегнал на PureBasic, всё заработало, но сегодня вылез интересный глюк, на некоторых нечётных многоугольниках не замыкается контур, 7 и 11, есть и другие с большим количеством углов. Вылезло при попытках «заливать».
    Спасибо за код.

    P.S.
    (это чтоб расчеты не замедляли прорисовку).
    с этой фразы оборжался, может таки наоборот?

    —-
    не для печати
    о своих глазах не думаешь, так о чужих подумай

    • admin говорит:

      Есть разница между цепочкой
      а) посчитать отрезок-нарисовать отрезок-посчитать отрезок-нарисовать отрезок-посчитать отрезок-нарисовать отрезок-посчитать отрезок-нарисовать отрезок
      и цепочкой
      б) сначала провести расчёт каждой точки всех отрезков и нарисовать все отрезки по известным координатам.

      Эта фраза относится именно к этому, как бы ни было смешно, второй вариант лучше.

  • newJS говорит:

    Лоханулся я, всё правильно работает, не учёл что расчёты идут не с целыми числами, поменял тип переменных и всё стало на свои места.

    Расчёты это очень быстро, рисование это всегда медленно, вот поэтому и ржал. Заявление о том что расчёты замедляют рисование, ну чё тут скажешь, или это на СИ так? 😯
    А то что нужно сначала посчитать, а потом рисовать, так это вроде и не обсуждается.

    • admin говорит:

      Я позже поменяю ту фразу. Рисование везде всегда медленно. Расчёты, конечно, не замедляют рисование, только если не считать во время рисования. Если считать прямо во время рисование, то и без того медленное рисование замедляется дополнительно. Поэтому я и хотел дать понять, что сначала нужно провести расчёты и срисовывать с готового, а не рисовать по кусочкам, высчитывая координаты на лету. Как-то так.

Добавить комментарий

Ваш e-mail не будет опубликован.

− 4 = 4

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/mihail-flenov/php-glazami-hakera-4986825/?lfrom=15589587
Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Не, ну я всякое видел... но чтобы на фразу: "Откройте файл", открывали крышку системника - это впервые

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок