Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Отчет

.docx
Скачиваний:
10
Добавлен:
13.04.2015
Размер:
133.92 Кб
Скачать

Северо-Кавказский горно-металлургический институт

(государственный технологический университет)

Кафедра автоматизированной обработки информации

КУРСОВАЯ РАБОТА

на тему:

"Нахождение единой матрицы преобразований"

Выполнила: студентка гр. ИВб-11-2

Глотова А.В.

Проверила: Соколова Е.А.

Владикавказ-2013

Задание: Составить единую матрицу преобразований для поворота графического объекта относительно отрезка на заданный угол и программно реализовать.

СОДЕРЖАНИЕ

Введение

4 стр.

1.

Теоретическая часть

1.1. Аналитический обзор

6 стр.

1.2. Содержательная постановка задачи

8 стр.

2.

Практическая часть

2.1. Алгоритм

9 стр.

2.1. Программная реализация

10 стр.

2.2. Пример

13 стр.

Заключение

18 стр.

Литература

20 стр.

Приложения

21 стр.

ВВЕДЕНИЕ

Цель курсовой работы: вычисление единой матрицы преобразований для поворота графического объекта относительно отрезка.

Задачи курсовой работы:

  1. Изучение теоретических основ вращения графических объектов.

  2. Расчет матриц поворота для различных осей.

Разработка и программная реализация алгоритма нахождения единой матрицы преобразований.

  1. Работа с файлами для предоставления информации о расчете.

  2. Формирование навыков работы с литературой, анализа полученных данных и умения построения на их основе логических заключений.

В настоящее время трудно представить человека, не знакомого с понятием компьютерной графики. Мы сталкиваемся с ним постоянно: при распечатке плакатов, обработке в Photoshop фотографий, работая с любым изображением.

Компьютерная графика - это область деятельности, в которой компьютеры используются в качестве инструмента как для создания изображений, так и для обработки визуальной информации, полученной из реального мира.

Этот раздел включает в себя описание разных типов графических изображений (растровая, векторная, фрактальная); методов их обработки (масштабирования, изменения цвета, яркости, контрастности, поворот изображения на заданный угол, наложение фильтров); алгоритмы сжатия изображений (RLE, JPEG,LZW), алгоритмы построения примитивов (ЦДА, алгоритм Брезенхема для окружности) и т.д. Современное программное обеспечение и стремительно развивающиеся возможности видеокарт позволяют обрабатывать огромные объемы графической информации и создавать собственные программные продукты, реализующие методы обработки изображений различного масштаба и любого расширения. В данном курсовом проекте разработана программа поворота изображения относительно отрезка, представляющая собой огромные расчеты с использованием матриц, время которых значительно снижено за счет использования компьютерной техники.

1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ

1.1. АНАЛИТИЧЕСКИЙ ОБЗОР

Поворот изображения относительно отрезка - это пересчет его координат с помощью единой матрицы преобразований.

Единая матрица преобразований - это матрица, при умножении на которую координаты начальной и конечной точки заданного отрезка остаются неизменными, а координаты поворачиваемого изображения пересчитываются в зависимости от заданных условий (угла и отрезка), после чего графический объект перерисовывается

Для получения единой матрицы преобразований используются:

  • матрицы поворота относительно осей - ортогональные матрицы, которые используются для выполнения собственного ортогонального преобразования в евклидовом пространстве. При умножении любого вектора на матрицу поворота длина вектора сохраняется. Определитель матрицы поворота равен единице.

1) относительно оси ОХ:

,

2) относительно оси ОУ:

,

3) относительно OZ:

.

  • Инцидентная матрица

  • Проекция - векторной проекцией вектора на ось называется вектор, который получается в результате перемножения скалярной проекции вектора на эту ось и единичного вектора этой оси.

  • Обратная матрица - такая матрица A−1, при умножении на которую, исходная матрица A даёт в результате единичную матрицу E.

