Аффинные преобразования в пространстве. Простейшие аффинные преобразования в пространстве: перенос, сдвиг, поворот, масштабирование

Страницы работы

Содержание работы

Лабораторная работа №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++)

Похожие материалы

Информация о работе