Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...
Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...
Топ:
Отражение на счетах бухгалтерского учета процесса приобретения: Процесс заготовления представляет систему экономических событий, включающих приобретение организацией у поставщиков сырья...
Выпускная квалификационная работа: Основная часть ВКР, как правило, состоит из двух-трех глав, каждая из которых, в свою очередь...
Особенности труда и отдыха в условиях низких температур: К работам при низких температурах на открытом воздухе и в не отапливаемых помещениях допускаются лица не моложе 18 лет, прошедшие...
Интересное:
Инженерная защита территорий, зданий и сооружений от опасных геологических процессов: Изучение оползневых явлений, оценка устойчивости склонов и проектирование противооползневых сооружений — актуальнейшие задачи, стоящие перед отечественными...
Принципы управления денежными потоками: одним из методов контроля за состоянием денежной наличности является...
Мероприятия для защиты от морозного пучения грунтов: Инженерная защита от морозного (криогенного) пучения грунтов необходима для легких малоэтажных зданий и других сооружений...
Дисциплины:
2021-04-19 | 62 |
5.00
из
|
Заказать работу |
|
|
Рис.1. Созданные пользовательские компоненты
Рис.2. Конструктор компоненты.
Рис.3. Компонента на форме.
Рис.4. Ввод значений.
Рис.5. Результат работы программы.
Рис.6. Содержание текстового файла.
Исходный текст программы.
Компонента.
MatrixCalc
{partial class matrixCalc: UserControl
{loaded = false;texFont;сheck = false;static List<matrix> matrixList;//Список матрицstatic Mode operationMode = Mode.Default;//текущая операцияstatic Point resolution = new Point(200, 200);//размерность x и ydouble det;matrixCalc()
{();
}void matrixCalc_Load(object sender, EventArgs e)
{= null;= null;= Mode.Default;= true;
}void glControl1_Load(object sender, EventArgs e)
{= true;
}void glControl1_Resize(object sender, EventArgs e)
{(!loaded);
}void обратнаяToolStripMenuItem_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{= new List<matrix>();
сheck = false;= Mode.Invert;
}void транспонированиеToolStripMenuItem_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{= new List<matrix>();
сheck = false;= Mode.Transpose;
}void определительToolStripMenuItem_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{= new List<matrix>();
сheck = false;= Mode.Determinant;
}void умножениеToolStripMenuItem_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{= new List<matrix>();
сheck = false;= Mode.Multiplication;
}void сложениеToolStripMenuItem_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{= new List<matrix>();
сheck = false;= Mode.Addition;
}void вычитаниеToolStripMenuItem_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{= new List<matrix>();
сheck = false;= Mode.Substraction;
}void однаМатрицаToolStripMenuItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
{();mtxCalc = this;f = new Form3(mtxCalc);.ShowDialog();
}void двеМатрицыToolStripMenuItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
{();mtxCalc = this;f = new Form1(mtxCalc);.ShowDialog();
}void glControlSetting()
{= true;(glControl1);//настраиваем шрифты и opengl= fontSetting(glControl1);.ClearColor(Color.SkyBlue);//Заливка по умолчанию
}void matrixCalc_SizeChanged(object sender, EventArgs e)
{.Width = this.Width;.Height = this.Height - 24;(matrixList!=null)
{.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);(texFont, matrixList[0].mtx);(operationMode!= Mode.Determinant)
{(texFont, matrixList[0].mtx, matrixList[1].mtx);
|
}.SwapBuffers();
}
}void saveAsTxt()
{data = new dataOperations();sfd = new SaveFileDialog();.DefaultExt = "txt";.Filter = "Matrix textfile|*.txt";.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);(matrixList == null)
{.Show("Матрицы не были введены");;
}(sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{.saveAllMatrixTxt(sfd.FileName);(texFont, matrixList[0].mtx);(operationMode!= Mode.Determinant)
{(texFont, matrixList[0].mtx, matrixList[1].mtx);
}.SwapBuffers();
}
}void saveAsMtx()
{data = new dataOperations();sfd = new SaveFileDialog();.DefaultExt = "mtx";.Filter = "Matrix file|*.mtx";.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);(matrixList == null)
{.Show("Матрицы не были введены");;
}(sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{.saveAllMatrixMtx(sfd.FileName);(texFont, matrixList[0].mtx);(operationMode!= Mode.Determinant)
{(texFont, matrixList[0].mtx, matrixList[1].mtx);
}.SwapBuffers();
}
}void openFile()
{data = new dataOperations();();od = new OpenFileDialog();.Filter = "Matrix file|*.mtx|Matrix textfile|*.txt";.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);(od.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{p = od.FileName;type = Path.GetExtension(p);(type == ".mtx")
{.readAllMatrixMtx(od.FileName);
}(type == ".txt")
{.readAllMatrixTxt(od.FileName);
}(texFont, matrixList[0].mtx);(operationMode!= Mode.Determinant)
{(texFont, matrixList[0].mtx, matrixList[1].mtx);
}.SwapBuffers();
}
}void glControl1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{mtxCalc = this;
сheck = false;worldCoords = convertScreenToWorldCoords(e.X, e.Y);.Y = (resolution.Y - worldCoords.Y);(e.Button == MouseButtons.Right && matrixList!=null)
{(matrixList.Count > 0 && matrixList[0].Contains(worldCoords,30,13)==true)
{(operationMode)//Операции
{Mode.Invert:Mode.Transpose:Mode.Determinant:f3 = new Form3(mtxCalc);.ShowDialog();;Mode.Addition:Mode.Substraction:Mode.Multiplication:f1 = new Form1(mtxCalc);.ShowDialog();;
}
}
}
}void glControl1_Paint(object sender, PaintEventArgs e)
{(matrixList!= null)
{.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);//очищаем поверхность(texFont, matrixList[0].mtx);(operationMode!= Mode.Determinant)
{(texFont, matrixList[0].mtx, matrixList[1].mtx);
}.SwapBuffers();
}
}TextureFont fontSetting(GLControl glControl1)//Для настройки поверхности опегл и шрифтов
{.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);//очищаем поверхность.MatrixMode(MatrixMode.Modelview);.LoadIdentity();
// Настраиваем опенгл для текстуры.InitTexturing();
//Загружаем текстуру со шрифтами
int tex = TexUtil.CreateTextureFromFile(Application.StartupPath + @"\" + "font1.png");
// Создаем объект TextureFont из загруженной текстуры
TextureFont texFont = new TextureFont(tex);texFont;
}static Point convertScreenToWorldCoords(int x, int y)
{[] viewport = new int[4];modelViewMatrix, projectionMatrix;.GetFloat(GetPName.ModelviewMatrix, out modelViewMatrix);.GetFloat(GetPName.ProjectionMatrix, out projectionMatrix);.GetInteger(GetPName.Viewport, viewport);mouse;.X = x;.Y = y;vector = UnProject(ref projectionMatrix, modelViewMatrix, new Size(viewport[2], viewport[3]), mouse);coords = new Point((int)vector.X, (int)vector.Y);coords;
|
}static Vector4 UnProject(ref Matrix4 projection, Matrix4 view, Size viewport, Vector2 mouse)
{vec;.X = 2.0f * mouse.X / (float)viewport.Width - 1;.Y = 2.0f * mouse.Y / (float)viewport.Height - 1;.Z = 0;.W = 1.0f;viewInv = Matrix4.Invert(view);projInv = Matrix4.Invert(projection);.Transform(ref vec, ref projInv, out vec);.Transform(ref vec, ref viewInv, out vec);(vec.W > float.Epsilon || vec.W < float.Epsilon)
{.X /= vec.W;.Y /= vec.W;.Z /= vec.W;
}vec;
}void drawAllMatrix(TextureFont texFont, double[,] mtx)//для рисования матриц(обратная, определитель, транспонирование)
{font = 20;//размер шрифтаm = matrixList[0].rowCount;//Кол-во строк= new Point(200, 200);(operationMode)
{Mode.Invert:(m > 3)
{.X = m * 60 + 17;.Y = m * 60 + 17;
}
{= new Point(210, 210);
}(сheck == false)
{matrixI = new matrix(matrixOperations.Inverse(mtx).GetLength(0), matrixOperations.Inverse(mtx).GetLength(1));.mtx = matrixOperations.Inverse(mtx);.Add(matrixI);
}.LoadIdentity();.Ortho(0, resolution.X, resolution.Y, 0, -1, 1);.Viewport(0, 0, glControl1.Width, glControl1.Height);[0].Draw("A=",30, 13, texFont, resolution);[1].Draw("A^(-1)=",45, matrixList[0].size.Y + 27, texFont, resolution);;Mode.Transpose:(сheck == false)
{matrixT = new matrix(matrixOperations.Transpose(mtx).GetLength(0), matrixOperations.Transpose(mtx).GetLength(1));.mtx = matrixOperations.Transpose(mtx);.Add(matrixT);
}n = matrixList[0].columnCount;m1 = matrixList[1].rowCount;n1 = matrixList[1].columnCount;(m > 2 || n > 2)
{(n > n1)
{.X = n * 55;
}
{.X = n1 * 55;
}
}.Y = m * 25 + m1 * 25 + 60;.LoadIdentity();.Ortho(0, resolution.X, resolution.Y, 0, -1, 1);.Viewport(0, 0, glControl1.Width, glControl1.Height);[0].Draw("A=",30, 13, texFont, resolution);[1].Draw("AT=",40, matrixList[0].size.Y +27,texFont, resolution);;Mode.Determinant:(сheck == false)
{= matrixOperations.Determinent(mtx);
}(m > 3)
{.X = m * 60;.Y = m * 30 + 40;
}
{= new Point(200, 200);
}.LoadIdentity();.Ortho(0, resolution.X, resolution.Y, 0, -1, 1);.Viewport(0, 0, glControl1.Width, glControl1.Height);[0].Draw("A=",30, 13, texFont, resolution);.WriteStringAt("detA=", font, 18, resolution.Y - matrixList[0].size.Y -25, 0, resolution);.WriteStringAt(Convert.ToString(det), font, 60, resolution.Y - matrixList[0].size.Y - 25, 0, resolution);;
}
сheck = true;
}void drawAllMatrix(TextureFont texFont, double[,] mtx1, double[,] mtx2)//для рисования матриц(умножение, сложение, вычитание)
{(operationMode)
{Mode.Multiplication:("A*B=", texFont, mtx1, mtx2);;Mode.Addition:("A+B=", texFont, mtx1, mtx2);;Mode.Substraction:("A-B=", texFont, mtx1, mtx2);;
}
}void drawOperation(string operation, TextureFont texFont, double[,] mtx1, double[,] mtx2)//для метода выше
{font = 20;//размер шрифта= new Point(200, 200);(сheck == false)
{(operationMode)
{Mode.Multiplication:matrixM = new matrix(matrixOperations.multiplication(mtx1, mtx2).GetLength(0), matrixOperations.multiplication(mtx1, mtx2).GetLength(1));.mtx = matrixOperations.multiplication(mtx1, mtx2);.Add(matrixM);;Mode.Addition:matrixA = new matrix(matrixOperations.addition(mtx1, mtx2).GetLength(0), matrixOperations.addition(mtx1, mtx2).GetLength(1));.mtx = matrixOperations.addition(mtx1, mtx2);.Add(matrixA);;Mode.Substraction:matrixS = new matrix(matrixOperations.subtraction(mtx1, mtx2).GetLength(0), matrixOperations.subtraction(mtx1, mtx2).GetLength(1));.mtx = matrixOperations.subtraction(mtx1, mtx2);.Add(matrixS);;
}
}m = matrixList[0].rowCount;m1 = matrixList[2].rowCount;n1 = matrixList[0].columnCount;n2 = matrixList[1].columnCount;m3 = matrixList[2].rowCount;.X = n1 * 55 + n2 * 55 + 30;.Y = 25 * (m1 + m3) + 60;.LoadIdentity();.Ortho(0, resolution.X, resolution.Y, 0, -1, 1);.Viewport(0, 2, glControl1.Width, glControl1.Height);[0].Draw("A=",30, 13,texFont,resolution);[1].Draw("B=", matrixList[0].size.X + 60,13, texFont, resolution);[2].Draw(operation,30, matrixList[0].size.Y +25, texFont, resolution);
|
сheck = true;
}
}
Классы.
public abstract class Matrix
{int rowCount;int columnCount;Point size;Matrix()
{= new Point(0, 0);
}public void Draw(int x, int y);
}class Cell: Matrix
{int width;int height;Cell(int w, int h)
{.width = w;.height = h;
}void DrawLine(Point A, Point B)
{.Vertex2(A.X, A.Y);.Vertex2(B.X, B.Y);
}override void Draw(int x0, int y0)
{p1 = new Point(x0, y0);p2 = new Point(x0 + width, y0);p3 = new Point(x0, y0 + height);p4 = new Point(x0 + width, y0 + height);(p1, p2);(p1, p3);(p3, p4);(p4, p2);.X = width;.Y = height;
}
}class matrixTable: Matrix
{Cell cell;x;y;matrixTable(int rowCount, int columnCount)
{= new Cell(45, 25);.rowCount = rowCount;.columnCount = columnCount;
}override void Draw(int x0, int y0)
{= x0;= y0;.Begin(BeginMode.Lines);(int i = 0; i < rowCount; i++)
{(int j = 0; j < columnCount; j++)
{.Draw(x0 + cell.width * j, y0 + cell.height * i);
}
}.X = cell.width * columnCount;.Y = cell.height * rowCount;.End();
}void drawText(TextureFont texFont, Point resolution)
{(int i = 0; i < rowCount; i++)
{text = new cellText(45, 25, Convert.ToString(i));.drawVertical(x, resolution.Y - y - cell.height * i - 25, texFont, resolution);
}(int j = 0; j < columnCount; j++)
{text = new cellText(45, 25, Convert.ToString(j));.drawHorizontal(x + cell.width * j, resolution.Y - y + 7, texFont, resolution);
}
}
}class matrix: Matrix
{double[,] mtx;mtxTab;matrix(int rowCount, int columnCount)
{.rowCount = rowCount;.columnCount = columnCount;= new double[rowCount, columnCount];= new matrixTable(rowCount, columnCount);= new Point(45 * columnCount, 25 * rowCount);
}void Draw(string operation, int x0, int y0, TextureFont texFont, Point resolution)
{y = resolution.Y - 11 - y0;M = Convert.ToDouble(mtx.GetLength(1));
double dx = 0;//Интервал между цифрамиdy = 0;//Интервал между строками
for (int i = 0; i < mtx.GetLength(0); i++)
{(int j = 0; j < mtx.GetLength(1); j++)
{= dx + 45;.WriteStringAt(Convert.ToString(mtx[i, j]), 20, x0 + dx - 20, y + dy, 0, resolution);
}= dx - 45 * (M);= dy - 25;
}text = new matrixText(operation, rowCount, columnCount);.draw(x0, y0, texFont, resolution);.Disable(EnableCap.Texture2D);(x0, y0);.Enable(EnableCap.Texture2D);.drawText(texFont, resolution);
}override void Draw(int x0, int y0)
{.Draw(x0, y0);
}void setMatrix(DataGridView dataGridView1)//Записывает матрицу в список
{(int i = 0; i < rowCount; i++)
{(int j = 0; j < columnCount; j++)
{[i, j] = Convert.ToDouble(dataGridView1.Rows[i].Cells[j].Value);
}
}
}bool Contains(Point point, int x0, int y0)
{contains = false;GraphicsPathRectangle = new GraphicsPath();RectangleDraw = new Rectangle(x0, y0, size.X, size.Y);.AddRectangle(RectangleDraw);(GraphicsPathRectangle.IsVisible(point))
{= true;
}contains;
}
}class matrixText: matrix
{string text;int width;int height;matrixText(string text, int rowCount, int columnCount)
: base(rowCount, columnCount)
{.text = text;= new Point(45 * columnCount, 25 * rowCount);
}Point calculateLocation()
{location = new Point(0, 0);.X = this.size.X - size.X - 20;.Y = this.size.Y / 2;location;
}
//x,y - координаты таблицыvoid draw(int x, int y, TextureFont texFont, Point resolution)
{.WriteStringAt(text, 20, x - 18, resolution.Y - y, 0, resolution);
|
}
}class cellText: Cell
{string text;cellText(int width, int height, string text)
: base(width, height)
{.text = text;
}void drawVertical(int x, int y, TextureFont texFont, Point resolution)
{.WriteStringAt(text, 10, x - 4, y + (this.height / 2), 0, resolution);
}void drawHorizontal(int x, int y, TextureFont texFont, Point resolution)
{.WriteStringAt(text, 10, x + (this.width / 2), y, 0, resolution);
}
}
public static class matrixOperations
{
#region//Умножение, сложение, вычитаниеstatic double[,] multiplication(double[,] matrix1, double[,] matrix2)//Умножение
{(matrix1.GetLength(1)!= matrix2.GetLength(0)) throw new Exception("Матрицы нельзя перемножить");[,] r = new double[matrix1.GetLength(0), matrix2.GetLength(1)];(int i = 0; i < matrix1.GetLength(0); i++)
{(int j = 0; j < matrix2.GetLength(1); j++)
{(int k = 0; k < matrix2.GetLength(0); k++)
{[i, j] += matrix1[i, k] * matrix2[k, j];
}
}
}r;
}static double[,] addition(double[,] matrix1, double[,] matrix2)//Сложение
{[,] r = new double[matrix1.GetLength(0), matrix2.GetLength(1)];(matrix1.GetLength(0)!= matrix2.GetLength(0) && matrix1.GetLength(1)!= matrix2.GetLength(1)) throw new Exception("Матрицы нельзя сложить");(int i = 0; i < matrix1.GetLength(0); i++)
{(int j = 0; j < matrix2.GetLength(1); j++)
{[i, j] = matrix1[i, j] + matrix2[i, j];
}
}r;
}static double[,] subtraction(double[,] matrix1, double[,] matrix2)//Вычитание
{[,] r = new double[matrix1.GetLength(0), matrix2.GetLength(1)];(matrix1.GetLength(0)!= matrix2.GetLength(0) && matrix1.GetLength(1)!= matrix2.GetLength(1)) throw new Exception("Матрицы нельзя вычесть");(int i = 0; i < matrix1.GetLength(0); i++)
{(int j = 0; j < matrix2.GetLength(1); j++)
{[i, j] = matrix1[i, j] - matrix2[i, j];
}
}r;
}
#endregion
#region//Транспонирование, обратная, определитель
public static double[,] Transpose(double[,] mtx)
{[,] TransposeMatrix = new double[mtx.GetLength(1), mtx.GetLength(0)];(int i = 0; i < TransposeMatrix.GetLength(0); i++)(int j = 0; j < TransposeMatrix.GetLength(1); j++)[i, j] = mtx[j, i];TransposeMatrix;
}static double[,] Minor(double[,] matrix, int iRow, int iCol)
{[,] minor = new double[matrix.GetLength(0) - 1, matrix.GetLength(1) - 1];m = 0, n = 0;(int i = 0; i < matrix.GetLength(0); i++)
{(i == iRow);= 0;(int j = 0; j < matrix.GetLength(1); j++)
{(j == iCol);[m, n] = matrix[i, j];++;
}++;
}minor;
}static double Determinent(double[,] matrix)
{det = 0;(matrix.GetLength(0)!= matrix.GetLength(1))
MessageBox.Show("Матрица не квадратная");
if (matrix.GetLength(0) == 1)matrix[0, 0];(int j = 0; j < matrix.GetLength(1); j++)+= (matrix[0, j] * Determinent(Minor(matrix, 0, j)) * (int)System.Math.Pow(-1, 0 + j));det;
}static double[,] Adjoint(double[,] matrix)
{(matrix.GetLength(0)!= matrix.GetLength(1))new Exception("Матрица не квадратная");[,] AdjointMatrix = new double[matrix.GetLength(0), matrix.GetLength(1)];(int i = 0; i < matrix.GetLength(0); i++)(int j = 0; j < matrix.GetLength(1); j++)[i, j] = Math.Pow(-1, i + j) * Determinent(Minor(matrix, i, j));= Transpose(AdjointMatrix);AdjointMatrix;
}static double[,] Inverse(double[,] matrix)
{[,] temp = Adjoint(matrix);[,] temp1 = new double[temp.GetLength(0), temp.GetLength(1)];
if (Determinent(matrix) == 0).Show("Матрица вырождена, обратной не существует");
for (int i = 0; i < temp.GetLength(0); i++)
{(int j = 0; j < temp.GetLength(1); j++)
{[i, j] = Math.Round(temp[i, j] / Determinent(matrix), 3);
}
}temp1;
}
#endregion
}
|
|
Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...
Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...
Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...
Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!