1.2. СОДЕРЖАТЕЛЬНАЯ ПОСТАНОВКА ЗАДАЧИ

Дан отрезок ОВ, ось и задан угол поворота изображения α. Необходимо, основываясь на исходных данных, построить единую матрицу преобразований для поворота изображения на заданный угол относительно отрезка ОВ. Использовать при вычислениях матрицы поворота М1(Х), М2 (У), М3 (Z), а также обратные им матрицы М5, М6, М7.

2. ПРАКТИЧЕСКАЯ ЧАСТЬ

2.1. АЛГОРИТМ

П1. Ввод исходных данных.

П2. Совмещение начальной точки отрезка с началом координат посредством инцидентной матрицы.

П3. Нахождение новой конечной точки путем умножения её координат на инцидентную матрицу.

П4. Создание проекции на одну из осей.

П5. Рассчет гипотенузы

где k1, k2 - значения двух свободных осей.

Нахождение Cos и Sin.

П6. Создание матрицы М2 с помощью соответствующей матрицы поворота Rx, Ry, Rz.

П7. Перерасчет координат конечной точки В.

П8. Используя полученные данные, повторяем шаги П4-П7 и строим матрицу М3.

П9. Находим матрицу поворота М4 в соответствии с заданным углом и осью.

П10. С помощью метода Гаусса или алгебраических дополнений вычисляем обратные матрицы к М1,М2,М3. П11. Находим произведение всех полученных матриц:

Ms=M1*M2*...*M7

П12. Проверяем на правильность результат: если при умножении исходных координат конечной точки В на единую матрицу преобразований результат отличается от исходных данных на 0,001, то точность достигнута и матрица верна. В противном случае рекомендуется еще раз пройти пункты П1-П11.

2.2. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ

Алгоритм нахождения единой матрицы преобразований для поворота изображения реализован в среде разработки Visual Studio 2013 на языке C#.

Для внешнего облика программы были использованы следующие компоненты и их свойства(рис.1):

Рис.1 Внешний вид программы

1. – textBox – представляет собой текстовое поле, в которое вносятся значения координат отрезка и угол поворота. Задействованные свойства:

- Text - меняет содержимое поля.

2. – ListBox – текстовой поле, позволяющее выводить большой объем данных. В программе необходимо для вывода результата расчетов.

3. – button – кнопка, при нажатии на которую происходит вычислительный процесс.

4,5,6 – radiobutton – кнопки, позволяющие выбрать только одно из значений. В программе служат для определения оси поворота.

В программе задействованы следующие переменные:

а – угол поворота.

двумерные массивы вещественных чисел О и В - координаты отрезка.

двумерный вещественный массив М1 - инцидентная матрица.

двумерные вещественные массивы М2,М3,М4 - матрицы поворота.

двумерные вещественные массивы М5,М6,М7 - обратные матрицы.

двумерный вещественный массив С - суперматрица.

В программе используются следующие процедуры и функции:

Комплекс процедур по нахождению обратных матриц методом алгебраических дополнений:

  • public static double[,] Inverse(double[,] matrix)

  • public static double Determinent(double[,] matrix)

  • public static double[,] AlgebraicComplement(double[,] matrix)

  • public static double[,] Multiply(double[,] matrix, double number)

  • public static double[,] Minor(double[,] matrix, int row, int column)

  • private static int Signum(int number)

  • public static double[,] Transpose(double[,] matrix)

Процедуры умножения матриц:

  • void MultB(double[,] K,double[,] L)

  • void MultAll(double [,] K,double [,] L)

Процедуры нахождения матриц поворота:

  • void MatrpZ(double co1, double si1)

  • void MatrpY(double co1, double si1)

  • void MatrpX(double co1,double si1)

Процедура нахождения инцидентной матрицы:

  • void Matr1()

Основные процедуры расчета в зависимости от исходных данных, включают в себя остальные подпрограммы: - void MatrX()

  • void MatrY()

  • void MatrZ()

