graphics.h Рисование дома, дерева, озера, Солнца

Компилятор, который я использую для написания кода, описываемого в этой публикации, является динозавром эпохи компьютеров. Сейчас этот компилятор практически не используется. В современных подключить graphics.h у вас не получится. Но коли так вышло, что начинал я познавать графику в Borland C++ 3.1, эта публикация существует.
Рисование с помощью WinApi (подойдёт для современных компиляторов из-под Windows):

Один из читателей моих публикаций попросил в комментариях рассмотреть graphics.h. В то время я не знал ни что это натолько устаревшая библиотека, ни чего-то вообще о программировании графики в С++. Хоть и был немного знаком c компьютерной графикой, поскольку до C++ успел немного порисовать на Turbo Pascal. Выполняя ту просьбу, я написал несколько статей, посвящённых программированию графики в неиспользуемом в наше время компиляторе. К тому же, когда я писал эту статью — этот сайт был блогом, поэтому стиль изложения блоггерский.
Чтобы нарисовать рисунок, нужно хорошо его представлять. Если кто-то не художник и рисованием не занимался, то в голове детали ему удержать будет трудно, поэтому правильно будет сделать набросок. Набросок можно сделать на бумаге, а можно в одной из графических программ, наподобие Paint. Я вот не художник вообще, но что-нибудь примитивное рисовать умею. Набросок я рисовал в Paint.net. Срисовывать с листа потом намного легче, чем рисовать сразу в программу.
Вот, что у меня получилось:

Пейзаж

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

После запуска получилась такая картинка:

Фон рисунка

Сейчас может быть не особо понятно, почему объявления оказалось достаточно для нарисования картинки. Дело в том, что объекты конструируются до начала работы функции main. Выполнилось то, что написано в конструкторе объекта.
После описания рисования фона нужно приступать к основным объектам картинки. Я решил начать с рисования дерева. Честно признаюсь, рисование дерева отняло у меня некоторое время. Подобное я делал впервые и поэтому подгонял тут точку за точкой.

  • moveto — перемещает перо на указанные координаты. Позиция пера – это начало рисования.
  • lineto — рисует линию из начала рисования на указанные координаты.
Всмотритесь в дерево на первом бесцветном рисунке. Оно у меня нарисовано линиями и овалами и кругами. Сперва я рисовал дерево без листвы. Чтобы мне было немного проще подгонять точку к точке, я сначала перемещал перо в приблизительное место нужной точки и рисовал линию оттуда на координаты [0,0]. (Тянул отрезок из активной точки в левый верхний угол экрана). Ни разу не попал сразу, поэтому приходилось подгонять вверх, вниз, вправо и влево. Когда точка попадала в нужное место ствола или ветки, я начинал подгонять те координаты, которые [0,0].
Если выражаться проще: сначала брался за первую точку отрезка и пытался поставить ее в нужное место, потом за вторую. Таким образом я смог получить на экране дерево без листвы очень похожее на дерево на моём наброске.
Следующий шаг — сделать лысое дерево не лысым: нарисовать ему листьев. Листья нарисовать оказалось проще, всё-таки гонять окружности и овалы по экрану — задача несложная.
Вот, что у меня получилось:

Мне трудно досконально описать метод рисования дерева на экране. Как я уже написал, я подгонял точку за точкой, но, надеюсь, несмотря на это, вы понимаете, как это сделано. Мне пришлось запускать программу достаточно много раз, чтобы все точки поставить в нужные места. Такой подход обусловлен получением первого опыта в написании программы, которая что-то рисует. Забегая немного вперед, поясню, что потом я пришёл к способу ставить окружность в качестве точки на выбираемый мной координаты и по ней определять подходящие позиции. Где-то дальше по теме я уже использовал его, а не вот этот вот чудовищный подбор.
После очередного запуска я получил картинку:

Рисование дома, дерева

Если сравнивать с моим изначально подготовленным рисунком, то заметно небольшое сходство.

