2.4.Пример 2
Программное решение примера с теми же исходными данными.
Введя имеющиеся данные на форму, нажимаем кнопку «Рассчитать». После этого получаем промежуточные данные и ответ (рис.3).
Рисунок 3-Программный расчет
Далее переходим на вкладку «Чертёж», вводим данные (координаты трех точек треугольника и угол), после чего нажимаем кнопку «Построить». Получаем отображение графика в элементе управления pictureBox (рис.4).
Рисунок 4-Вывод графика
Далее, введя желаемый угол и нажав кнопку «Повернуть», получаем результат поворота (рис.5).
Рисунок 5
Сравнивая результаты двух решений, можно сказать, что программный комплекс составлен верно.
Заключение
Данная работа послужила хорошим поводом для расширения сферы знаний в области как компьютерной графики, так и математики. В процессе ее выполнения был хорошо освоен новый материал и закреплены знания, полученные ранее. Предполагается использование полученных навыков в дальнейшем.
Литература
А. Климов - "C#. Советы программистам"- Москва, издательство «ГелиосАРВ», 2005.
Н. Культин - Microsoft Visual C# в задачах и примерах- Москва, издательство «Мир», 2008
Окулов С. М. «Программирование в алгоритмах» - Санкт-Петербург, издательство «Диалект »,2002
Р.Лафоре -" Объектно-ориентированное программирование в С++"– Москва: УРСС, 2006.
Сайт 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);
}
}
}
