Отчет по лабораторной работе №4 по дисциплине компьютерная графика
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ
ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Институт кибернетики
Кафедра информатики и проектирования систем
Отчет по лабораторной работе №4
по дисциплине КОМПЬЮТЕРНАЯ ГРАФИКА
Вариант 6
Разработчик:
студент группы 8в83
Сафронов Б.А.
Согласовано:
доцент
Демин А. Ю.
Томск 2011
ПРОСТЕЙШИЕ АЛГОРИТМЫ КОМПЬЮТЕРНОЙ ГРАФИКИ
Задание:
Реализовать с заданной совокупностью фигур все виды афинных преобразований: перенос по оси 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;
}
}
}
Результат работы программы:
Рисунок - Скриншот работы программы
Разработать программу, имитирующую падение листа с дерева.
Результат работы программы:
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
скачать
Другие похожие работы: