Справочник от Автор24
Поделись лекцией за скидку на Автор24

Графика в Qt. Рисование каркасных моделей

  • 👀 420 просмотров
  • 📌 404 загрузки
Выбери формат для чтения
Статья: Графика в Qt. Рисование каркасных моделей
Найди решение своей задачи среди 1 000 000 ответов
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Конспект лекции по дисциплине «Графика в Qt. Рисование каркасных моделей» pdf
Графика в 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 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 Verices; // массив вершин. Можно воспользоваться массивом Point3D Verices[]. В таком случае необходимо самостоятельно выделять и очищать память! vector> 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 &lines); Структура данных для матрицы поворота: #include using namespace std; #define MATRIX_SIZE 4 struct Matrix3D { // Можно воспользоваться массивом массивов float M[MATRIX_SIZE][MATRIX_SIZE]. В таком случае необходимо самостоятельно выделять и очищать память! array, MATRIX_SIZE> M; }; Функция инициализации матрицы поворота относительно оси X: Matrix3D Mx(float a) { array, 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 Профессиональное программирование.
«Графика в Qt. Рисование каркасных моделей» 👇
Готовые курсовые работы и рефераты
Купить от 250 ₽
Решение задач от ИИ за 2 минуты
Решить задачу
Найди решение своей задачи среди 1 000 000 ответов
Найти
Найди решение своей задачи среди 1 000 000 ответов
Крупнейшая русскоязычная библиотека студенческих решенных задач

Тебе могут подойти лекции

Смотреть все 588 лекций
Все самое важное и интересное в Telegram

Все сервисы Справочника в твоем телефоне! Просто напиши Боту, что ты ищешь и он быстро найдет нужную статью, лекцию или пособие для тебя!

Перейти в Telegram Bot