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

Программирование графики является одним из вопросов начинающих программистов. Моя речь будет о программировании графики в DOS, средствами языка С++. Компилятор, который я использую, является динозавром эпохи компьютеров, но он не мешает изучать С++. Я знаю, что раньше учили, сейчас учат и еще сто лет будут учить программировать, начиная с Borland c++3.1 или Turbo C. На вопросы о графике в этих компиляторах часто слышно что-то типа: «Перейди на нормальный и рисуй». С другой стороны, существуют разные преподаватели и бывают разные требования к преподаванию. Если в одном месте к студенту проявят лояльность и позволят использовать любые средства разработки, то в другом месте могут жестко ограничить, поэтому я не жалею, что использую своего динозавра в качестве обучающей базы.

Требуется хорошо понимать
Передача параметров в функции в C++ для начинающих
С++ для начинающих Классы Первое знакомство
С++ для начинающих Конструктор Класса
С++ для начинающих Конструктор класса Передача параметров в базовый конструктор класса
C++ для начинающих private, public, protected

Своё знакомство с графикой я начал с геометрических примеров, в которых используются алгоритмы на базе знаний геометрии. Очень часто требуется нарисовать простой рисунок типа: дом, дерево, солнце. Часть программистов начинает понимать графику именно с такого рода примитивных рисунков. Меня кто-то тут в комментариях попросил рассмотреть graphics.h, поэтому я решил выполнить просьбу и начал периодически писать о создании графики в C++ под Dos.

Перед рисованием рисунка, нужно хотя бы представлять его в общих чертах. Можно нарисовать сразу, можно срисовать с другого места. Честно говоря, по-жизни я рисовать не умею, но в Paint примитив нарисовать смогу, поэтому, первым делом я нарисовал рисунок в PaintNet

=======
Пейзаж
=======

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

Тот, кто имеет познания рисования в Paint, тот знает, что сначала нужно рисовать фон. Здесь точно также. Чтобы фоновая картинка не затирала остальную, нужно создать фон. На моем рисунке фон — это небо, солнце, трава. Ничего не раскрашено, но обозначена линия горизонта, которая разделяет небо и землю.

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

Код С++ graphics.h Создание фона

После запуска получил такую картинку.
===========
Фон рисунка
===========

Кто-то может не поймет, почему я, только объявив картинку, смог ее нарисовать. В классе описан только один метод и метод этот — это конструктор. Конструктор выполняется раньше чем выполняется функция main, поэтому так и выходит.

После выполнения метода рисования фона, нужно приступать к основным объектам картинки (метод рисования фона в моем случае является конструктором класса). Я решил начать с рисования дерева. Честно признаюсь: «Рисование дерева отняло у меня некоторое время». Подобный рисунок я рисовал впервые и, поэтому, при рисовании дерева подгонял точку за точкой.

  • moveto — перемещает перо на указанные координаты. Позиция пера – это начало рисования.
  • lineto — рисует линию из начала рисования на указанные координаты.

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

Сам код рисования дерева на моем фоне получился таким

Код С++ graphics.h Дерево на фоне

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

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

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

Дом состоит из целого набора деталей (окна, двери, крыша). Каждую деталь нужно нарисовать. Чтобы получить чуть более чем простой рисунок, нужно рисовать относительно точек, а не просто по цифрам. Такой подход у меня тоже занял некоторое время и объяснить все, наверное, не получится, но основную идею я изложу.

Сначала я пробовал рисовать простые примитивы типа rectangle, контур линиями, но при заливке возникли проблемы, поэтому использованы bar3d, drawpoly.

  • Bar3d рисует прямоугольник
  • а drawpoly многоугольник.

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

Код С++ graphics.h Дом, дерево, солнце

После запуска получилась картинка.
Рисование Дом, дерево, солнце
Несмотря на то, что этот подход к рисованию труднее понять, чем простая подстановка координат цифрами, он все-таки лучше. Теперь можно создавать дом в любом месте экрана, как и дерево. Если нужен пример, то пожалуйста.

Изменяем функцию main, остальное все остается так, как написано, и получаем что-то типа

Код C++ graphics.h Дом, дерево, Солнце

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

Вот такое вот нелегкое начало рисования приводит к достаточно простому созданию копий объектов, каждый из объектов может быть отдельным рисунком.
При всем при этом, такие начинания являются первым шагом к пониманию анимации изображений.span style=»color: #800000;»

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

12 комментариев: graphics.h Рисование Дома, Дерева, Озера Солнца

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

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

Поиск

 
     

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

https://www.litres.ru/dhananya-gadre/zanimatelnye-proekty-na-baze-mikrokontrollerov-tinyavr-7012802/?lfrom=15589587
Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Солидной компании на постоянную работу требуется девушка приятной внешности со знанием Linux, программирование встраиваемых микроконтроллеров на C/C++/ASM, знание Linux - установка и настройка (сеть, графика, установка драйверов); C , Python, технологии ООП, GTK (желательно PyGTK) или Qt, SQL и XML - базовые знания; понимание многопоточности и синхронизации потоков.

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

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