Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Отчер по ЛР 1 МО-

.docx
Скачиваний:
1
Добавлен:
22.08.2023
Размер:
850.26 Кб
Скачать

УФИМСКИЙ ГОСУДАРСТВЕННЫЙ АВИАЦИОННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Кафедра вычислительной математики и кибернетики

Лабораторная работа № 1

«Программирование двухмерной графики»

Выполнил:

студент группы МО-

Проверил:

Котельников В.А

Уфа, 2021

Оглавление

Реализовать задания: 3

- повернуть кривую Безье 3

- напишите программу, масштабирующую фотографию 3

Теоретические основы: 3

Векторная графика 3

Ход работы: 4

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

Листинг программ 12

Цель работы: изучить основы программирования двухмерной графики.

Реализовать задания:

- повернуть кривую Безье

- напишите программу, масштабирующую фотографию

Теоретические основы:

Двухмерная (2D — от англ. two dimensions — «два измерения») компьютерная графика классифицируется по типу представления графической информации, и следующими из него алгоритмами обработки изображений. Обычно компьютерную графику разделяют на векторную и растровую, хотя обособляют ещё и фрактальный тип представления изображений.

Векторная графика

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

Растровая графика

Растровая графика всегда оперирует двумерным массивом (матрицей) пикселей. Каждому пикселю сопоставляется значение яркости, цвета, прозрачности — или комбинация этих значений. Растровый образ имеет некоторое число строк и столбцов. Без особых потерь растровые изображения можно только лишь уменьшать, хотя некоторые детали изображения тогда исчезнут навсегда, что иначе в векторном представлении. Увеличение же растровых изображений оборачивается «красивым» видом на увеличенные квадраты того или иного цвета, которые раньше были пикселями. В растровом виде представимо любое изображение, однако этот способ хранения имеет свои недостатки: больший объём памяти, необходимый для работы с изображениями, потери при редактировании.

Ход работы:

Реализация примеров:

Рисунок 1. Изображение отрезка на форме

Рисунок 2. Изображение эллипса

Рисунок 3.Отображение кривой безье

Рисунок 4. Рисование последовательности кривых Безье

Рисунок 5. Заливка сегмента эллипса

Рисунок 6. Построение диаграммы

Рисунок 7. Заливка полигона штриховой кистью

Рисунок 8. Заливка пути, состоящего из двух полигонов линейным градиентом

Рисунок 9. Заливка окружности градиентной заливкой

Рисунок 10. Градиент, основанный на массиве точек

Рисунок 11. Настройка градиента вдоль пути

Рисунок 12. Интерполяция цвета

Рисунок 13. Задание центральной точки градиентной кисти

Рисунок 14. Заливка области, состоящей из эллипса и прямоугольника.

Рисунок 15. Вычитание прямоугольника из пути

Рисунок 16. Поворот кривой безье

Рисунок 17. Масштабирование фотографии

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

Листинг программ

public Form1()

{

InitializeComponent();

}

private void mainPB_Paint(object sender, PaintEventArgs e)

