Справочник от Автор24
Программирование

Конспект лекции
«Графика в Qt. Рисование каркасных моделей»

Справочник / Лекторий Справочник / Лекционные и методические материалы по программированию / Графика в Qt. Рисование каркасных моделей

Выбери формат для чтения

pdf

Конспект лекции по дисциплине «Графика в Qt. Рисование каркасных моделей», pdf

Файл загружается

Файл загружается

Благодарим за ожидание, осталось немного.

Конспект лекции по дисциплине «Графика в Qt. Рисование каркасных моделей». pdf

txt

Конспект лекции по дисциплине «Графика в Qt. Рисование каркасных моделей», текстовый формат

Графика в Qt. Рисование каркасных моделей Введение. Система координат Одной из распространенных задач компьютерной графики является изображение двумерных графиков в некоторой системе координат. Физические координаты имеют непосредственное отношение к физическому устройству вывода. В качестве единицы измерения длины в системе физических координат всегда используется пиксел. Если устройством вывода является экран монитора, физические координаты обычно называют экранными координатами. Логические координаты передаются функциям, выполняющим рисование фигур или вывод текста. Используемые единицы измерения зависят от режима отображения. При отображении подсистема вывода преобразует логические координаты в физические. Способ преобразования зависит от режима отображения и других атрибутов контекста отображения, таких как расположение начала системы координат для окна, расположение начала системы физических координат, масштаб осей для окна и масштаб осей физических координат. Система координат представлена на следующем рисунке. Рисунок иллюстрирует направление координатных осей. Начало этой системы координат располагается в левом верхнем углу экрана. Ось X направлена слева направо, ось Y - сверху вниз. В качестве единицы длины в данной системе координат используется пиксел. Рисование на форме В Qt возможно рисовать как на графической сцене QGraphicsScene, так и на виджете. Для этого используется класс QPainter. Рисование объектов на виджетах может производится в функции paintEvent(*event), которая вызывается при отрисовке виджета. Класс QPainter имеет большое количество методов для отрисовки http://www.doc.crossplatform.ru/qt/4.6.x/qpainter.html. QPainter может рисовать простые геометрические фигуры: точки, линии, прямоугольники, эллипсы, дуги, сегменты круга, замкнутые ломаные (многоугольники) и кривые Безье. Он так же может отображать карты пикселей (pixmap), рисунки и текст. Основные необходимые методы отрисовки. void drawLine ( int x1, int y1, int x2, int y2 ) - Рисование линии с координатами (x1, y1) – (x2, y2) void drawPoint ( int x, int y ) - Рисование точки с координатами (x, y) void drawRect ( int x, int y, int width, int height ) - Рисование прямоугольника с координатами левой верхней точки (x, y), длиной width, высотой height. void drawText ( int x, int y, const QString & text ) - Рисование текста с координатами левой верхней точки (x, y) и сообщение text. void setPen ( const QPen & pen ) - Установка карандаша рисования. Карандаш pen определяет, как будут рисоваться линии и окантовки, а также цвет текста. void setBrush ( const QBrush & brush ) - Установка кисти для рисования. Кисть используется для заполнения фигуры. Рисовать на виджете можно переопределив его метод paintEvent(QPaintEvent *). В дополнительных материалах прикрепл ццены примеры рисования на виджетах. Движение каркасных моделей: поворот, перенос, масштабирование и проецирование Каркасная модель представляет собой набор точек и матрицу связанности (для построения ребер между точек). Для выполнения поворота и масштабирования фигуры или каркасной модели необходима точка, относительно которой будут выполнятся эти действия (базовая точка). Удобно задать координаты вершин фигуры относительно этой точки. При рисовании выполнять смещение на базовую точку. Перенос фигуры сводится к смещению базовой точки. Все операции по преобразованию фигуры можно свести к умножению вектора на матрицу. система координат правая; -ось z направлена на наблюдателя, перпендикулярно плоскости экрана; -ось y находится в плоскости экрана и направлена вверх; -ось x находится в плоскости экрана и направлена вправо. Матрицы преобразования фигуры (т.н. аффинные преобразования) Матрицы поворота 1. Относительно оси X 2. Относительно оси Y 3. Относительно оси Z Матрица параллельного переноса Матрица однородного масштабирования где k – коэффициент масштабирования. Матрица плоскопараллельного проецирования (проецирование трёхмерной каркасной модели на экранную плоскость). Примечание Определение. Преобразование плоскости называется аффинным, если - оно взаимно однозначно; - образом любой прямой является прямая. Преобразование называется взаимно однозначным, если - разные точки переходят в разные; - в каждую точку переходит какая-то из точек. Структура данных запишется следующим образом #include <vector> using namespace std; struct Point3D { float X; float Y; float Z; Point3D() { } Point3D(float x, float y, float z) : X(x), Y(y), Z(z) { } }; struct Figure { Point3D Base; // базовая точка vector<Point3D> Verices; // массив вершин. Можно воспользоваться массивом Point3D Verices[]. В таком случае необходимо самостоятельно выделять и очищать память! vector<vector<int>> Edges; // матрица связанности // количество вершин int Count() { return Verices.size(); } }; Функция рисования фигуры void DrawFigure (QPainter &painter, QPen &pen, Figure &figure) { painter.setPen(pen); for (int i = 0; i < fig.Count() - 1; l++) { for (int j = i + 1; j < fig.Count(); j++) { if (figure.Edges[i][j]) { painter.drawLine( figure.Base.X + figure.Verices[i].X, figure.Base.Y + figure.Verices[i].Y, figure.Base.X + figure.Verices[j].X, figure.Base.Y + figure.Verices[j].Y); } } } } Примечание: для увеличения быстродействия возможно также предварительно подготовить массив линий и нарисовать за один раз. void QPainter::drawLines (const QVector<QLine> &lines); Структура данных для матрицы поворота: #include <array> using namespace std; #define MATRIX_SIZE 4 struct Matrix3D { // Можно воспользоваться массивом массивов float M[MATRIX_SIZE][MATRIX_SIZE]. В таком случае необходимо самостоятельно выделять и очищать память! array<array<float, MATRIX_SIZE>, MATRIX_SIZE> M; }; Функция инициализации матрицы поворота относительно оси X: Matrix3D Mx(float a) { array<array<float, MATRIX_SIZE>, MATRIX_SIZE> M = { { {1, 0, 0, 0}, {0, cosf(a), -sinf(a), 0}, {0, sinf(a), cosf(a), 0}, {0, 0, 0, 1} } }; Matrix3D2 tmp = { M }; return tmp; } Функция инициализации матриц поворота относительно остальных осей и матрицы масштабирования записываются аналогично. Функция умножения вектора на матрицу: Point3D Multiply(Point3D &p, Matrix3D &m) { Point3D point; point.X = p.X * m.M[0][0] + p.Y * m.M[0][1] + p.Z * m.M[0][2]; point.Y = p.X * m.M[1][0] + p.Y * m.M[1][1] + p.Z * m.M[1][2]; point.Z = p.X * m.M[2][0] + p.Y * m.M[2][1] + p.Z * m.M[2][2]; return point; } Операция поворота фигуры выполняется в виде отельной функции: void Rotate(Figure &figure, float a, float b, float c) { if (a != 0.0) { Matrix3D mxa = Mx(a); for (int i = 0; i < figure.Count(); i++) { figure.Verices[i] = Multiply(figure.Verices[i], mxa); } } if (b != 0.0) { Matrix3D myb = My(b); for (int i = 0; i < figure.Count(); i++) { figure.Verices[i] = Multiply(figure.Verices[i], myb); } } if (c != 0.0) { Matrix3D mzc = Mz(c); for (int i = 0; i < figure.Count(); i++) { figure.Verices[i] = Multiply(figure.Verices[i], mzc); } } } Здесь a, b, c – это углы поворота относительно осей X, Y, Z, соответственно. Дополнительные материалы https://doc.qt.io/qt-5/qpainter.html Класс QPainter (англ.) http://www.doc.crossplatform.ru/qt/4.6.x/qpainter.html Класс QPainter (рус.) https://www.opennet.ru/docs/RUS/qt3_prog/c4100.html Разработка графического интерфейса с помощью библиотеки Qt3 (рус.) Также книги 1. Бланшет, Саммерфилд - Qt4 Программирование GUI на С++. 2 изд. - 2008 2. Шлее Макс - Профессиональное программирование на C++. Qt (В подлиннике). 3. Марк Саммерфилд - Qt Профессиональное программирование.

Рекомендованные лекции

Смотреть все
Программирование

Математическая модель и ее основные элементы. Экзогенные и эндогенные переменные ,параметры. Виды зависимостей экономических переменных и их описание. Уравнения, тождества,неравенства и их системы

Лекция 2. Математическая модель и ее основные элементы. Экзогенные и эндогенные переменные, параметры. Виды зависимостей экономических переменных и их...

Программирование

Реализация алгоритмов

ОГЛАВЛЕНИЕ Оглавление 2 1. Лабораторная работа № 1 3 1.1.Постановка задачи . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2.Проектировани...

Программирование

Распознавание образов

Ðàñïîçíàâàíèå îáðàçîâ Âàðûãèíà Ì.Ï. ÈÌ ÑÔÓ, ÈÂÌ ÑÎ ÐÀÍ Ñîäåðæàíèå 1 Ïðåäìåò ðàñïîçíàâàíèÿ îáðàçîâ. Ëàáîðàòîðíàÿ ðàáîòà  1. 2 Äèñêðèìèíàíòíûé ïîäõîä. ...

Автор лекции

Варыгина М. П.

Авторы

Программирование

Компьютерное моделирование

КОМПЬЮТЕРНОЕ МОДЕЛИРОВАНИЕ Сибирский Федеральный Университет Содержание курса лекций Лекция 1. История развития компьютерного моделирования Лекция 2. ...

Программирование

Аналитические модели. Моделирование. СМО

1. Уровни детализации проекта в вычислительных системах. 1 2. Аналитические модели ЭВС в виде цепей Маркова. 2 3. Организация работы моделей GPSS. Фаз...

Программирование

SDN&NFV: Виртуализация сетевых функций (NFV)

SDN&NFV: Виртуализация сетевых функций (NFV) Доп. главы Компьютерных сетей и телекоммуникации к.ф.-м.н., м.н.с., Шалимов А.В. [email protected] ...

Автор лекции

Шалимов А. В.

Авторы

Программирование

SDN&NFV: SDN/OpenFlow контроллеры и приложения

SDN&NFV: SDN/OpenFlow контроллеры и приложения Доп. главы Компьютерных сетей и телекоммуникации к.ф.-м.н., м.н.с., Шалимов А.В. [email protected]

Автор лекции

Шалимов А. В.

Авторы

Программирование

Version control systems

Lecture 25. Part 1. Version control systems Programming BSc programme: Business Informatics Autumn 2019 Sergey Efremov, 2019 BIPROG: Lecture 25. Part ...

Автор лекции

Efremov S.

Авторы

Программирование

Программирование

Оглавление Перечень определений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Перечень теорем и лемм . . . . . . . . . . . . . . ....

Программирование

Системы контроля версий (VCS)

Системы контроля версий (VCS) Курс «Разработка ПО систем управления» Кафедра управления и информатики НИУ «МЭИ» Осень 2017 г. Проблема: управление код...

Смотреть все