Процедура нажатия кнопки:

  • private void button1_Click(object sender, EventArgs e)

2.3. ПРИМЕР

Для проверки работы программы решим один пример вручную, а потом программно и сравним результаты.

В качестве исходных данных используем

Отрезок: О(2 0 -1) - В(8 6 -8)

Ось:У

Угол равен 60 градусам.

1) Совместим начало ОВ с началом координат, воспользовавшись инцидентной матрицей М1:

1 0 0 0

0 1 0 0

0 0 1 0

-2 0 1 1

Умножим координаты начальной и конечной точки на М1:

Найдем матрицу М2, построив проекцию отрезка на одну из осей:

Гипотенуза = 9,2195, Sin = -0,7593, Cos=0,6508

Применим соответствующую матрицу поворота Ry и получим матрицу М2:

0,650 0 0,759 0

0 1 0 0

-0,759 0 0,65 0

0 0 0 1

Умножаем координаты конечной точки отрезка на М2 аналогично пункту выше и получаем:

(9,2 6 0,0002 1)

Чтобы совместить отрезок с осью ОУ вновь находим создаем проекцию и вычисляем :

Гипотенуза = 11,0003, Sin = 0,8381, Cos=0,5454

Применим соответствующую матрицу поворота Rz и получим матрицу М3:

0,5454 0,8381 0 0

-0,8381 0,5454 0 0

0 0 1 0

0 0 0 1

Составим матрицу поворота M4 относительно оси ОY на угол 60 градусов.

0,5 0 -0,866 0

0 1 0 0

0,866 0 0,5 0

0 0 0 1

Найдем обратные матрицы:

М5:

0,545 -0,83 0 0

0,84 0,545 0 0

0 0 1 0

0 0 0 1

М6:

0,65 0 -0,75 0

0 1 0 0

0,75 0 0,65 0

0 0 0 1

М7:

1 0 0 0

0 1 0 0

0 0 1 0

2 0 -1 1

Составим супер-матрицу Ms=M1*M2*...*M7:

0,6488 -0,4 -0,65 0

0,6998 0,6487 0,2988 0

0,2988 -0,65 0,7025 0

1,0012 0,1588 0,9943 1

Пример2.(программно)

Имеем те же исходные данные, записанные на форме в TextBox (рис.2):

Рис.2. Исходные данные для примера

Нажимаем кнопку "Рассчитать". В текстовом поле справа от таблицы вывелись все расчеты по нахождению единой матрицы преобразований с пояснениями (рис.3).

Рис.3. Промежуточные данные

И, наконец, мы получаем результат, выводимый внизу ListBox (рис.4):

Рис.4. Ответ задачи

Как мы видим, программа выдала тот же результат, что получили и мы при ручном расчете, следовательно, работает она верно. Также расчет осуществляется и для других осей: Х и Z. Расчетные данные заносятся в текстовый файл - textfile. txt.

ЗАКЛЮЧЕНИЕ

При составлении данной курсовой работы изучен алгоритм нахождения единой матрицы преобразований для поворота изображения относительно отрезка, рассмотрен метод Гауса для построения обратной матрицы, изучены методы записи информации в файл и изъятия данных из него в ListBox. Данная курсовая работа позволила расширить имеющийся запас знаний и дала навыки работы на языке программирования С # и с интерфейсом Visual Studio, позволила выявить пробелы, которые в дальнейшем планируется восполнить.

ЛИТЕРАТУРА

  1. А. Климов - "C#. Советы программистам"- Москва, издательство «ГелиосАРВ», 2005.

  2. Н. Культин - Microsoft Visual C# в задачах и примерах- Москва, издательство «Мир», 2008

  3. Окулов С. М. «Программирование в алгоритмах» - Санкт-Петербург, издательство «Диалект »,2002

  4. Р.Лафоре -" Объектно-ориентированное программирование в С++"– Москва: УРСС, 2006.

  5. http://ru.wikipedia.org/wiki

  6. http://mmorpgbb.ru/foegwoeg

ПРИЛОЖЕНИЯ

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using System.IO;

namespace kurs

{

public partial class Form1 : Form

{int a;

double[,] O = new double[1,4];

double[,] B = new double[1,4];

double[,] M1 = new double[4, 4];

double[,] M2 = new double[4, 4];

double[,] M3 = new double[4, 4];

double[,] M4 = new double[4, 4];

double[,] M5 = new double[4, 4];

double[,] C = new double[4, 4];

double[,] M6 = new double[4, 4];

double[,] M7 = new double[4, 4];

public Form1()

{

InitializeComponent();

}

//обратная матрица

public static double[,] Inverse(double[,] matrix)

{

var det = Determinent(matrix);

if (Math.Abs(det - 0) < 0.0000001)

throw new Exception("Если детерминант равен нулю, обратной матрицы не существует");

var algDopMatrix = AlgebraicComplement(matrix);

return Multiply(algDopMatrix, 1 / (double)det);

}

public static double Determinent(double[,] matrix)

{

var rowCount = matrix.GetLength(0);

var colCount = matrix.GetLength(1);

double result = 0;

if (rowCount != colCount)

throw new Exception("Детерминант не квадратной матрицы не существует");

if (rowCount == 1)

return matrix[0, 0];

for (int j = 0; j < colCount; j++)

result += (matrix[0, j] * Determinent(Minor(matrix, 0, j)) * Signum(j));

return result;

}

public static double[,] AlgebraicComplement(double[,] matrix)

{

var rowCount = matrix.GetLength(0);

var colCount = matrix.GetLength(1);

if (rowCount != colCount)

throw new Exception("Нужна квадратная матрица");

var result = new double[rowCount, colCount];

for (int i = 0; i < rowCount; i++)

for (int j = 0; j < colCount; j++)

result[i, j] = Signum(i + j) * Determinent(Minor(matrix, i, j));

result = Transpose(result);

return result;

}

public static double[,] Multiply(double[,] matrix, double number)

{

var rowCount = matrix.GetLength(0);

var colCount = matrix.GetLength(1);

var result = new double[rowCount, colCount];

for (var i = 0; i < rowCount; i++)

for (var j = 0; j < colCount; j++)

result[i, j] = matrix[i, j] * number;

return result;

}

public static double[,] Minor(double[,] matrix, int row, int column)

{

var rowCount = matrix.GetLength(0);

var colCount = matrix.GetLength(1);

var result = new double[rowCount - 1, colCount - 1];

var m = 0;

for (var i = 0; i < rowCount; i++)

{

if (i != row)

{

var n = 0;

for (var j = 0; j < colCount; j++)

{

if (j == column) continue;

result[m, n++] = matrix[i, j];

}

m++;

}

}

return result;

}

private static int Signum(int number)

{

return number % 2 == 0 ? 1 : -1;

}

public static double[,] Transpose(double[,] matrix)

{

var rowCount = matrix.GetLength(0);

var colCount = matrix.GetLength(1);

var transposeMatrix = new double[colCount, rowCount];

for (var i = 0; i < rowCount; i++)

for (var j = 0; j < colCount; j++)

transposeMatrix[i, j] = matrix[j, i];

return transposeMatrix;

}

//---------------------------------------------------------------------------------------

// Умножение вектора В на матрицы

void MultB(double[,] K,double[,] L)

{

double[,] Bn = new double[1, 4];

for (int i = 0; i < 1; i++)

for (int j = 0; j < 4; j++)

{

Bn[i, j] = 0;

for (int s = 0; s < 4; s++)

Bn[i, j] += K[i, s] * L[s, j];

}

for (int i = 0; i < 1; i++)

for (int j = 0; j < 4; j++)

B[i, j] = Bn[i, j];

}

//нахождение матрицы М1

void Matr1()

{

M1[0, 0] = 1; M1[0, 1] = 0; M1[0, 2] = 0; M1[0, 3] = 0;

M1[1, 0] = 0; M1[1, 1] = 1; M1[1, 2] = 0; M1[1, 3] = 0;

M1[2, 0] = 0; M1[2, 1] = 0; M1[2, 2] = 1; M1[2, 3] = 0;

M1[3, 0] = (-1) * O[0, 0]; M1[3, 1] = (-1) * O[0, 1]; M1[3, 2] = (-1) * O[0, 2]; M1[3, 3] = 1;

}

// нахождение матрицы по Х

void MatrpX(double co1,double si1)

{

M2[0, 0] = 1; M2[0, 1] = 0; M2[0, 2] = 0; M2[0, 3] = 0;

M2[1, 0] = 0; M2[1, 1] = co1; M2[1, 2] = si1; M2[1, 3] = 0;

M2[2, 0] = 0; M2[2, 1] = -si1; M2[2, 2] = co1; M2[2, 3] = 0;

M2[3, 0] = 0; M2[3, 1] = 0; M2[3, 2] = 0; M2[3, 3] = 1;

}

//нахождение матрицы по У

void MatrpY(double co1, double si1)

{

M3[0, 0] = co1; M3[0, 1] = 0; M3[0, 2] = -si1; M3[0, 3] = 0;

M3[1, 0] = 0; M3[1, 1] = 1; M3[1, 2] = 0; M3[1, 3] = 0;

M3[2, 0] = si1; M3[2, 1] = 0; M3[2, 2] = co1; M3[2, 3] = 0;

M3[3, 0] = 0; M3[3, 1] = 0; M3[3, 2] = 0; M3[3, 3] = 1;

}

// нахождение матрицы по Z

void MatrpZ(double co1, double si1)

{

M4[0, 0] = co1; M4[0, 1] = si1; M4[0, 2] = 0; M4[0, 3] = 0;

M4[1, 0] = -si1; M4[1, 1] = co1; M4[1, 2] = 0; M4[1, 3] = 0;

M4[2, 0] = 0; M4[2, 1] = 0; M4[2, 2] = 1; M4[2, 3] = 0;

M4[3, 0] = 0; M4[3, 1] = 0; M4[3, 2] = 0; M4[3, 3] = 1;

}

//умножение матриц

void MultAll(double [,] K,double [,] L)

{double[,] Bn = new double[4, 4];

for (int i = 0; i < 4; i++)

for (int j = 0; j < 4; j++)

{

Bn[i, j] = 0;

for (int s = 0; s < 4; s++)

Bn[i, j] += K[i, s] * L[s, j];

}

for (int i = 0; i < 4; i++)

for (int j = 0; j < 4; j++)

C[i, j] = Bn[i, j];

}

// процедура нахождения единой матрицы для оси Х

void MatrX()

{

System.IO.StreamWriter textFile = new System.IO.StreamWriter(@"textfile.txt");

textFile.WriteLine("Необходимо совместить начало отрезка с началом координат. Для этого умножим начало отрезка на инцидентную ему матрицу:");

Matr1();

for (int i = 0; i < 4; i++) {

for (int j = 0; j < 4; j++)

if (C[i, j] < 0) textFile.Write("{0,6} ", Convert.ToString(Math.Round(M1[i, j], 2)));

else textFile.Write("{0,6} ", Convert.ToString(Math.Round(M1[i, j], 4)));

textFile.WriteLine();

}

textFile.WriteLine("Умножив начальную точку О на М1, получим:");

textFile.WriteLine("0 0 0 1");

textFile.WriteLine("Умножив конечную точку В на М1, получим:");

M7 = Inverse(M1);

MultB(B,M1);

for (int i = 0; i < 1; i++)

for (int j = 0; j < 4; j++)

textFile.Write("{0,6} ",Convert.ToString(B[i,j]));

textFile.WriteLine();

textFile.WriteLine("Cовместить конец отрезка с плоскостями XOY (XOZ)");

double hip = Math.Round(Math.Sqrt(Math.Pow(B[0, 1], 2) + Math.Pow(B[0, 2], 2)),4);

double si = Math.Round(B[0, 1] / hip,4);

double co = Math.Round(B[0, 2] / hip,4);

textFile.WriteLine("Гипотенуза = {0,6}, Sin = {1,6}, Cos={2,6}", Convert.ToString(Math.Round(hip, 4)), Convert.ToString(Math.Round(si, 4)), Convert.ToString(Math.Round(co, 4)));

textFile.WriteLine("Применим соответствующую матрицу поворота Rx и получим матрицу М2:");

MatrpX(co,si);

for (int i = 0; i < 4; i++)

{

for (int j = 0; j < 4; j++)

if (C[i, j] < 0) textFile.Write("{0,6} ", Convert.ToString(Math.Round(M2[i, j], 2)));

else textFile.Write("{0,6} ", Convert.ToString(Math.Round(M2[i, j], 4)));

textFile.WriteLine();

}

M6 = Inverse(M2);

MultAll(M1, M2);

MultB(B,M2);

textFile.WriteLine("Умножив матрицу, соответствующую конечной точке на матрицу M2, получим:");

for (int i = 0; i < 1; i++)

for (int j = 0; j < 4; j++)

textFile.Write("{0,6} ", Convert.ToString(B[i, j]));

textFile.WriteLine();

textFile.WriteLine("Далее необходимо совместить отрезок с осью ОX");

hip = Math.Round(Math.Sqrt(Math.Pow(B[0, 0], 2) + Math.Pow(B[0, 2], 2)), 4);

si = Math.Round(B[0, 2] / hip, 4);

co = Math.Round(B[0, 0] / hip, 4);

textFile.WriteLine("Гипотенуза = {0,6}, Sin = {1,6}, Cos={2,6}", Convert.ToString(Math.Round(hip, 4)), Convert.ToString(Math.Round(si, 4)), Convert.ToString(Math.Round(co, 4)));

MatrpY(co, si);

textFile.WriteLine("Применим соответствующую матрицу поворота Ry и получим матрицу М3:");

for (int i = 0; i < 4; i++)

{

for (int j = 0; j < 4; j++)

if (C[i, j] < 0) textFile.Write("{0,6} ", Convert.ToString(Math.Round(M3[i, j], 2)));

else textFile.Write("{0,6} ", Convert.ToString(Math.Round(M3[i, j], 4)));

textFile.WriteLine();

}

textFile.WriteLine("Составим матрицу поворота M4 относительно оси ОX на угол {0,4} градусов.", a);

M5 = Inverse(M3);

MultAll(C, M3);

si=Math.Round(Math.Sin(Math.PI*a/180),4);

co = Math.Round(Math.Cos(Math.PI * a/180), 4);

MatrpX(co, si);

for (int i = 0; i < 4; i++)

{

for (int j = 0; j < 4; j++)

if (C[i, j] < 0) textFile.Write("{0,6} ", Convert.ToString(Math.Round(M2[i, j], 2)));

else textFile.Write("{0,6} ", Convert.ToString(Math.Round(M2[i, j], 4)));

textFile.WriteLine();

}

textFile.WriteLine("Найдем обратные матрицы:");

textFile.WriteLine("М5:");

for (int i = 0; i < 4; i++)

{

for (int j = 0; j < 4; j++)

if (C[i, j] < 0) textFile.Write("{0,6} ", Convert.ToString(Math.Round(M5[i, j], 2)));

else textFile.Write("{0,6} ", Convert.ToString(Math.Round(M5[i, j], 4)));

textFile.WriteLine();

}

textFile.WriteLine("М6:");

for (int i = 0; i < 4; i++)

{

for (int j = 0; j < 4; j++)

if (C[i, j] < 0) textFile.Write("{0,6} ", Convert.ToString(Math.Round(M6[i, j], 2)));

else textFile.Write("{0,6} ", Convert.ToString(Math.Round(M6[i, j], 4)));

textFile.WriteLine();

}

textFile.WriteLine("М7:");

for (int i = 0; i < 4; i++)

{

for (int j = 0; j < 4; j++)

if (C[i, j] < 0) textFile.Write("{0,6} ", Convert.ToString(Math.Round(M7[i, j], 2)));

else textFile.Write("{0,6} ", Convert.ToString(Math.Round(M7[i, j], 4)));

textFile.WriteLine();

}

textFile.WriteLine("Составим супер-матрицу Ms=M1*M2*...*M7:");

MultAll(C, M2);

MultAll(C, M5);

MultAll(C, M6);

MultAll(C, M7);

for (int i = 0; i < 4; i++)

{

for (int j = 0; j < 4; j++)

if (C[i, j] < 0) textFile.Write("{0,6} ", Convert.ToString(Math.Round(C[i, j], 2)));

else textFile.Write("{0,6} ", Convert.ToString(Math.Round(C[i, j],4)));

textFile.WriteLine();

}

textFile.Close();

StreamReader sr = new StreamReader("textfile.txt");

string line;

while ((line = sr.ReadLine()) != null)

{

listBox1.Items.Add(line);

}

}

// процедура нахождения единой матрицы для оси Y

void MatrY()

{

System.IO.StreamWriter textFile = new System.IO.StreamWriter(@"textfile.txt");

textFile.WriteLine("Необходимо совместить начало отрезка с началом координат. Для этого умножим начало отрезка на инцидентную ему матрицу:");

Matr1();

for (int i = 0; i < 4; i++)

{

for (int j = 0; j < 4; j++)

if (C[i, j] < 0) textFile.Write("{0,6} ", Convert.ToString(Math.Round(M1[i, j], 2)));

else textFile.Write("{0,6} ", Convert.ToString(Math.Round(M1[i, j], 4)));

textFile.WriteLine();

}

textFile.WriteLine("Умножив начальную точку О на М1, получим:");

textFile.WriteLine("0 0 0 1");

textFile.WriteLine("Умножив конечную точку В на М1, получим:");

M7 = Inverse(M1);

MultB(B, M1);

for (int i = 0; i < 1; i++)

for (int j = 0; j < 4; j++)

textFile.Write("{0,6} ", Convert.ToString(B[i, j]));

textFile.WriteLine();

textFile.WriteLine("Cовместить конец отрезка с плоскостями YOX (YOZ)");

double hip = Math.Round(Math.Sqrt(Math.Pow(B[0, 0], 2) + Math.Pow(B[0, 2], 2)), 4);

double si = Math.Round(B[0, 2] / hip, 4);

double co = Math.Round(B[0, 0] / hip, 4);

textFile.WriteLine("Гипотенуза = {0,6}, Sin = {1,6}, Cos={2,6}", Convert.ToString(Math.Round(hip, 4)), Convert.ToString(Math.Round(si, 4)), Convert.ToString(Math.Round(co, 4)));

textFile.WriteLine("Применим соответствующую матрицу поворота Ry и получим матрицу М2:");

MatrpY(co, si);

for (int i = 0; i < 4; i++)

{

for (int j = 0; j < 4; j++)

if (C[i, j] < 0) textFile.Write("{0,6} ", Convert.ToString(Math.Round(M3[i, j], 2)));

else textFile.Write("{0,6} ", Convert.ToString(Math.Round(M3[i, j], 4)));

textFile.WriteLine();

}

M6 = Inverse(M3);

MultAll(M1, M3);

MultB(B, M3);

textFile.WriteLine("Умножив матрицу, соответствующую конечной точке на матрицу M2, получим:");

for (int i = 0; i < 1; i++)

for (int j = 0; j < 4; j++)

textFile.Write("{0,6} ", Convert.ToString(B[i, j]));

textFile.WriteLine();

textFile.WriteLine("Далее необходимо совместить отрезок с осью ОY");

hip = Math.Round(Math.Sqrt(Math.Pow(B[0, 0], 2) + Math.Pow(B[0, 1], 2)), 4);

si = Math.Round(B[0, 0] / hip, 4);

co = Math.Round(B[0, 1] / hip, 4);

textFile.WriteLine("Гипотенуза = {0,6}, Sin = {1,6}, Cos={2,6}", Convert.ToString(Math.Round(hip, 4)), Convert.ToString(Math.Round(si, 4)), Convert.ToString(Math.Round(co, 4)));

MatrpZ(co, si);

textFile.WriteLine("Применим соответствующую матрицу поворота Rz и получим матрицу М3:");

for (int i = 0; i < 4; i++)

{

for (int j = 0; j < 4; j++)

if (C[i, j] < 0) textFile.Write("{0,6} ", Convert.ToString(Math.Round(M4[i, j], 2)));

else textFile.Write("{0,6} ", Convert.ToString(Math.Round(M4[i, j], 4)));

textFile.WriteLine();

}

textFile.WriteLine("Составим матрицу поворота M4 относительно оси ОY на угол {0,4} градусов.", a);

M5 = Inverse(M4);

MultB(B, M4);

MultAll(C, M4);

si = Math.Round(Math.Sin(Math.PI * a / 180), 4);

co = Math.Round(Math.Cos(Math.PI * a / 180), 4);

MatrpY(co, si);

MultAll(C, M3);

for (int i = 0; i < 4; i++)

{

for (int j = 0; j < 4; j++)

if (C[i, j] < 0) textFile.Write("{0,6} ", Convert.ToString(Math.Round(M3[i, j], 2)));

else textFile.Write("{0,6} ", Convert.ToString(Math.Round(M3[i, j], 4)));

textFile.WriteLine();

}

textFile.WriteLine("Найдем обратные матрицы:");

textFile.WriteLine("М5:");

for (int i = 0; i < 4; i++)

{

for (int j = 0; j < 4; j++)

if (C[i, j] < 0) textFile.Write("{0,6} ", Convert.ToString(Math.Round(M5[i, j], 2)));

else textFile.Write("{0,6} ", Convert.ToString(Math.Round(M5[i, j], 4)));

textFile.WriteLine();

}

textFile.WriteLine("М6:");

for (int i = 0; i < 4; i++)

{

for (int j = 0; j < 4; j++)

if (C[i, j] < 0) textFile.Write("{0,6} ", Convert.ToString(Math.Round(M6[i, j], 2)));

else textFile.Write("{0,6} ", Convert.ToString(Math.Round(M6[i, j], 4)));

textFile.WriteLine();

}

textFile.WriteLine("М7:");

for (int i = 0; i < 4; i++)

{

for (int j = 0; j < 4; j++)

if (C[i, j] < 0) textFile.Write("{0,6} ", Convert.ToString(Math.Round(M7[i, j], 2)));

else textFile.Write("{0,6} ", Convert.ToString(Math.Round(M7[i, j], 4)));

textFile.WriteLine();

}

textFile.WriteLine("Составим супер-матрицу Ms=M1*M2*...*M7:");

MultAll(C, M5);

MultAll(C, M6);

MultAll(C, M7);

for (int i = 0; i < 4; i++)

{

for (int j = 0; j < 4; j++)

if (C[i, j] < 0) textFile.Write("{0,6} ", Convert.ToString(Math.Round(C[i, j], 2)));

else textFile.Write("{0,6} ", Convert.ToString(Math.Round(C[i, j], 4)));

textFile.WriteLine();

}

textFile.Close();

StreamReader sr = new StreamReader("textfile.txt");

string line;

while ((line = sr.ReadLine()) != null)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]