{

int num = listBox1.SelectedIndex;

switch (num)

{

case 0:

Point Point1 = new Point(100, 100);

Point Point2 = new Point(500, 200);

Pen MyPen = new Pen(Color.Red, 5);

e.Graphics.DrawLine(MyPen, Point1, Point2);

break;

case 1:

Rectangle MyBox = new Rectangle(5, 10, 150, 200);

Pen MPen = new Pen(Color.Blue, 2);

e.Graphics.DrawEllipse(MPen, MyBox);

break;

case 2:

Point s1 = new Point(10, 100); // Начальная точка

Point e1 = new Point(100, 10); // Первая контрольная точка

Point e2 = new Point(150, 150); // Вторая контрольная точка

Point s2 = new Point(200, 100);

Pen Mypen = new Pen(Color.Black, 3);

e.Graphics.DrawBezier(Mypen, s1, e1, e2, s2);

break;

case 3:

Point[] MyPoints = new[] { new Point(10, 100), new Point(75, 10), new Point(80, 50), new Point(100, 150), new Point(125, 80), new Point(175, 200), new Point(200, 80) };

Pen M = new Pen(Color.Red, 3);

e.Graphics.DrawBeziers(M, MyPoints);

break;

case 4:

SolidBrush blueBrush = new SolidBrush(Color.Blue);

// указываем расположение и размеры эллипса

float x = 0.0F;

float y = 0.0F;

float width = 150.0F;

float height = 150.0F;

// Указываем начальный и конечный углы

float startAngle = 0.0F;

float endAngle = 120.0F;

// Заливаем сегмент

e.Graphics.FillPie(blueBrush, x, y, width, height, startAngle, endAngle);

break;

case 5:

SolidBrush brush = new SolidBrush(Color.Honeydew);

float[] Angles = new float[] { 0, 130, 205, 290, 360 };

Color[] Colors = new[] { Color.LightGoldenrodYellow, Color.PaleTurquoise, Color.RoyalBlue, Color.Purple };

Rectangle rect = new Rectangle(10, 50, 250, 150);

int angle;

for (angle = 1; angle <= Angles.Length - 1; angle++)

{

brush.Color = Colors[angle - 1];

e.Graphics.FillPie(brush, rect, Angles[angle - 1], Angles[angle] - Angles[angle - 1]);

}

e.Graphics.DrawEllipse(Pens.Black, rect);

break;

case 6:

HatchBrush hBrush = new HatchBrush(HatchStyle.Cross, Color.DarkGoldenrod, Color.Crimson);

// Создаем точки, определяющие полигон

PointF point1 = new PointF(0.0F, 0.0F);

PointF point2 = new PointF(100.0F, 25.0F);

PointF point3 = new PointF(200.0F, 5.0F);

PointF point4 = new PointF(250.0F, 50.0F);

PointF point5 = new PointF(300.0F, 100.0F);

PointF point6 = new PointF(350.0F, 200.0F);

PointF point7 = new PointF(200.0F, 200.0F);/* TODO ERROR: Skipped SkippedTokensTrivia *//* TODO ERROR: Skipped SkippedTokensTrivia */

PointF[] curvePoints = new[] { point1, point2, point3, point4, point5, point6, point7 };

// Определяем режим заливки

FillMode newFillMode = FillMode.Winding;

// Заливаем полигон

e.Graphics.FillPolygon(hBrush, curvePoints, newFillMode);

break;

case 7:

LinearGradientBrush linGrBrush = new LinearGradientBrush(new Point(0, 10), new Point(200, 10), Color.DarkOliveGreen, Color.DarkOrchid);

PointF[] FirstCurvePoints = new[] { new PointF(100.0F, 100.0F), new PointF(150.0F, 200.0F), new PointF(150.0F, 210.0F), new PointF(110.0F, 230.0F) };

PointF[] SecondCurvePoints = new[] { new PointF(300.0F, 100.0F), new PointF(350.0F, 200.0F), new PointF(200.0F, 200.0F), new PointF(130.0F, 230.0F) };

// Объявляем путь

GraphicsPath graphPath = new GraphicsPath();

// Добавляем к пути первый полигон

graphPath.AddPolygon(FirstCurvePoints);

// Добавляем к пути второй полигон

graphPath.AddPolygon(SecondCurvePoints);

// Закрашиваем путь градиентной заливкой

e.Graphics.FillPath(linGrBrush, graphPath);

break;

case 8:

Rectangle MyRectangle = new Rectangle(0, 0, 200, 200);

Pen Pen = new Pen(Color.Red, 2);

GraphicsPath path = new GraphicsPath();

path.AddEllipse(MyRectangle);

PathGradientBrush pthGrBrush = new PathGradientBrush(path);

// Центр пути будет красного цвета

pthGrBrush.CenterColor = Color.FromArgb(255, 255, 0, 0);

e.Graphics.DrawEllipse(Pen, MyRectangle);

e.Graphics.FillPath(pthGrBrush, path);

break;

case 9:

// Строим градиент, основанный на массиве точке

PointF[] myPoints = new[] { new PointF(30, 0), new PointF(60, 0), new PointF(90, 30), new PointF(90, 60), new PointF(60, 90), new PointF(30, 90), new PointF(0, 60), new PointF(0, 30) };

PathGradientBrush myBrush = new PathGradientBrush(myPoints);

Color[] colors = new[] { Color.FromArgb(255, 255, 0, 0), Color.FromArgb(255, 0, 255, 0), Color.FromArgb(255, 0, 0, 255), Color.FromArgb(255, 0, 255, 0), Color.FromArgb(255, 255, 0, 0), Color.FromArgb(255, 0, 255, 0), Color.FromArgb(255, 0, 0, 255), Color.FromArgb(255, 255, 0, 0) };

myBrush.SurroundColors = colors;

// Центр будет белым

myBrush.CenterColor = Color.White;

// Используем градиентную кисть для заливки прямоугольника

e.Graphics.FillRectangle(myBrush, new Rectangle(0, 0, 200, 200));

break;

case 10:

// Создаем путь содержащий отдельный прямоугольник

GraphicsPath MyPath = new GraphicsPath();

MyPath.AddRectangle(new Rectangle(0, 0, 200, 100));

// Создаем градиентную кисть, основанную на пути

//прямоугольника();

PathGradientBrush Brush = new PathGradientBrush(MyPath);

// Цвет за пределами границы будет красным

// Изменяем имя переменной для цвета

Color[] redColor = new[] { Color.Red };

Brush.SurroundColors = redColor;

// Цвет центра будет морской волны

Brush.CenterColor = Color.Aqua;

// Используем градиентную ксить для заливки

//прямоугольника();

e.Graphics.FillPath(Brush, MyPath);

// Устанавливаем масштаб фокуса для градиентной кисти

Brush.FocusScales = new PointF(0.2F, 0.5F);

// Используем градиентную кисть для заливки

// прямоугольника(снова);

// Показываем этот залитый прямоугольник справа от

//первого(залитого);

e.Graphics.TranslateTransform(0.0F, 150.0F);

e.Graphics.FillPath(Brush, MyPath);

break;

case 11:

// Вершины внешнего квадрата

Point[] Points = new[] { new Point(0, 0), new Point(200, 0), new Point(200, 200), new Point(0, 200) };

// Градиентный путь не используется.

// Градиентная кисть строится прямо из массива точек

PathGradientBrush myBr = new PathGradientBrush(Points);

// Создаем массив цветов

Color[] colorss = new[] { Color.FromArgb(255, 0, 128, 0), Color.FromArgb(255, 128, 0, 255), Color.FromArgb(255, 0, 128, 128) };

float[] relativePositions = new[] { 0.0F, 0.4F, 1.0F };

ColorBlend colorBlend = new ColorBlend();

colorBlend.Colors = colorss;

colorBlend.Positions = relativePositions;

myBr.InterpolationColors = colorBlend;

// Заливаем прямоугольник, больший по размерам, чем

//квадрат();

e.Graphics.FillRectangle(myBr, 0, 0, 200, 200);

break;

case 12:

// Создаем путь, содержащий полигон

GraphicsPath pathh = new GraphicsPath();

PointF[] Mypointss = new[] { new PointF(0, 200), new PointF(200, 0), new PointF(400, 200), new PointF(200, 300) };

pathh.AddPolygon(Mypointss);

// Используем путь для создания кисти

PathGradientBrush pthGrBrushh = new PathGradientBrush(pathh);

// Размещаем центральную точку,

// не являющуюся центром полигона

pthGrBrushh.CenterPoint = new PointF(120, 40);

pthGrBrushh.CenterColor = Color.DarkRed;

Color[] colorsss = new[] { Color.CornflowerBlue };

pthGrBrushh.SurroundColors = colorsss;

e.Graphics.FillPolygon(pthGrBrushh, Mypointss);

break;

case 13:

// Создаем путь

GraphicsPath MyPathh = new GraphicsPath();

Rectangle FirstRectangle = new Rectangle(0, 0, 100, 50);

Rectangle SecondRectangle = new Rectangle(50, 50, 150, 100);

// Добавляем к пути эллипс и прямоугольник

MyPathh.AddEllipse(FirstRectangle);

MyPathh.AddRectangle(SecondRectangle);

// Добавляем путь к области

Region myRegion = new Region(MyPathh);

SolidBrush MyBrush = new SolidBrush(Color.DarkCyan);

// Закрашиваем область

e.Graphics.FillRegion(MyBrush, myRegion);

break;

case 14:

// Создаем первый путь

GraphicsPath FirstPath = new GraphicsPath();

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

FirstPath.AddEllipse(new Rectangle(0, 0, 200, 100));

// Добавляем к области первый путь

Region myReg = new Region(FirstPath);

// Создаем второй путь

GraphicsPath SecondPath = new GraphicsPath();

SolidBrush Br = new SolidBrush(Color.Red);

// Добавляем прямоугольник ко второму пути

SecondPath.AddRectangle(new Rectangle(50, 50, 250, 150));

// Вычитаем второй путь из области

myReg.Xor(SecondPath);

e.Graphics.FillRegion(Br, myReg);

break;

}

mainPB.Refresh();

}

