Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчёт_АОСКГ.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
210.26 Кб
Скачать

2.4.Пример 2

Программное решение примера с теми же исходными данными.

Введя имеющиеся данные на форму, нажимаем кнопку «Рассчитать». После этого получаем промежуточные данные и ответ (рис.3).

Рисунок 3-Программный расчет

Далее переходим на вкладку «Чертёж», вводим данные (координаты трех точек треугольника и угол), после чего нажимаем кнопку «Построить». Получаем отображение графика в элементе управления pictureBox (рис.4).

Рисунок 4-Вывод графика

Далее, введя желаемый угол и нажав кнопку «Повернуть», получаем результат поворота (рис.5).

Рисунок 5

Сравнивая результаты двух решений, можно сказать, что программный комплекс составлен верно.

Заключение

Данная работа послужила хорошим поводом для расширения сферы знаний в области как компьютерной графики, так и математики. В процессе ее выполнения был хорошо освоен новый материал и закреплены знания, полученные ранее. Предполагается использование полученных навыков в дальнейшем.

Литература

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

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

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

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

  5. Сайт http://ru.wikipedia.org/wiki

Приложение а

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO;

namespace kurs

{

public partial class Form1 : Form

{int a;

double[,] result;

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[,] M6 = new double[4, 4];

double[,] M7 = new double[4, 4]; double[,] SM = 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("Необходимо совместить начало отрезка с началом координат.");

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*M3*M4*M5*M6*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;

listBox1.Items.Clear();

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

{

listBox1.Items.Add(line);

}

textFile.Close();

sr.Close();

}

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

void MatrY()

{

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

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

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*M3*M4*M5*M6*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;

listBox1.Items.Clear();

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

{

listBox1.Items.Add(line);

}

textFile.Close();

sr.Close();

}

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

void MatrZ()

{

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

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

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,5} ", Convert.ToString(Math.Round(M1[i, j], 2)));

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

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овместить конец отрезка с плоскостями ZOX (ZOY)");

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

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

double 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 и получим матрицу М2:");

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

{

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

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

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

textFile.WriteLine();

}

M6 = Inverse(M4);

MultAll(M1, M4);

MultB(B, M4);

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("Далее необходимо совместить отрезок с осью ОZ");

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

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

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)));

MatrpX(co, si);

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

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

{

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

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

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

textFile.WriteLine();

}

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

M5 = Inverse(M2);

MultB(B, M2);

MultAll(C, M2);

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

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

MatrpZ(co, si);

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

{

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

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

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

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,5} ", Convert.ToString(Math.Round(M5[i, j], 2)));

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

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,4} ", Convert.ToString(Math.Round(M6[i, j], 2)));

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

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,4} ", Convert.ToString(Math.Round(M7[i, j], 2)));

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

textFile.WriteLine();

}

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

MultAll(C, M4);

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,4} ", Convert.ToString(Math.Round(C[i, j], 2)));

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

textFile.WriteLine();

}

textFile.Close();

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

string line;

listBox1.Items.Clear();

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

{

listBox1.Items.Add(line);

}

textFile.Close();

sr.Close();

}

// основная процедура

private void button1_Click(object sender, EventArgs e)

{

textBox17.Text = textBox8.Text;

O[0,0] = Convert.ToInt16(textBox1.Text,10);

O[0, 1] = Convert.ToInt16(textBox2.Text, 10);

O[0, 2] = Convert.ToInt16(textBox3.Text, 10);

O[0, 3] = 1;

B[0, 0] = Convert.ToInt16(textBox4.Text, 10);

B[0, 1] = Convert.ToInt16(textBox5.Text, 10);

B[0, 2] = Convert.ToInt16(textBox6.Text, 10);

B[0, 3] = 1;

if (radioButton1.Checked)

{

a = Convert.ToInt16(textBox8.Text, 10);

MatrX();

}

else if (radioButton2.Checked) { a = Convert.ToInt16(textBox8.Text, 10); MatrY(); }

else if (radioButton3.Checked) { a = Convert.ToInt16(textBox8.Text, 10); MatrZ(); }

else if (radioButton4.Checked) { a = -Convert.ToInt16(textBox8.Text, 10); MatrZ(); }

else if (radioButton5.Checked) { a = -Convert.ToInt16(textBox8.Text, 10); MatrY(); }

else if (radioButton6.Checked) { a = -Convert.ToInt16(textBox8.Text, 10); MatrX(); }

}

private void button2_Click(object sender, EventArgs e)

{

label15.Visible = true;

label16.Visible = true;

label17.Visible = true;

Pen myPen = new Pen(Color.Black, 1);

Pen pen = new Pen(Color.Green, 1);

Graphics formGraphics1 = pictureBox1.CreateGraphics();

formGraphics1.Clear(pictureBox1.BackColor);

pictureBox1.Update();

Point py1 = new Point(251, 20);

Point py2 = new Point(251, 481);

Point px1 = new Point(20, 251);

Point px2 = new Point(481, 251);

Point pz1 = new Point(482, 20);

Point pz2 = new Point(20, 482);

Point paa = new Point(251 + Convert.ToInt16(textBox1.Text) * 10 - Convert.ToInt16(textBox3.Text) * 10, 251 - Convert.ToInt16(textBox2.Text) * 10 + Convert.ToInt16(textBox3.Text) * 10);

Point pbb = new Point(251 + Convert.ToInt16(textBox4.Text) * 10 - Convert.ToInt16(textBox6.Text) * 10, 251 - Convert.ToInt16(textBox5.Text) * 10 + Convert.ToInt16(textBox6.Text) * 10);

formGraphics1.DrawLine(myPen, py1, py2);

formGraphics1.DrawLine(myPen, px1, px2);

formGraphics1.DrawLine(myPen, pz1, pz2);

formGraphics1.DrawLine(myPen, paa, pbb);

Point pa = new Point(251 + Convert.ToInt16(textBox7.Text) * 10 - Convert.ToInt16(textBox10.Text) * 10, 251 - Convert.ToInt16(textBox9.Text) * 10 + Convert.ToInt16(textBox10.Text) * 10);

Point pb = new Point(251 + Convert.ToInt16(textBox11.Text) * 10 - Convert.ToInt16(textBox13.Text) * 10, 251 - Convert.ToInt16(textBox12.Text) * 10 + Convert.ToInt16(textBox13.Text) * 10);

Point pc = new Point(251 + Convert.ToInt16(textBox14.Text) * 10 - Convert.ToInt16(textBox16.Text) * 10, 251 - Convert.ToInt16(textBox15.Text) * 10 + Convert.ToInt16(textBox16.Text) * 10);

formGraphics1.DrawLine(pen, pa, pb);

formGraphics1.DrawLine(pen, pb, pc);

formGraphics1.DrawLine(pen, pc, pa);

}

void Multiplication(double[,] a, double[,] b)

{

r = new double[a.GetLength(0), b.GetLength(1)];

for (int i = 0; i < a.GetLength(0); i++)

{

for (int j = 0; j < b.GetLength(1); j++)

{

for (int k = 0; k < b.GetLength(0); k++)

{

r[i, j] += a[i, k] * b[k, j];

}

}

}

}

public void drawAxes()

{

Pen myPen = new Pen(Color.Black, 1);

Pen pen = new Pen(Color.Green, 1);

Graphics formGraphics1 = pictureBox1.CreateGraphics();

formGraphics1.Clear(pictureBox1.BackColor);

pictureBox1.Update();

Point py1 = new Point(251, 20);

Point py2 = new Point(251, 481);

Point px1 = new Point(20, 251);

Point px2 = new Point(481, 251);

Point pz1 = new Point(482, 20);

Point pz2 = new Point(20, 482);

formGraphics1.DrawLine(myPen, py1, py2);

formGraphics1.DrawLine(myPen, px1, px2);

formGraphics1.DrawLine(myPen, pz1, pz2);

}

private void button3_Click(object sender, EventArgs e)

{

textBox8.Text = textBox17.Text;

button1_Click(sender, e);

Graphics gr = pictureBox1.CreateGraphics();

Pen p = new Pen(Color.Red, 1);

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

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

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

triangle1[0, 0] = Convert.ToDouble(textBox7.Text);

triangle1[0, 1] = Convert.ToDouble(textBox9.Text);

triangle1[0, 2] = Convert.ToDouble(textBox10.Text);

triangle1[0, 3] = 1;

Multiplication(triangle1, C);

Point p1 = new Point(251 + Convert.ToInt32(r[0, 0]) * 10 - (Convert.ToInt32(r[0, 2])) * 10, 251 - Convert.ToInt32((r[0, 1])) * 10 + (Convert.ToInt32(r[0, 2])) * 10);

triangle2[0, 0] = Convert.ToDouble(textBox11.Text);

triangle2[0, 1] = Convert.ToDouble(textBox12.Text);

triangle2[0, 2] = Convert.ToDouble(textBox13.Text);

triangle2[0, 3] = 1;

Multiplication(triangle2, C);

Point p2 = new Point(251 + Convert.ToInt32(r[0, 0]) * 10 - (Convert.ToInt32(r[0, 2])) * 10, 251 - Convert.ToInt32(r[0, 1]) * 10 + (Convert.ToInt32(r[0, 2])) * 10);

triangle3[0, 0] = Convert.ToDouble(textBox14.Text);

triangle3[0, 1] = Convert.ToDouble(textBox15.Text);

triangle3[0, 2] = Convert.ToDouble(textBox16.Text);

triangle2[0, 3] = 1;

Multiplication(triangle3, C);

Point p3 = new Point(251 + Convert.ToInt32(r[0, 0]) * 10 - (Convert.ToInt32(r[0, 2])) * 10, 251 - Convert.ToInt32(r[0, 1]) * 10 + (Convert.ToInt32(r[0, 2])) * 10);

gr.DrawLine(p, p1, p2);

gr.DrawLine(p, p2, p3);

gr.DrawLine(p, p3, p1);

}

}

}