Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2009, 19:18   #1
Foxtrot_1
Пользователь
 
Аватар для Foxtrot_1
 
Регистрация: 14.06.2009
Сообщений: 67
Вопрос CSHARP

Здравствуйте Уважаемые форумчане. Сделали задание по Компьютерной графике, один вариант на троих. Ну и соответственно не приняли. Кто нибудь в CSHARP понимает???
Задание:
1. Привести ключевые фрагменты программного кода, реализующего одноточечное перспективное проецирование треугольной призмы на плоскость
Код:
double[,] TrianglePrizm; //массив, хранящий координаты вершин призмы
double[,] SPPPMatrix; //массив хранящий матрицу преобразования

//Фунция выделения памяти под двумерный массив нужного размера и его обнуления
private double [,] InitTwoDimArray(int x, int y)
        {
            double [,] array = new double[x, y];
            for(int i = 0; i < x; i++) Array.Clear(array, 0, array.Length);
            return array;
        }

//Формирование единичного вектора координат (i,j,k,r) для матрицы данных
private void FormVertex3D(double[, ] Matrix, int i, double x, double y, double z, double k)
        {
            Matrix[i, 0] = x;
            Matrix[i, 1] = y;
            Matrix[i, 2] = z;
            Matrix[i, 3] = k;
        }

//Формирование матрицы одноточечного перспективного проецирования, где зануление одной переменных (OX,OY,OZ) будет означать целевую плоскость проецирования
private void FormSPPPMatrix(double r, int OX, int OY, int OZ)
        {
            SPPPMatrix = InitTwoDimArray(4, 4); 
            FormVertex3D(SPPPMatrix, 0, OX, 0, 0, 0);
            FormVertex3D(SPPPMatrix, 1, 0, OY, 0, 0);
            FormVertex3D(SPPPMatrix, 2, 0, 0, OZ, r);
            FormVertex3D(SPPPMatrix, 3, 0, 0, 0, 1);
        }

//Формирование матрицы, хранящей вершины треугольной призмы
private void FormTrianglePrizm()
        {
            TrianglePrizm = InitTwoDimArray(8, 4); 
            FormVertex3D(TrianglePrizm, 0, 0, 0, 0, 1);
            FormVertex3D(TrianglePrizm, 1, 0, 0, 1, 1);
            FormVertex3D(TrianglePrizm, 2, 0, 1, 0, 1);
            FormVertex3D(TrianglePrizm, 3, 0, 1, 1, 1);
            FormVertex3D(TrianglePrizm, 4, 1, 0, 0, 1);
            FormVertex3D(TrianglePrizm, 5, 1, 0, 1, 1);
            FormVertex3D(TrianglePrizm, 6, 1, 1, 0, 1);
            FormVertex3D(TrianglePrizm, 7, 1, 1, 1, 1);
        }



//Функция перемножения матриц
private double[,] MatrixMultiply(double[,] M1, double[,] M2, int size_x, int size_y)
        {
            double [,] temp = InitTwoDimArray(size_x, size_y);
            for(int i = 0; i < size_x; ++i)
                for(int j = 0; j < size_y; ++j)
                    for(int k = 0; k < size_y; ++k)
                        temp[i,j] += M1[i,k] * M2[k,j];
            return temp;
        }

//Функция нормализации результирующей матрицы
        private void NormalizeSPPP(double[,] matrix, double r)
        {
            for(int i = 0; i < 8; ++i)
            {
                double delimiter = matrix[i, 3];
                matrix[i, 0] = Math.Round(matrix[i, 0] / delimiter, 2);
                matrix[i, 1] = Math.Round(matrix[i, 1] / delimiter, 2);
                matrix[i, 2] = Math.Round(matrix[i, 2] / delimiter, 2);
                matrix[i, 3] = matrix[i, 3] / delimiter;
             }
        }

//Последовательность вызова
{
            double r = -0.1; // на оси z фокус F = -10
            FormSPPPMatrix(r, 1, 1, 0); //проецирование на плоскость OZ
            FormTrianglePrizm();
            double [,] ResultMatrix = InitTwoDimArray(8,4);
            ResultMatrix = MatrixMultiply(TrianglePrizm, SPPPMatrix,8,4);
            NormalizeSPPP(ResultMatrix, r);
Всегда бывает лучше, чем ты хочешь!!!
Foxtrot_1 вне форума Ответить с цитированием
Старый 26.06.2009, 19:18   #2
Foxtrot_1
Пользователь
 
Аватар для Foxtrot_1
 
Регистрация: 14.06.2009
Сообщений: 67
По умолчанию

2. Привести фрагмент программного кода, реализующего «плавный» поворот квадрата (1в: 10;10. 2в: 10;100. 3в: 100;100. 4в: 100;10) вокруг его геометрического центра
Код:
double[,] RotationMatrix; //матрица повотота
double[,] Square; //матрица вершин квадрата
double[,] MoveMatrix; //матрица смещения в центр координат

//Формирование единичного вектора координат (i,j,r) для матрицы данных
private void FormVertex2D(double[,] Matrix, int i, double x, double y, double k)
        {
            Matrix[i, 0] = x;
            Matrix[i, 1] = y;
            Matrix[i, 2] = k;
        }

//Формирование матрицы поворота фигуры на заданный угол относительно центра координат
private void Form2DRotationMatrix(double degrees)
        {
            double angle = Math.PI * degrees / 180;
            RotationMatrix = InitTwoDimArray (4, 3);
            FormVertex2D(RotationMatrix, 0,  Math.Cos(angle), Math.Sin(angle), 0);
            FormVertex2D(RotationMatrix, 1, -Math.Sin(angle), Math.Cos(angle), 0);
            FormVertex2D(RotationMatrix, 2,      0,               0,           1);
        }

//Формирование матрицы смещения, с целью переноса центра фигуры в центр координат
private void Form2DMoveMatrix(int m, int n)
        {
            MoveMatrix = InitTwoDimArray(4, 3);
            FormVertex2D(MoveMatrix, 0, 1, 0, 0);
            FormVertex2D(MoveMatrix, 1, 0, 1, 0);
            FormVertex2D(MoveMatrix, 2, m, n, 1);
        }
//Последовательность вызова
{
            FormSquare();
            for(int i = 0; i < 45; ++i)
            {
                pictureBox1.Refresh();
                Form2DMoveMatrix(-55, -55);
                Square = MatrixMultiply (Square, MoveMatrix, 4, 3);
                
                Form2DRotationMatrix(0.1 * i);
                Square = MatrixMultiply(Square, RotationMatrix, 4, 3);
                
                Form2DMoveMatrix(55, 55);
                Square = MatrixMultiply(Square, MoveMatrix, 4, 3);
                
                DrawFigure(Square, 100, 100);
                System.Threading.Thread.Sleep(200);
            }}
Всегда бывает лучше, чем ты хочешь!!!
Foxtrot_1 вне форума Ответить с цитированием
Старый 26.06.2009, 19:19   #3
Foxtrot_1
Пользователь
 
Аватар для Foxtrot_1
 
Регистрация: 14.06.2009
Сообщений: 67
По умолчанию

В этих двух кодах можно что либо поменять. Надо чтоб отличалось.
Всегда бывает лучше, чем ты хочешь!!!
Foxtrot_1 вне форума Ответить с цитированием
Старый 26.06.2009, 19:53   #4
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Если вы сами сделали, то почему переделать не можете? Если человек сам написал программу, то он может ее переделать визуально.
В вашем же случае, я думаю, что эту программу вы у кого-то взяли, а здесь выдаете за свою. Но это только мое мнение. Если вы его опровергните - я прошу прощения. Но я думаю, врядли.
MaTBeu вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц