МИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА) Кафедра САПР ОТЧЕТ по лабораторной работе №1 по дисциплине «Компьютерная графика» Тема: Исследование математических методов представления и преобразования графических объектов на плоскости и в пространстве Студенты гр. 9363 Штифанова М.А Васильева А.В. Преподаватель Матвеева И.В. Санкт-Петербург 2022 Цель работы Отображение плоского объекта относительно осей координат с изменением или без изменения масштаба изображения. Минимальный плоский объект – точка. Плоский объект – любая фигура или линия, умещающиеся в пределах двумерного пространства. Таким образом, соединяя точки можем получить различные объекты. Краткие теоретические сведения Для того чтобы отразить точку относительно оси Ox или Oу, используется следующая матрица 𝑎 (𝑥′, 𝑦′) = (𝑥, 𝑦) ( 𝑐 𝑏 ) 𝑑 где (x', y') — координаты отраженной точки, (x, y) — координаты изначальной точки. При, а = -1, d = 1, c = b = 0 матрица преобразования отражает −1 0 относительно оси Ох. (𝑥′, 𝑦′) = (𝑥, 𝑦) ( ) 0 1 При, а = 1, d = -1, c = b = 0 матрица преобразования отражает 1 0 относительно оси Oy. (𝑥′, 𝑦′) = (𝑥, 𝑦) ( ) 0 −1 Описание программы Работа выполнена на языке С# с использованием Windows Forms. Координаты точек записаны в листе, чтобы была возможность добавлять точки, а не задавать фиксированный размер. Была реализована функция «Draw_polygon», которая рисует объект по точкам. Если точка одна, отображает точку, если две – линию, если три и более – полигон. private void draw_polygon(List<float[]> dots, Graphics graph) { Point[] pT = new Point[dots.Count]; for (int i = 0; i < dots.Count; i++) { pT[i] = convert_coords((int)dots[i][0], (int)dots[i][1]); } if (dots.Count == 1) { graph.DrawRectangle(Pens.Black, pT[0].X, pT[0].Y, 1, 1); } if (dots.Count <= 2) { for (int i = 1; i < dots.Count; i++) { graph.DrawLine(Pens.Black, pT[i], pT[i - 1]); } } else { graph.FillPolygon(new SolidBrush(Color.Aquamarine), pT); graph.DrawPolygon(Pens.Black, pT); button2.Enabled = true; } } Функция «Paint_axis» рисует координатную ось по центру. Затем разметили ее на заднем фоне, для того чтобы при обновлении не перерисовывать ее. private Bitmap Paint_axis() // создание координатной оси { Bitmap coords = new Bitmap(pictureBox1.Width, pictureBox1.Height); Graphics coordsGrapgics = Graphics.FromImage(coords); coordsGrapgics.DrawLine(Pens.Black, pictureBox1.Width / 2, 0, pictureBox1.Width / 2, 1000); coordsGrapgics.DrawLine(Pens.Black, 0, pictureBox1.Height / 2, 1000, pictureBox1.Height / 2); for (int i = pictureBox1.Width / 2; i < pictureBox1.Width; i = i + singleSegment) { if (i / singleSegment % 10 == 0) coordsGrapgics.DrawLine(Pens.Black, i, pictureBox1.Height / 2 + 6, i, pictureBox1.Height / 2 - 6); else coordsGrapgics.DrawLine(Pens.Black, i, pictureBox1.Height / 2 + 3, i, pictureBox1.Height / 2 - 3); } ... return coords; } Функция «Convert_coords» конвертирует координаты для использования в PictureBox. private Point convert_coords(int X, int Y) { return new Point(X * singleSegment + pictureBox1.Width / 2, pictureBox1.Height / 2 - (Y * singleSegment)); } Функция «Reflection» отражает объект относительно оси Ох или оси Оу с изменением масштаба. private void reflection() { float[,] matrix = new float[,] { { 1, 0 }, { 0, 1 } }; float koef = (float)numericUpDown3.Value; if (checkBox1.Checked) matrix[1, 1] = -koef; if (checkBox2.Checked) matrix[0, 0] = -koef; dotsReflect = new List<float[]>(); for (int i = 0; i < dotsOrig.Count; i++) { dotsReflect.Add(new float[] { 0, 0 }); } for (int i = 0; i < dotsOrig.Count; i++) { for (int j = 0; j < dotsOrig[0].Length; j++) { for (int k = 0; k < 2; k++) dotsReflect[i][j] += dotsOrig[i][k] * matrix[k, j]; } } } Пример выполнения работы Начальный экран программы выглядит следующим образом Рис 1 начальный экран. Для создания объекта в программе необходимо задать координаты точки или нескольких точек (Рис 2 - отображение точки, Рис 3 отображение прямой, Рис 4 - добавление еще двух точек). Далее отметив ось относительно которой (или которых) нужно отразить и при желании задав масштаб, можно отразить объект (Рис 5 - отражение относительно Х, Рис 6 отражение относительно У, Рис 7 - отражение относительно Х и У). Рис 1 - начальный экран Рис 2 - отображение точки Рис 3 - отображение прямой Рис 4 - добавление еще двух точек Рис 5 - отражение относительно Х Рис 6 - отражение относительно У Рис 7 - отражение относительно Х и У Выводы 1) Была создана программа для отражения и масштабирования фигур относительно осей, в ходе реализации которой были закреплены знания, полученные при обучении. 2) С помощью определенной матрицы преобразования можно отражать объект относительно координатных осей и изменять его масштаб. 3) Координаты точек можно хранить в списке для удобства его расширения. Как работает программа: https://drive.google.com/file/d/15KS7Eqxgr4Pi4KVDqlHgCTiaZ5BBbg2/view?usp=sharing