Лабораторная работа №4
«Аффинные преобразования в пространстве»
Цель работы: научиться выполнять простейшие аффинные преобразования в пространстве: перенос, сдвиг, поворот, масштабирование. Написать программу, которая реализует эти преобразования для некоторого графического объекта.
Работа программы: при запуске появляется окно программы при начальных установках всех значений:
В качестве фигуры, которая подвергается преобразованиям, используется куб. Для того, чтобы выполнить какое-либо преобразование, необходимо выбрать пункт «Преобразование» и выбрать соответствующую вкладку. Также можно задать координаты локального центра в соответствующей вкладке:
После ввода всех параметров, необходимо нажать кнопку «Выполнить»:
Также можно посмотреть текущие координаты всех вершин куба, для этого необходимо зайти в вкладку «Координаты»:
Для перемещения по плоскости проекции, можно воспользоваться кнопками со стрелками в правом верхнем углу окна, предварительно выбрав нужную проекцию.
Исходный текст программы на языке С#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace FlatCurve
{
public partial class frmSpaceAffin : Form
{
int dkx = 20, dky = 20; // приращения в экранных точках при сдвиге начала координат
int vertex_count = 8; //кол-во вершин
int n_matr = 4; //размерность матрицы преобразования
float sizeX,sizeY; //масштаб по x и y
float stepX, stepY; // приращение по x и y в одном пикселе
float relX, relY; //координаты точки относительно начала координат
float local_x, local_y, local_z;
//=====================XXXXXXXXXXXXXXXXXXXXXX=====YYYYYYYYYYYYYYYYYYYYYYY=======ZZZZZZZZZZZZZZZZZZZZ==================
float[,] points = { { 1, 1, 0, 0, 1, 1, 0, 0 }, { 0, 1, 1, 0, 0, 1, 1, 0 }, { 0, 0, 0, 0, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1 } };
float[,] old_points = { { 1, 1, 0, 0, 1, 1, 0, 0 }, { 0, 1, 1, 0, 0, 1, 1, 0 }, { 0, 0, 0, 0, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1 } };
PointF[] scr_points = new PointF[8]; // экранные точки
PointF[] old_scr_points = new PointF[8];
PointF XY = new PointF(); //текущая точка на экране
PointF centerXOY = new PointF(); // точка начала координат
PointF centerXOZ = new PointF();
PointF centerYOZ = new PointF();
PointF local_centerXOY = new PointF();
PointF local_centerXOZ = new PointF();
PointF local_centerYOZ = new PointF();
public frmSpaceAffin()
{
InitializeComponent();
centerXOY.X = pnlXOY.Size.Width / 2;
centerXOY.Y = pnlXOY.Size.Height / 2;
local_centerXOY.X = centerXOY.X;
local_centerXOY.Y = centerXOY.Y;
centerXOZ.X = pnlXOZ.Size.Width / 2;
centerXOZ.Y = pnlXOZ.Size.Height / 2;
local_centerXOZ.X = centerXOZ.X;
local_centerXOZ.Y = centerXOZ.Y;
centerYOZ.X = pnlYOZ.Size.Width / 2;
centerYOZ.Y = pnlYOZ.Size.Height / 2;
local_centerYOZ.X = centerYOZ.X;
local_centerYOZ.Y = centerYOZ.Y;
koords_print();
}
void mashtab(float kx,float ky, float kz) //масштабирование
{
float[,] matr = { { kx, 0, 0, 0 }, { 0, ky, 0, 0 }, { 0, 0, kz, 0 }, { 0, 0, 0, 1 } };
points = matr_mult(matr, points);
}
void perenos(float tx, float ty, float tz) //перенос
{
float[,] matr = { { 1, 0, 0, tx }, { 0, 1, 0, ty }, { 0, 0, 1, tz }, { 0, 0, 0, 1 } };
points = matr_mult(matr, points);
}
void povorot(float ugol,int XYZ) //поворот на угол относительно оси
{
float rad = (float) (ugol * Math.PI / 180);
float[,] matr = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 1 } };
if (XYZ == 1)
{
matr[1, 1] = (float)(Math.Cos(rad));
matr[1, 2] = (float)(-1 * Math.Sin(rad));
matr[2, 1] = (float)(Math.Sin(rad));
matr[2, 2] = (float)(Math.Cos(rad));
}
if (XYZ == 2)
{
matr[0, 0] = (float)(Math.Cos(rad));
matr[2, 0] = (float)(-1 * Math.Sin(rad));
matr[0, 2] = (float)(Math.Sin(rad));
matr[2, 2] = (float)(Math.Cos(rad));
}
if (XYZ == 3)
{
matr[0, 0] = (float)(Math.Cos(rad));
matr[0, 1] = (float)(-1 * Math.Sin(rad));
matr[1, 0] = (float)(Math.Sin(rad));
matr[1, 1] = (float)(Math.Cos(rad));
}
points = matr_mult(matr, points);
}
void sdvig(float koeff, int k) //Сдвиг
{
float[,] matr = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 1 } };
switch (k)
{
case 1:
matr[0, 1] = koeff;
break;
case 2:
matr[0, 2] = koeff;
break;
case 3:
matr[1, 0] = koeff;
break;
case 4:
matr[1, 2] = koeff;
break;
case 5:
matr[2, 0] = koeff;
break;
case 6:
matr[2, 1] = koeff;
break;
}
points = matr_mult(matr, points);
}
float[,] matr_mult(float[,] matr, float[,] points) //умножение матриц
{
int i, j, k;
float[,] rez = new float[n_matr, vertex_count];
for (i = 0; i < n_matr; i++)
for (j = 0; j < vertex_count; j++)
{
rez[i, j] = 0;
for (k = 0; k < n_matr; k++)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.