Разработка программы, реализующей базовые геометрические преобразования заданной фигуры
Министерство
образования и науки РФ
Федеральное
государственное бюджетное образовательное учреждение высшего профессионального
образования
Волгоградский
государственный технический университет
Кафедра ЭВМ
и систем
Семестровая
работа
по курсу
«Компьютерная графика»
Выполнила: студентка группы
ВЗК-382с Кравцова В.В.
Волгоград -
2014
1. Задание
Разработать алгоритм и написать программу,
реализующую базовые геометрические преобразования заданной фигуры.
Необходимо реализовать следующие преобразования:
вращения;
перенос;
отражение;
масштабирование.
Фигура - 2.
В соответствии с заданием была разработана
программа, реализующая указанные четыре базовых преобразования.
Скриншот работы программы.
При запуске и нажатии кнопки «Начало», видим
фигуру «2» недалеко от начала координат.
Рисунок 1
Для выполнения операции переноса необходимо
ввести в соответствующие поля значения переноса по каждой из осей координат.
геометрический вращение
масштабирование программа
Рисунок 2
На данном изображении показан перенос из
начального положения на -100 пкс по оси OX
и на -150 пкс по оси OY.
Для выполнения операции вращения необходимо
ввести в соответствующее поле значение угла вращения.
Рисунок 3
На данном изображении показано вращение из
начального положения на 152 гр.
Для выполнения операции масштабирования
необходимо ввести в соответствующие поля значения масштабирования по каждой из
координат.
Рисунок 4
На данном изображении показано удлинение в 2,5
раза по оси OX и в 0,8
раза по оси OY.
Для выполнения операции отражения, необходимо
нажать одноименную кнопку.
Рисунок 5
На данном изображении показано отражение из
начального положения относительно оси OX.
2. Текст
программы
System;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Linq;System.Text;System.Windows.Forms;KG
{partial class Form1 : Form
{x_mid, y_mid;double[][] XY;num_xy =
10;[] vect;[][] matr;Form1()
{();();
}void button1_Click(object sender,
EventArgs e)
{();
}void GraphBegin()
{g =
pictureBox1.CreateGraphics();();(g);
}void InitBukva()
{= new double[num_xy][];(int i = 0;
i < num_xy; i++)[i] = new double[2];[0][0] = 70; XY[0][1] = 20;[1][0] = 20;
XY[1][1] = 20;[2][0] = 80; XY[2][1] = 100;[3][0] = 70; XY[3][1] = 110;[4][0] =
40; XY[4][1] = 110;[5][0] = 30; XY[5][1] = 100;= new double[3];= new
double[3][];(int i = 0; i < 3; i++)[i] = new double[3];
}void DrawOXY(Graphics g, int x, int
y)
{
g.Clear(Color.White);
x_mid = Convert.ToInt32(x / 2);
y_mid = Convert.ToInt32(y / 2);
_DrawOXY(g, x, y);
}void _DrawOXY(Graphics g, int x,
int y)
{
g.DrawLine(Pens.Black, 0, y_mid, x,
y_mid);
g.DrawLine(Pens.Black, x_mid, 0,
x_mid, y);
}void UpdateContext(Graphics g)
{
DrawOXY(g, pictureBox1.Width,
pictureBox1.Height);
DrawBukva(g, XY);
}void DrawBukva(Graphics a,
double[][] _XY)
{
for (int i = 0; i < (num_xy - 1);
i++)
_DrawLine(a, _XY[i][0], _XY[i][1],
_XY[i + 1][0], _XY[i + 1][1]);
}void _DrawLine(Graphics g, double
x1, double y1, double x2, double y2)
{
}int ConvertX(double x)
{
return Convert.ToInt32(x) + x_mid;
}int ConvertY(double y)
{
return y_mid - Convert.ToInt32(y);
}void pictureBox1_Paint(object
sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
UpdateContext(g);
}void button2_Click(object sender,
EventArgs e)
{
_Perenos(Convert.ToDouble(tbPerenosX.Text),
Convert.ToDouble(tbPerenosY.Text));
Graphics g =
pictureBox1.CreateGraphics();
UpdateContext(g);
}void _Perenos(double X, double Y)
{
int mas = 3;
double[] v = new double[3];
v[0] = X;
v[1] = Y;
v[2] = 1;
for (int i = 0; i < (mas - 1);
i++)
for (int j = 0; j < (mas - 1);
j++)
if (i == j)
matr[i][j] = 1;
else
matr[i][j] = 0;
for (int i = 0; i < mas; i++)
matr[(mas - 1)][i] = v[i];
for (int i = 0; i < num_xy; i++)
{
vect[0] = XY[i][0];
vect[1] = XY[i][1];
vect[2] = 1;
mult_matr(3, vect, matr);
XY[i][0] = vect[0];
XY[i][1] = vect[1];
}
}void _Vrashenie(double Gr)
{
matr[0][0] = Math.Cos(Math.PI * Gr /
180);
matr[1][1] = matr[0][0];
matr[2][2] = 1;
matr[0][1] = Math.Sin(Math.PI * Gr /
180);
matr[1][0] = -matr[0][1];
for (int i = 0; i < 2; i++)
{
matr[2][i] = 0;
matr[i][2] = 0;
}
for (int i = 0; i < num_xy; i++)
{
vect[0] = XY[i][0];
vect[1] = XY[i][1];
vect[2] = 1;
mult_matr(3, vect, matr);
XY[i][0] = vect[0];
XY[i][1] = vect[1];
}
}void _Mashtab(double X, double Y)
{
double[] vect_in = new double[3];
vect_in[0] = X;
vect_in[1] = Y;
vect_in[2] = 1;
int mas = 3;
for (int i = 0; i < mas; i++)
for (int j = 0; j < mas; j++)
if (i != j)
else
{
if (i == (mas - 1))
matr[i][j] = 1;
else
matr[i][j] = vect_in[i];
}
for (int i = 0; i < num_xy; i++)
{
vect[0] = XY[i][0];
vect[1] = XY[i][1];
vect[2] = 1;
mult_matr(3, vect, matr);
XY[i][0] = vect[0];
XY[i][1] = vect[1];
}
}void _Otr()
{
int mas = 3;
for (int i = 0; i < mas; i++)
for (int j = 0; j < mas; j++)
if (i != j)
matr[i][j] = 0;
else
matr[i][j] = 1;
matr[1][1] = -1;
for (int i = 0; i < num_xy; i++)
{
vect[0] = XY[i][0];
vect[1] = XY[i][1];
vect[2] = 1;
mult_matr(3, vect, matr);
XY[i][0] = vect[0];
XY[i][1] = vect[1];
}
}void mult_matr(int mas, double[]
vect, double[][] matr)
{
double[] _v = new double[mas];
for (int i = 0; i < mas; i++)
{
_v[i] = 0;
for (int j = 0; j < mas; j++)
_v[i] += matr[j][i] * vect[j];
}
for (int i = 0; i < mas; i++)
vect[i] = _v[i];
}void button3_Click(object sender,
EventArgs e)
{
_Vrashenie(Convert.ToDouble(tbRotate.Text));
Graphics g =
pictureBox1.CreateGraphics();
UpdateContext(g);
}void button4_Click(object sender,
EventArgs e)
{
_Mashtab(Convert.ToDouble(tbMasX.Text),
Convert.ToDouble(tbMasY.Text));
Graphics g =
pictureBox1.CreateGraphics();
UpdateContext(g);
}void button5_Click(object sender,
EventArgs e)
{
_Otr();
Graphics g =
pictureBox1.CreateGraphics();
UpdateContext(g);
}
}
}