Как нарисовать дом в visual studio

Обновлено: 02.07.2024

БлогNot. Visual Studio, простое рисование на графической канве формы и дисплея

Visual Studio, простое рисование на графической канве формы и дисплея

В блоге уже есть ряд заметок, показывающих работу с графической канвой формы в Visual C++ (раз, два). Цель этого примера - продемонстрировать, как одним и тем же кодом вывести программно созданный рисунок сначала в окно формы, а затем просто на дисплей вне окна. Сделать последнее позволяет метод GetDC из Windows API, получающий контекст графического устройства.

Итак, создадим пустой проект Windows Forms, я делал из сохранённого заранее шаблона в Studio 2015. Дальше процесс расписан по шагам.

1. В классе формы определён флажок, показывающий, нужно ли перерисовывать картинку:

2. Он инициализирован в методе Load формы (так как при загрузке нужно отрисовать в первый раз):

3. Всё рисование делается в методе Paint формы (исключений из этого правила мало):

4. Некоторые события формы должны будут инициализировать принудительную перерисовку, например, когда пользователь закончил изменение размеров окна (событие SizeChanged ):

5. Передав в наш Draw другой графический контекст (например, контекст графического экрана Windows), можно нарисовать ту же графику "в другом месте", например, поверх всех окон или под ними.

Покажем в качестве примера перехват графического контекста основного дисплея (при изменении размеров окна нашей формы картинка будет перерисовываться вне окна формы, начиная с левого верхнего угла экрана). Решение работает только для Windows.

5.1. Заинклудить в самом начале файла формы .h:

5.2. Подключить к проекту стандартную Windows-библиотеку user32 . Для этого перейти к меню Проект, Свойства проекта, открыть слева список Компоновщик, затем Ввод, и прописать в поле "Дополнительные зависимости" значение

5.3. Проверить, что в namespace проекта подключены

5.4. Метод Paint формы изменится, так как перед вызовом Draw он будет получать графический контекст дисплея:

Рисование по-прежнему зависит от положения окна приложения, но можно было вместо this->ClientSize попытаться использовать размеры экрана.


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

При этом задание координат для точек имеет привычный нам вид
(X, Y, Z)

1. Начало работы:
В данной программе мы используем плагин SharpGL, который помимо поддержки OpenGL включает в себя создание шаблона с основными функциями при создании нового проекта, такие как:

2. Преобразование картинки к трёхмерному виду:
Для этого используется функция openGLControl_Resized(). В ней происходят наши преобразования координат для создания объёмного изображения:

3. Установка цвета фоновой заливки:
Для этого используется функция openGLControl_OpenGLInitialized(), в которой помимо фоновой заливки можно задать ряд других значения по умолчанию:

4. Нарисуем крышу дома
Для начала нарисуем треугольник и посмотрим на него.



Получим следующую картинку (параметры для gl.LookAt(5, 4, 0, 0, 1, 0, 0, 1, 0)):


*Далее координаты фигур и изменение градуса поворота будут указываться в функции openGLControl_OpenGLDraw(), изменения gl.LookAt() производятся в функции openGLControl_Resized()*

Теперь дорисуем остальные стороны нашей "крыши" и посмотрим с другого ракурса. Получился следующий код:



gl.LookAt(5, 8, 0, 0, 1, 0, 0, 1, 0);
Получаем следующее изображение нашей крыши:

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


gl.LookAt(5, 6, 0, 0, 1, 0, 0, 1, 0);
Получаем следующее изображение:

gl.LookAt(5, 6, 4, 0, 1, 0, 0, 1, 0);

Как мы видим, на данный момент у нас всего одна стена, поэтому дорисуем остальные стены и добавим двери на самую светлую сторону. Полигоны всех четырёх стен имеют следующие координаты и цвета:

gl.LookAt(5, 6, 4, 0, 1, 0, 0, 1, 0);

gl.LookAt(5, 6, -7, 0, 1, 0, 0, 1, 0);

Нарисуем землю с помощью полигона:



gl.LookAt(5, 6, -7, 0, 1, 0, 0, 1, 0);

6. Вращение вокруг заданной оси
Перед функцией public SharpGLForm() инициализируем переменную rotation (угол поворота).


Затем добавим (в openGLControl_OpenGLDraw()) функцию поворота и укажем ось, вокруг которой нам нужно вращать картинку. После написания кода, укажем насколько градусов разворачивать изображение за 1 кадр.

Запускаем и получаем следующее изображение:

В итоге мы получили код, который целиком выглядит следующим образом:

Используйте шаблон план дома вVisio профессиональный иVisio, план 2, чтобы нарисовать новые планы дома или планы ремонта, поэкспериментировать с новыми схемами мебели и кухонной мебели или нарисовать планы, чтобы добавить новую комнату в свой дом.

Создание плана дома

На вкладке Файл выберите пункт Создать, а затем — элемент План дома.

Выберите метрическую или американскую систему мер и нажмите кнопку Создать.

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

Создайте базовую структуру внешних стен одним из следующих способов.

Использование фигур помещения

Из набора элементов Структурные элементы перетащите на страницу документа одну из фигур помещения.

Управляющий маркер

Изучая фигуру помещения, перетаскиванием химок и выделения на отдельных стенах.

Использование фигур стен

Из набора элементов Структурные элементы перетащите на страницу документа фигуры наружных стен.

Измените размеры стен, перетащив конечную точку ( или ).

Чтобы соединить стены, перетащите конечную точку ( или ) одной стены на другую стену.

Когда стены приклеены, их конечные точки становятся красными. Пересечения между стенами удаляются автоматически.

Примечание: Для правильного соединения стен в диалоговом окне Привязать и приклеить установите флажок Приклеивание к контуру фигуры.

Создайте внутренние стены.

Перетащите на страницу документа фигуры стен и расположите их внутри внешней структуры.

Измените размеры стен, перетащив конечную точку ( или ).

Чтобы соединить стены, перетащите конечную точку ( или ) одной стены на другую стену.

Когда стены приклеены, их конечные точки становятся красными. Пересечения между стенами удаляются автоматически.

Примечание: Для правильного соединения стен в диалоговом окне Привязать и приклеить установите флажок Приклеивание к контуру фигуры.

Добавьте другие структурные элементы.

Из набора элементов Структурные элементы перетащите на страницу документа структурные фигуры, например, колонны.

Из набора элементов Основные компоненты здания перетащите на страницу документа фигуры строительных элементов, таких как лестница.

Добавьте двери и окна.

Из набора элементов Структурные элементы перетащите фигуры дверей и окон на стены.

Двери и окна будут автоматически повернуты для выравнивания по стене и приклеены к ней. Они также будут иметь толщину стены и переместятся со стенами при изменении их положения.

Собрав каркас здания и структуру стен, вы можете добавить символы электрооборудования и размерные линии.

Добавление символов электрооборудования

Из набора элементов Электрические и телекоммуникационные соединения перетащите на фигуры стен настенные переключатели, розетки и другие приборы.

Отпустите кнопку мыши, появляется красный квадрат, указывающий на то, что символ приклеен к стене. Настенные приборы будут автоматически повернуты для выравнивания по стене и закреплены на ней.

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

Добавление на стены размерных линий

Щелкните правой кнопкой мыши фигуру стены, а затем в контекстном меню выберите команду Добавить размер.

Управляющий маркер

Измените положение размерных линий и размерного текста, перетащив управляющий маркер .

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

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

Вставка плана дома САПР

На вкладке Файл выберите пункт Создать, а затем — элемент План дома.

Выберите метрическую или американскую систему мер и нажмите кнопку Создать.

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

На вкладке Вставка нажмите кнопку Чертеж САПР.

Выберите файл чертежа и нажмите кнопку Открыть.

Для принятия размера и расположения чертежа САПР нажмите кнопку ОК.

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

Копирование существующего плана дома Visio в новый документ

На вкладке Файл выберите пункт Создать, а затем — элемент План дома.

Выберите метрическую или американскую систему мер и нажмите кнопку Создать.

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

Откройте существующий документ Visio.

На вкладке Конструктор выберите группу Параметры страницы, а затем откройте вкладку Масштаб документа. Запомните масштаб существующего чертежа и установите такой же в новом документе.

В существующем документе выберите фигуры, которые хотите использовать в новом документе, и на вкладке Главная щелкните команду Копировать.

Перейдите в новый документ и на вкладке Главная выберите команду Вставить.

Совет: Вы можете заблокировать существующие слои документа, чтобы случайно не изменить их при создании нового плана.

Создание плана дома

На вкладке Файл выберите пункт Создать, а затем в категориях шаблонов выберите Карты и планы этажей.

Щелкните План дома, выберите метрическую или американскую систему мер и нажмите кнопку Создать.

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

Создайте базовую структуру внешних стен одним из следующих способов.

Использование фигур помещения

Из набора элементов Структурные элементы перетащите на страницу документа одну из фигур помещения.

Управляющий маркер

Изучая фигуру помещения, перетаскиванием химок и выделения на отдельных стенах.

Использование фигур стен

Из набора элементов Структурные элементы перетащите на страницу документа фигуры наружных стен.

Измените размеры стен, перетащив конечную точку ( или ).

Чтобы соединить стены, перетащите конечную точку ( или ) одной стены на другую стену.

Когда стены приклеены, их конечные точки становятся красными. Пересечения между стенами удаляются автоматически.

Примечание: Для правильного соединения стен в диалоговом окне Привязать и приклеить установите флажок Приклеивание к контуру фигуры.

Создайте внутренние стены.

Перетащите на страницу документа фигуры стен и расположите их внутри внешней структуры.

Измените размеры стен, перетащив конечную точку ( или ).

Чтобы соединить стены, перетащите конечную точку ( или ) одной стены на другую стену.

Когда стены приклеены, их конечные точки становятся красными. Пересечения между стенами удаляются автоматически.

Примечание: Для правильного соединения стен в диалоговом окне Привязать и приклеить установите флажок Приклеивание к контуру фигуры.

Добавьте другие структурные элементы.

Из набора элементов Структурные элементы перетащите на страницу документа структурные фигуры, например, колонны.

Из набора элементов Основные компоненты здания перетащите на страницу документа фигуры строительных элементов, таких как лестница.

Добавьте двери и окна.

Из набора элементов Структурные элементы перетащите фигуры дверей и окон на стены.

Двери и окна будут автоматически повернуты для выравнивания по стене и приклеены к ней. Они также будут иметь толщину стены и переместятся со стенами при изменении их положения.

Собрав каркас здания и структуру стен, вы можете добавить символы электрооборудования и размерные линии.

Добавление символов электрооборудования

Из набора элементов Электрические и телекоммуникационные соединения перетащите на фигуры стен настенные переключатели, розетки и другие приборы.

Отпустите кнопку мыши, появится красный квадрат, указывающий на то, что символ приклеен к стене. Настенные приборы будут автоматически повернуты для выравнивания по стене и закреплены на ней.

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

Добавление на стены размерных линий

Щелкните правой кнопкой мыши фигуру стены, а затем в контекстном меню выберите команду Добавить размер.

Управляющий маркер

Измените положение размерных линий и размерного текста, перетащив управляющий маркер .

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

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

Вставка плана дома САПР

На вкладке Файл выберите пункт Создать, а затем в категориях шаблонов выберите Карты и планы этажей.

Щелкните План дома, выберите метрическую или американскую систему мер и нажмите кнопку Создать.

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

На вкладке Вставка нажмите кнопку Чертеж САПР.

Выберите файл чертежа и нажмите кнопку Открыть.

Для принятия размера и расположения чертежа САПР нажмите кнопку ОК.

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

Копирование существующего плана дома Visio в новый документ

На вкладке Файл выберите пункт Создать, а затем в категориях шаблонов выберите Карты и планы этажей.

Щелкните План дома, выберите метрическую или американскую систему мер и нажмите кнопку Создать.

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

Откройте существующий документ Visio.

На вкладке Конструктор выберите группу Параметры страницы, а затем откройте вкладку Масштаб документа. Запомните масштаб существующего чертежа и установите такой же в новом документе.

В существующем документе выберите фигуры, которые хотите использовать в новом документе, и на вкладке Главная щелкните команду Копировать.

Перейдите в новый документ и на вкладке Главная выберите команду Вставить.

Совет: Вы можете заблокировать существующие слои документа, чтобы случайно не изменить их при создании нового плана.

Важно: Office 2007 больше не поддерживается. Перейдите на Microsoft 365, чтобы работать удаленно с любого устройства и продолжать получать поддержку.

Создание плана дома

В меню Файл выберите пункты Создать, Карты и планы этажей и План дома.

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

Создайте базовую структуру внешних стен одним из следующих способов.

Использование фигур помещения

Из набора элементов Структурные элементы перетащите на страницу документа одну из фигур помещения.

Управляющий маркер

Изучая фигуру помещения, перетаскиванием химок и выделения на отдельных стенах.

Использование фигур стен

Из набора элементов Структурные элементы перетащите на страницу документа фигуры наружных стен.

Измените размеры стен, перетащив конечную точку ( или ).

Перетащите конечную точку ( или ) одной стены на другую стену.

Когда стены приклеены, их конечные точки становятся красными. Пересечения между стенами удаляются автоматически.

Примечание: Для правильного соединения стен в диалоговом окне Привязать и приклеить установите флажок Приклеивание к контуру фигуры.

Создайте внутренние стены.

Перетащите на страницу документа фигуры стен и расположите их внутри внешней структуры.

Измените размеры стен, перетащив конечную точку ( или ).

Перетащите конечную точку ( или ) одной стены на другую стену.

Когда стены приклеены, их конечные точки становятся красными. Пересечения между стенами удаляются автоматически.

Примечание: Для правильного соединения стен в диалоговом окне Привязать и приклеить установите флажок Приклеивание к контуру фигуры.

Добавьте другие структурные элементы.

Из набора элементов Структурные элементы перетащите на страницу документа структурные фигуры, например, колонны.

Из набора элементов Основные компоненты здания перетащите на страницу документа фигуры строительных элементов, таких как лестница.

Добавьте двери и окна.

Из набора элементов Структурные элементы перетащите фигуры дверей и окон на стены.

Двери и окна будут автоматически повернуты для выравнивания по стене и приклеены к ней. Они также будут иметь толщину стены и переместятся со стенами при изменении их положения.

Собрав каркас здания и структуру стен, вы можете добавить символы электрооборудования и размерные линии.

Добавление символов электрооборудования

Из набора элементов Электрические и телекоммуникационные соединения перетащите на фигуры стен настенные переключатели, розетки и другие приборы.

Отпустите кнопку мыши, появится красный квадрат, указывающий на то, что символ приклеен к стене. Настенные приборы будут автоматически повернуты для выравнивания по стене и закреплены на ней.

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

Добавление на стены размерных линий

Щелкните правой кнопкой мыши фигуру стены, а затем в контекстном меню выберите команду Добавить размер.

Управляющий маркер

Измените положение размерных линий и размерного текста, перетащив управляющий маркер .

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

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

Вставка плана дома САПР

В меню Файл выберите пункты Создать, Карты и планы этажей и План дома.

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

В меню Вставка щелкните Чертеж САПР.

В качестве типа файла выберите Чертеж AutoCAD (*.dwg; *.dxf). Выберите файл чертежа и нажмите кнопку Открыть.

Для принятия размера и расположения чертежа САПР нажмите кнопку ОК.

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

Копирование существующего плана дома Visio в новый документ

В меню Файл выберите пункты Создать, Карты и планы этажей и План дома.

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

Откройте существующий документ Visio.

В меню Файл выберите элемент Параметры страницы и откройте вкладку Масштаб. Запомните масштаб существующего чертежа и установите такой же в новом документе.

В существующем документе выберите фигуры, которые хотите использовать в новом документе, и в меню Правка выберите команду Копировать.

Перейдите в новый документ и в меню Правка выберите команду Вставить.

Совет: Вы можете заблокировать существующие слои документа, чтобы случайно не изменить их при создании нового плана.

При запуске программы должно появиться окно, залитое синим цветом.


Проект содержит файл main.cpp, ознакомьтесь с программным кодом.

WinAPI приложение является в своей основе процедурным приложением и содержит два основных модуля – функции WinMain и WndProc.

Функция WinMain составляет основу любого WinAPI приложения. Она служит как бы точкой входа в приложение и отвечает за следующее:

  • начальную инициализацию приложения;
  • создание и регистрацию объекта класса окна приложения;
  • создание и инициализацию цикла обработки событий.

Обработанное в бесконечном цикле событие переправляется (опосредовано через Windows) оконной функции WndProc. События в ней идентифицируются именем константы (WM_PAINT, WM_DESTROY и др.). Рисование осуществляется при помощи объектов типа HDC (дескриптор контекста устройства).

Нарисуем треугольник, задав координаты его вершин в оконной (физической) системе координат. Начало этой системы координат располагается в левом верхнем углу экрана. Ось X направлена слева направо, ось Y – сверху вниз. В качестве единицы длины в этой системе координат используется пиксель.

Для этого создадим заголовочный файл draw.h:

Еще создадим файл draw.cpp:

В файле main.cpp подключим draw.h и закомментируем <windows.h>

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

Рисуем мы на контексте-двойнике, а уже потом перекидываем изображение на основной контекст.

Оконная СК неудобна для пользователя из-за непривычного расположения осей (ось y направлена вниз), задания координат в пикселях и др. Устраним эти недостатки, используя логическую СК, в которой:

  • центр координат перенесен из левого верхнего угла в центр экрана;
  • направление оси Y меняется на противоположное;
  • координаты (от -1 до +1) соотнесены с шириной и высотой окна;
  • введен отступ от края окна (margin).

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

Ниже приводится новый код модуля draw.cpp:

В draw.h добавляется объявление новой функции:

В модуль main.cpp добавляем обработчик события WM_SIZE и WM_ERASEBKGND:

Теперь, при изменении размеров окна наш треугольник подстраивается под новые размеры. При изменении размеров окна происходит перерисовка изображения, поскольку событие WM_SIZE автоматически вызывает событие WM_PAINT.

Контрольные вопросы

  1. Чем обусловлен переход от оконной СК к логической?
  2. Какие задачи решают функции Tx(0.0), Ty(0.5)?
  3. Какие задачи решает функция SetWindowSize?

Алгоритмическая часть

Мы нарисовали треугольник в логической системе координат. Теперь обеспечим возможность поворота треугольника при каждом нажатии клавиш ← или →.

Для пересчета положения каждой вершины треугольника используем преобразование координат при повороте. Рассмотрим произвольный вектор r, задающий некоторую точку в системе координат ху:

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

Выделим из этих уравнений 2 пары зависимостей – для пересчета координат точек в новой СК (1.1) и для обновления значений косинуса и синуса угла (1.2):


В программе поворот реализуется пошагово. На каждом шаге в уравнение 1.1 вместо sin φ и cos φ подставляются sin (α+ φ) и cos (α+ φ), полученные из системы уравнений 1.2. При этом на следующем шаге в уравнении 1.2 вместо cos α и sin α в правую часть уравнения подставляются sin (α+ φ) и cos (α+ φ), которые были получены на предыдущем шаге.

В матричном представлении выражения (1.1) могут быть записаны в одном из следующих видов:


Программная реализация

В программе модифицированы все модули (main.cpp, draw.h, draw.cpp) и добавлены новые (geometry.h, matrix.h, matrix.cpp). В файле main.cpp добавляются обработчики WM_CREATE и WM_KEYPRESSED, клавиши ← и → идентифицируются в программе константами VK_LEFT и VK_RIGHT, начальный поворот плоскости инициализируется вызовом функции InitRotation, текущий поворот – функцией AddRotation. Перерисовка изображения (вызов события WM_PAINT) обеспечивается функцией InvalidateRect.

В файлы draw.h, draw.cpp и main.cpp вносим изменения, которые обеспечивают рисование треугольника в зависимости от текущего значения угла. В определение функций InitRotation и AddRotation входит вызов функции SetRotationMatrix, которая осуществляет инициализацию массива из 4-х тригонометрических характеристик угла. Переменная массива объявляется типом Matrix. Обновление массива реализует функция MultiplyMatrices. В функции Draw каждая вершина треугольника объявляется типом _Point. При каждом запуске функции Draw вершины инициализируются начальными координатами точек, затем функция ApplyMatrixtoPoint обеспечивает пересчет координат в соответствии с текущими значениями массива тригонометрических характеристик угла. Поворот точек треугольника реализуется в логической системе координат, затем осуществляется преобразование в оконные координаты и рисование сторон треугольника.

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

Обратите внимание, что входными параметрами ряда функций есть не переменные, а ссылки на переменные, что обеспечивает возможность при вызове этих функций обновлять входные параметры.

Контрольные задания:

  1. Согласно системы уравнений (1.2) sin и cos суммы 2-х углов, определяются по двум аргументам – sin и cos этих углов. В функции MultiplyMatrices(Matrix &dest, Matrix &left, Matrix &right), которая реализует в программе систему уравнений (1.2), используются 3 параметра (один параметр лишний). Модифицируйте функцию MultiplyMatrices, чтобы она принимала 2 параметра. Упрощенный аналог решения этого задания: Fun (&A, B)
  2. Внесите изменения в программу, которые обеспечат поворот треугольника на угол (PI/10) при нажатии на левую кнопку мышки (событие WM_LBUTTONDOWN) и поворот на угол (-PI/10) при нажатии на правую кнопку (событие WM_RBUTTONDOWN).

Мы уже обеспечили возможность поворота треугольника при каждом нажатии клавиш ← или →. Теперь поставим задачу обеспечения непрерывного вращения треугольника. Для реализации задачи необходимо обеспечить изменение угла поворота треугольника с последующим обновлением изображения. Причем, это должно выполняться в цикле.

Рассмотрим и оценим два способа циклического обновления изображения:

В первом случае в бесконечный цикл помещаются 2 функции:

Создание таймера необходимо предусматривать до его использования, например – в событии WM_CREATE. Кроме этого необходимо в заголовке файла определить идентификатор таймера:

Уничтожение таймера предусматривается, когда необходимо остановить анимацию:

Контрольные вопросы и задания

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

Header Files

action.h
engine.h
geometry.h
matrix.h
vec.h
viewport.h

Source Files

main.cpp
action.cpp
engine.cpp
matrix.cpp
viewport.cpp


Проект создан в версии Visual Studio 17. Для поздних версий (19 и выше), возможно, понадобиться пересобрать решение (кнопки меню Build>Rebuild Solution).

В файлах описаны классы, в которых сгруппированы функции и переменные для комплексного решения задачи аффинных преобразований на плоскости.

Класс Engine объединяет функцию формирования изображения (Draw) и объекты классов Action и Viewport, обеспечивающие действия по перестройке изображения, вызванной событиями нажатия на кнопки, перемещения мышки и изменения размеров окна.

Класс Action объединяет действия и данные, связанные с аффинными преобразованиями. Функция Rotate (Translate) устанавливает преобразования вращения (перемещения), опираясь на текущее и предыдущее положения мыши. Функция InitAction запоминает координаты курсора в объекте класса vec. Эти функции вызываются при событиях нажатия кнопки мышки и перемещения курсора. Функция Transform устанавливает преобразования через инициализацию коэффициентов матрицы

Класс Viewport объединяет действия и данные, связанные с изменением размеров окна, Кроме этого, в класс включена функция T, которая выполняет преобразование точек фигуры из экранных координат экрана, в логические координаты, а также, функция T_inv , которая преобразует координаты курсора из экранных координат в логические. Функция T_inv отсутствовала в приложении, рассмотренном ранее, поскольку в нем реализовывалось лишь преобразование вращения, а значение угла поворота не зависело от СК. В этом приложении с помощью курсора задается и преобразование перемещения, а оно зависит от используемой СК.

В класс Matrix была добавлена функция SetTranslationMatrix, в которой непосредственно инициализируются коэффициенты матрицы преобразований.
В классе Vec переопределяются операции с векторами. Эти операции используются в программе для определения преобразования перемещения, опираясь на текущее и предыдущее положения курсора при перемещении мыши.

Задание 1. Определите коэффициенты матрицы элементарных аффинных преобразований в соответствии с вариантом задания

В каждый вариант задания включены по 3 преобразования


Пример оформления задания показан ниже на рисунке

Выполнить тестовые запуски приложения для проверки соответствия матриц заданным преобразованиям

Коэффициенты матрицы преобразования инициализируются в функции Matrix::SetTranslationMatrix1, которая определена в файле matrix.cpp. Преобразование осуществляется при нажатии клавиши T.

Задание 2. Определить произведение матриц AB, (AB)C и C(AB) и протестировать композицию элементарных преобразований запуском приложения. Преобразование осуществлять нажатием клавиши T.

Задание 3. Определить последовательность элементарных аффинных преобразований (преобразований не более 3-х), которые от начального положения треугольника приведут к заданному результату. Пример:


Для тестирования добавьте в программу дополнительные реакции на нажатие клавиш 1, 2 и 3, которые обеспечивают соответствующее элементарное преобразование:

Объявления и определения функций action->Transform вместе с входящими функциями описываются по аналогии с описанием действий при нажатии на клавишу “T”.

Задание 4. Добавьте в приложение программный код, обеспечивающий возможность переключения преобразований из глобальной СК в локальную СК. Для тестирования приложения переместите треугольник и поверните его при помощи мышки на угол 135 градусов. Если включена глобальная СК, вращение будет происходить относительно центра окна, если локальная СК – относительно вершины прямого угла.

В соответствии с алгоритмом для выполнения этого задания необходимо поменять местами текущую матрицу и матрицу, переданную в качестве параметра для функции MultiplyMatrices(Matrix &right).

Читайте также: