Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






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




 

Алгоритм был реализован в среде разработки MS Visual Studio 2008, в виду наличия хороших библиотек для работы с графикой.

Программа была реализована как приложение Windows Forms. А её дизайн был выполнен в интуитивно понятном стиле, с применением таких компонентов среды разработки, как:

· tabControl – элемент управления, который используется для отображения нескольких вкладок, аналогичных разделителям в записной книжке (в данном случае элемент использовался для разделения областей расчёта и построения графика);

· textbox – текстовое поле для приёма данных (например, для ввода координат и величины угла вращения);

· radioButton – элемент управления, обеспечивающий выбор из двух или более взаимоисключающих вариантов (в данном случае для выбора основной оси для расчёта);

· listBox – элемент управления, отображающий список элементов, в котором можно выбрать один или несколько элементов (используется в программе для вывода результата вычислений);

· button – элемент управления, позволяющий взаимодействовать с программой;

· pictureBox – элемент управления, позволяющий отображать графику (в данном случае – отображать график);

· label – элемент – заметка, позволяющий давать краткое пояснение к другим элементам.

 

Ниже приведены скриншоты интерфейса программы.


 

Рисунок 1-расчётная область

Рисунок 2-Область графического отображения

ПРИМЕР 1

 

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

В качестве исходных данных используются:
Отрезок (2;3;1;)-(6;9;4)
Ось OX
Угол 30°


Переместим отрезок в начало координат, умножив его на инцидентную матрицу .
Получим новые координаты отрезка: (0;0;0;1)-(4;6;3;1).

Далее, повернем отрезок так, чтобы он совпал с осью OX. Для этого повернем его два раза – сначала так, чтобы он совпал с плоскостью XOZ, а затем так, чтобы он совпал с плоскостью XOY.

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

Y

β
O
3 Z



Теперь умножим матрицу, соответствующую конечной точке на вычисленную матрицу и получим координату отрезка после поворота.
.

Проводя аналогичные вычисления, совместим отрезок с осью OX, вращая его вокруг OY:

z
6.7


β
0 4 x





Умножив эту матрицу на конец отрезка, получим новое его положение:

 

Составим матрицу поворота вокруг оси OX на 30°.

 

.

Составим матрицы M5, M6, M7 обратные M3, M2, M1 соответственно.

 

Составим супер-матрицу, равную произведению M1*M2*M3*M4*M5*M6*M7:

Для поворота любой точки необходимо умножить матрицу, соответствующую данной точке на супер-матрицу.

ПРИМЕР 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);

}

 

}

}

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных