ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
ПРОГРАММНАЯ РЕАЛИЗАЦИЯ
Алгоритм был реализован в среде разработки MS Visual Studio 2008, в виду наличия хороших библиотек для работы с графикой. Программа была реализована как приложение Windows Forms. А её дизайн был выполнен в интуитивно понятном стиле, с применением таких компонентов среды разработки, как: · tabControl – элемент управления, который используется для отображения нескольких вкладок, аналогичных разделителям в записной книжке (в данном случае элемент использовался для разделения областей расчёта и построения графика); · textbox – текстовое поле для приёма данных (например, для ввода координат и величины угла вращения); · radioButton – элемент управления, обеспечивающий выбор из двух или более взаимоисключающих вариантов (в данном случае для выбора основной оси для расчёта); · listBox – элемент управления, отображающий список элементов, в котором можно выбрать один или несколько элементов (используется в программе для вывода результата вычислений); · button – элемент управления, позволяющий взаимодействовать с программой; · pictureBox – элемент управления, позволяющий отображать графику (в данном случае – отображать график); · label – элемент – заметка, позволяющий давать краткое пояснение к другим элементам.
Ниже приведены скриншоты интерфейса программы.
Рисунок 1-расчётная область Рисунок 2-Область графического отображения ПРИМЕР 1
Для проверки правильности работы программной реализации алгоритма необходимо решить пример вручную, решить его в программе, затем сравнить результат. В качестве исходных данных используются:
Далее, повернем отрезок так, чтобы он совпал с осью OX. Для этого повернем его два раза – сначала так, чтобы он совпал с плоскостью XOZ, а затем так, чтобы он совпал с плоскостью XOY. Для первого поворота необходимо найти синус и косинус угла, выводимые из следующих отношений: Y β Теперь умножим матрицу, соответствующую конечной точке на вычисленную матрицу и получим координату отрезка после поворота. Проводя аналогичные вычисления, совместим отрезок с осью OX, вращая его вокруг OY: z
Составим матрицу поворота вокруг оси 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];
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); }
} }
Не нашли, что искали? Воспользуйтесь поиском:
|