graphics.h Рисование правильного многоугольника

Чтобы нарисовать правильный многоугольник, нужно вспомнить одно свойство: по вершинам правильного многоугольника можно описать окружность. Чтобы получить угол правильного многоугольника, нужно 360 градусов (в окружности 360 градусов) поделить на количество вершин. После этого используя нехитрые формулы можно определять точки на окружности. Эти точки вычисляются и фиксируются в массиве. После того, как все точки вычислены, соединяем их линиями. Важно учитывать, что для наиболее точных вычислений не следует использовать целочисленный тип для вычисляемых значений. Дело в том, что если сохранять в целочисленный тип значения с отсечением, то это приведёт к тому, что рисунок будет построен неправильно. Для невычисляемых значений, предполагаемых целыми, используйте целочисленные типы на здоровье, но для вычисляемых, особенно если выполняется деление или используются какие-то функции, возвращающие нецелые числа — не надо.

Во время вычисления координат выполняется операция деления. Если делить целое на целое, то получим целое число. Т. е. вся дробная часть будет отброшена, что приведёт к погрешности в вычислениях, в последствии которых многоугольник будет или может быть нарисован неправильно.
По коду могу пояснить вот такую вещь: можно сказать так: «Точка (x, y) движется по окружности, делая остановки. Вот эти места остановок запоминаются в массив. После прохождения всего маршрута цикл завершается». После завершения цикла все остановки поочередно соединяются линиями.
В формуле, где мы запоминаем координаты, нужно переводить меру из радианов в градусы. Для этого: (Угол * (ПИ/180)).
Ну и всегда нужно учитывать, что для наших глаз необхоимо делать смещение оси ординат из левого верхнего угла экрана куда-нибудь в область центра, если нужно красиво видеть нарисованное. Иногда ещё необходимо и масштабировать ось ординат, но здесь и без масштабирования её всё красиво смотрится.
Нельзя построить правильный двуугольник или одноугольник, или нуль-угольник, поэтому добавим проверку на случай, если надо будет вводить число вершин посредством клавиатуры. Ну и добавим стандартную проверку графического режима.



15 комментариев на «“graphics.h Рисование правильного многоугольника”»

  1. Дмитрий:

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

  2. 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++)Приблизительно так все выглядит

  3. Дмитрий:

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

  4. das:

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

  5. Дмитрий:

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

  6. das:

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

  7. Дмитрий:

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

  8. Андр:

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

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

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

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

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

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

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

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

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

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

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

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

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

https://www.litres.ru/key-horstmann/scala-dlya-neterpelivyh-2/?lfrom=15589587
Яндекс.Метрика