Благодаря существованию объектно-ориентированного подхода к программированию и возможности относительного позиционирования мне не нужно мучиться с координатами других деревьев. Вы, наверняка, увидели, что в моем коде использованы обозначения координат (x,y) вместо обычных числовых значений. Эти координаты объявлены внутри класса и, по идее, недоступны из функции main. Конструктор принимает параметры в свои большие (X,Y), которые потом передаются в маленькие (x,y) метода класса, поэтому не прямой, но доступ к ним есть. При объявлении объекта дерево мы указываем два параметра для такой передачи. (У точки на плоскости две координаты).
Теперь деревья можно рисовать в разных местах экрана. Это будет нарисовано чуть позже.
Нарисованный на наброске дом состоит из нескольких элементов: окна, крыша, дверь. Каждый элемент необходимо нарисовать. Чтобы в последствии можно было проще работать с объектами Дом, следует использовать относительный способ рисования: это когда данные закладываются не напрямую числами, а переменными. Подробно всё расписывать долго, я думаю, что не смогу, но что смогу, попробую изложить.
Сначала я пробовал рисовать простые примитивы типа rectangle, контуры линиями с помощью line, но при заливке возникли проблемы, поэтому использованы bar3d, drawpoly.

  • Bar3d рисует прямоугольник
  • drawpoly рисует многоугольник.
Если всмотреться в дом на наброске, то можно увидеть такие многоугольники, как параллелограмм и треугольник. Чтобы мне было немного проще находить координаты, чем было тогда, когда я находил координаты с деревом, я решил выводить на экран сначала textxy(x,y,"TEXT"). По аналогии с нарисованным деревом нужно плясать от какой-то точки, поэтому я подгонял эти точки в приблизительные места и только потом рисовал многоугольники. Такой момент оставлен в комментариях кода. Подгонял я, разумеется, с многократным запуском программы и изменениями координат вывода текста. В таком подгоне заключается основная идея моего подхода.

После запуска программы стала видна такая картинка:

Рисование Дом, дерево, солнце

Несмотря на то, что используемый подход к рисованию (относительное позиционирование) труднее понять, чем простая подстановка координат цифрами (абсолютное позиционирование), он все-таки в нашем случае лучше. Ведь теперь можно создавать дом в любом месте экрана, как и дерево. Если нужен пример, то пожалуйста:
Изменена функция main, остальное все остается так, как написано, и получилось вот это:

Получили рисунок:

Рисование Дом, Дерево, Солнце, объекты

Вот такое вот нелегкое начало рисования приводит к достаточно простому созданию копий объектов, после чего каждый из объектов может быть отдельным рисунком. При всем при этом такие начинания могут стать первым шагом к пониманию анимации изображений.

13 комментариев на «“graphics.h Рисование дома, дерева, озера, Солнца”»

  1. Аноним:

    😀 😀 😀 😀 😀 😀 класс

  2. Аноним:

    😳 👿 😥 :mrgreen:

  3. Аноним:

    мудак

  4. Аноним:

    Блин…очень много пунктуационных ошибок в изложении.

  5. Аноним:

    😥 ➡ ➡ ➡ ➡ ➡ ➡ ➡ ➡ ➡ ➡

  6. двн:

    Я 5 получил я в.7

  7. АНОНИМ:

    ОБОССАТЬСЯ

  8. Айдар:

    Спасибо большое тебе за твой труды от души.

  9. Георгий:

    здравствуйте, подскажите пожалуйста аналог библиотеки <graphics.h> в Visual Studio 2010-2015

  10. игорь:

    у меня матюкается что нет такой директории graphics.h

    сижу в code::blockse 13.12

  11. Аноним:

    тут чет не правильно

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

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

Поиск

 
     

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

https://www.litres.ru/lubov-zalogova/razrabotka-paskal-kompilyatora/?lfrom=15589587
Яндекс.Метрика