NetNado
  Найти на сайте:

Учащимся

Учителям



Отчет по лабораторной работе №4 по дисциплине компьютерная графика


МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ

ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Институт кибернетики

Кафедра информатики и проектирования систем

Отчет по лабораторной работе №4
по дисциплине КОМПЬЮТЕРНАЯ ГРАФИКА

Вариант 6

Разработчик:

студент группы 8в83

Сафронов Б.А.


Согласовано:

доцент

Демин А. Ю.


Томск 2011
ПРОСТЕЙШИЕ АЛГОРИТМЫ КОМПЬЮТЕРНОЙ ГРАФИКИ

Задание:

  1. Реализовать с заданной совокупностью фигур все виды афинных преобразований: перенос по оси OX и оси OY, отражение относительно координатных осей и прямой Y=X, масштабирование независимо по обеим осям, поворот на заданные углы относительно центра координат и относительно произвольной точки, указываемой в ходе выполнения программы. Предусмотреть восстановление исходной позиции фигур. Управление организовать как через интерфейсные элементы (меню, кнопки, строки редактирования и пр.), так и через "горячие" клавиши. Обязательно использовать матрицы для хранения координат вершин, матрицу преобразования, подпрограмму (метод) для умножения матриц.

Код программы:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Drawing.Drawing2D;

using System.Drawing;
namespace Figures

{
//фигура

[Serializable]

public class Figure

{

public PointF location;

public PointF resetLocation;

public PointF[] figurePoints;

public PointF[] standardPoints;
public Figure(float x, float y)

{

resetLocation = new PointF(x, y);

location = new PointF(x, y);

standardPoints = new PointF[10];

figurePoints = new PointF[10];
// Задание смещения каждой точки фигуры относительно центра


standardPoints[0] = new PointF(0F, -65F);

standardPoints[7] = new PointF(40F, -50F);

standardPoints[4] = new PointF(60F, -20F);

standardPoints[1] = new PointF(60F, 20F);

standardPoints[8] = new PointF(40F, 50F);

standardPoints[5] = new PointF(0F, 65F);

standardPoints[2] = new PointF(-40F, 50F);

standardPoints[9] = new PointF(-60F, 20F);

standardPoints[6] = new PointF(-60F, -20F);

standardPoints[3] = new PointF(-40F, -50F);
//Вычисление координат точек фигуры с учетом смещения

for (int i = 0; i < figurePoints.Length; i++)

{

figurePoints[i].X = location.X + standardPoints[i].X;

figurePoints[i].Y = location.Y + standardPoints[i].Y;

}

}
/*

*Метод трансформирования матрицы фигуры

*/

public void Reset()

{

location = resetLocation;

//Вычисление координат точек фигуры с учетом смещения

for (int i = 0; i < figurePoints.Length; i++)

{

figurePoints[i].X = location.X + standardPoints[i].X;

figurePoints[i].Y = location.Y + standardPoints[i].Y;

}

}
/*

*Метод рисования фигуры

*/

public void Draw(System.Drawing.Graphics path, System.Drawing.Pen pen)

{

path.Clear(Color.Black);
System.Drawing.Pen coordPen = new System.Drawing.Pen(System.Drawing.Color.White);

path.DrawLine(coordPen, 0, 250, 500, 250);

path.DrawLine(coordPen, 250, 0, 250, 500);
for (int i = 0; i < this.figurePoints.Length - 1; i++)

{

//path.DrawEllipse(pen, figurePoints[i].X, figurePoints[i].Y, 3, 3);

path.DrawLine(pen, this.figurePoints[i].X, this.figurePoints[i].Y, this.figurePoints[i + 1].X, this.figurePoints[i + 1].Y);

}
//path.DrawEllipse(pen, figurePoints[this.figurePoints.Length - 1].X, figurePoints[this.figurePoints.Length - 1].Y, 3, 3);

path.DrawLine(pen, this.figurePoints[this.figurePoints.Length - 1].X, this.figurePoints[this.figurePoints.Length - 1].Y, this.figurePoints[0].X, this.figurePoints[0].Y);
//path.DrawEllipse(pen, location.X, location.Y, 3, 3);

path.DrawLine(pen, location.X, location.Y, location.X, location.Y);

}
/*

*Метод перемещения фигуры

*/

public void Offset(float x, float y)

{

for (int i = 0; i < this.figurePoints.Length; i++)

{

figurePoints[i].X += x;

figurePoints[i].Y += y;

}
location.X += x;

location.Y += y;

}
public PointF[] MultM(float[,] M, float offsetX, float offsetY)

{

PointF[] newPoints = new PointF[this.figurePoints.Length];

for (int i = 0; i < figurePoints.Length; i++)

{

newPoints[i].X = (this.figurePoints[i].X - offsetX) * M[0, 0] + (this.figurePoints[i].Y - offsetY) * M[1, 0] + offsetX;

newPoints[i].Y = (this.figurePoints[i].X - offsetX) * M[0, 1] + (this.figurePoints[i].Y - offsetY) * M[1, 1] + offsetY;

}
PointF newLocation = new PointF();
newLocation.X = (this.location.X - offsetX) * M[0, 0] + (this.location.Y - offsetY) * M[1, 0] + offsetX;

newLocation.Y = (this.location.X - offsetX) * M[0, 1] + (this.location.Y - offsetY) * M[1, 1] + offsetY;
location.X = newLocation.X;

location.Y = newLocation.Y;
return newPoints;

}

}

}

Результат работы программы:



Рисунок - Скриншот работы программы


  1. Разработать программу, имитирующую падение листа с дерева.

Результат работы программы:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Drawing.Drawing2D;

using System.Drawing;
namespace Figures

{
//фигура

[Serializable]

public class Figure

{

public PointF location;

public PointF resetLocation;

public PointF[] figurePoints;

public PointF[] standardPoints;
public Figure(float x, float y)

{

resetLocation = new PointF(x, y);

location = new PointF(x, y);

standardPoints = new PointF[2];

figurePoints = new PointF[2];
// Задание смещения каждой точки фигуры относительно центра


standardPoints[0] = new PointF(0F, -65F);

standardPoints[1] = new PointF(0F, 0F);
//Вычисление координат точек фигуры с учетом смещения

for (int i = 0; i < figurePoints.Length; i++)

{

figurePoints[i].X = location.X + standardPoints[i].X;

figurePoints[i].Y = location.Y + standardPoints[i].Y;

}

}
/*

*Метод трансформирования матрицы фигуры

*/

public void Reset()

{

location = resetLocation;

//Вычисление координат точек фигуры с учетом смещения

for (int i = 0; i < figurePoints.Length; i++)

{

figurePoints[i].X = location.X + standardPoints[i].X;

figurePoints[i].Y = location.Y + standardPoints[i].Y;

}

}
/*

*Метод рисования фигуры

*/

public void Draw(System.Drawing.Graphics path, System.Drawing.Pen pen)

{

path.Clear(Color.Black);
System.Drawing.Pen coordPen = new System.Drawing.Pen(System.Drawing.Color.White);

path.DrawLine(coordPen, 0, 250, 500, 250);

path.DrawLine(coordPen, 250, 0, 250, 500);
for (int i = 0; i < this.figurePoints.Length - 1; i++)

{

//path.DrawEllipse(pen, figurePoints[i].X, figurePoints[i].Y, 3, 3);

path.DrawLine(pen, this.figurePoints[i].X, this.figurePoints[i].Y, this.figurePoints[i + 1].X, this.figurePoints[i + 1].Y);

}
//path.DrawEllipse(pen, figurePoints[this.figurePoints.Length - 1].X, figurePoints[this.figurePoints.Length - 1].Y, 3, 3);

path.DrawLine(pen, this.figurePoints[this.figurePoints.Length - 1].X, this.figurePoints[this.figurePoints.Length - 1].Y, this.figurePoints[0].X, this.figurePoints[0].Y);
//path.DrawEllipse(pen, location.X, location.Y, 3, 3);

path.DrawLine(pen, location.X, location.Y, location.X, location.Y);

}
/*

*Метод перемещения фигуры

*/

public void Offset(float x, float y)

{

for (int i = 0; i < this.figurePoints.Length; i++)

{

figurePoints[i].X += x;

figurePoints[i].Y += y;

}
location.X += x;

location.Y += y;

}
public PointF[] MultM(float[,] M, float offsetX, float offsetY)

{

PointF[] newPoints = new PointF[this.figurePoints.Length];

for (int i = 0; i < figurePoints.Length; i++)

{

newPoints[i].X = (this.figurePoints[i].X - offsetX) * M[0, 0] + (this.figurePoints[i].Y - offsetY) * M[1, 0] + offsetX;

newPoints[i].Y = (this.figurePoints[i].X - offsetX) * M[0, 1] + (this.figurePoints[i].Y - offsetY) * M[1, 1] + offsetY;

}
PointF newLocation = new PointF();
newLocation.X = (this.location.X - offsetX) * M[0, 0] + (this.location.Y - offsetY) * M[1, 0] + offsetX;

newLocation.Y = (this.location.X - offsetX) * M[0, 1] + (this.location.Y - offsetY) * M[1, 1] + offsetY;
location.X = newLocation.X;

location.Y = newLocation.Y;
return newPoints;

}

}

}



Рисунок – Скриншот работы программы

Вывод:

В результате проделанной работы были реализованы алгоритмы, производящие все виды афинных преобразований, такие как перенос по оси OX и оси OY, отражение относительно координатных осей и прямой Y=X, масштабирование независимо по обеим осям, поворот на заданные углы относительно центра координат и относительно произвольной точки, указываемой в ходе выполнения программы. При реализации использовалась подпрограмма перемножения матриц, для осуществления поворота, масштабирования и отражения фигуры. Каждая матрица предназначена для определенного вида преобразований. При реализации программы падения листа, использовалась первая программа. Траектория падения представляет собой параболу. Скорость падения и рисование координат листа осуществляется с помощью компонента – таймер.

страница 1


скачать

Другие похожие работы: