Uploaded by Мария Штифанова

9363 Штифанова Васильева 1

advertisement
МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра САПР
ОТЧЕТ
по лабораторной работе №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
Download