Задание1. Поворот кривой безье

private void hScrollBar1_Scroll(object sender, ScrollEventArgs e)

{

int Minimum, Maximum, Value;

Minimum = 0;

Maximum = 370;

hScrollBar1.Minimum = Minimum;

hScrollBar1.Maximum = Maximum;

hScrollBar1.LargeChange = 10;

Value = hScrollBar1.Value;

float x, y;

x = System.Convert.ToSingle(mainPB.Width/ (double)4.25);

y = System.Convert.ToSingle(mainPB.Height/ (double)4.25);

PointF rotatePoint = new PointF(x, y);

Graphics G= pictureBox1.CreateGraphics();

G.Clear(Color.White);

G.ResetTransform();

Matrix myMatrix = new Matrix();

myMatrix.RotateAt(Value, rotatePoint, MatrixOrder.Append);

G.Transform = myMatrix;

DrawShapeLine(G);

}

public void DrawShapeLine(Graphics GraphicObject)

{

Point s1 = new Point(10, 100); // Начальная точка

Point e1 = new Point(100, 10); // Первая контрольная точка

Point e2 = new Point(150, 150); // Вторая контрольная точка

Point s2 = new Point(200, 100);

Pen Mypen = new Pen(Color.Black, 3);

GraphicObject.DrawBezier(Mypen, s1, e1, e2, s2);

}

Задание 2. Масштабирование фотографии

private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)

{

Bitmap myBitmap = new Bitmap(@"C:\Users\1\Desktop\История\Новая папка\FBnYMeLp.jpg");

float XScaleFactor, YScaleFactor;

XScaleFactor = (vScrollBar2.Value) / (float)100;

YScaleFactor = (vScrollBar1.Value) / (float)100;

Graphics G;

G = pictureBox2.CreateGraphics();

G.ScaleTransform(XScaleFactor + 1, YScaleFactor + 1);

Rectangle compressionRectangle = new Rectangle(0, 0, myBitmap.Width, myBitmap.Height);

//Point p = new Point(0, 0);

G.DrawImage(myBitmap, compressionRectangle);

}

private void vScrollBar2_Scroll(object sender, ScrollEventArgs e)

{

Bitmap myBitmap = new Bitmap(@"C:\Users\1\Desktop\История\Новая папка\FBnYMeLp.jpg");

float XScaleFactor, YScaleFactor;

XScaleFactor = (vScrollBar2.Value) / (float)100;

YScaleFactor = (vScrollBar1.Value) / (float)100;

Graphics G;

G = pictureBox2.CreateGraphics();

G.ScaleTransform(XScaleFactor + 1, YScaleFactor + 1);

Rectangle compressionRectangle = new Rectangle(0, 0, myBitmap.Width, myBitmap.Height);

//Point p = new Point(0, 0);

G.DrawImage(myBitmap, compressionRectangle);

}

Соседние файлы в предмете Инженерная и компьютерная графика