static void Main(string[] args) { // ScalarFunction x = "x"; ScalarFunction y = "y"; ScalarFunction a = "a"; ScalarFunction b = "b"; ScalarFunction c = "c"; ScalarFunction d = "d"; ScalarFunction i = "i"; ScalarFunction j = "j"; MatrixFunction m = NewMatrix(new Matrix <ScalarFunction>( new[] { new ScalarFunction[] { a, b }, new ScalarFunction[] { c, d } })); VectorFunction v = NewColumnVector(new ScalarFunction[] { x, y }); VectorFunction r = NewColumnVector(new ScalarFunction[] { i, j }); BinaryFunction k = MatrixMethods.RotationMethod(m, v, r); k = k.Calculate(); //Console.WriteLine(((a * i + c * j) / (a * a + c * c)).Calculate()); //var sqrt = op_Exponentiation(op_Exponentiation(a, 2) + op_Exponentiation(c, 2), 0.5); //var d_y = ((a * j - c * i) / (a * d - c * b)) * (a * b + c * d); //var gg = ((x * (a * a + c * c)) + y) / sqrt == (a * i + c * j) / sqrt; //var gg2 = NewScalarFind(x, gg).Calculate(); //var gg3 = gg2.Calculate(NewScalarFind(y, y == d_y)); Console.ReadKey(); }
#pragma warning disable CA1822 // Mark members as static #pragma warning disable IDE0051 // Remove unused private members private void RunGauElim(Matrix mat1, Matrix mat2) #pragma warning restore IDE0051 // Remove unused private members #pragma warning restore CA1822 // Mark members as static { for (int i = 0; i < interval; i++) { _ = MatrixMethods.GaussianElimination(mat1, mat2); } }
public void RotateMethod() { MatrixFunction m = NewMatrix(new Matrix <ScalarFunction>( new[] { new ScalarFunction[] { "a", "b" }, new ScalarFunction[] { "c", "d" } })); VectorFunction v = NewColumnVector(new ScalarFunction[] { "x", "y" }); VectorFunction r = NewColumnVector(new ScalarFunction[] { "i", "j" }); BinaryFunction b = MatrixMethods.RotationMethod(m, v, r); }
void ButtonMethodsOnClick(object obj, EventArgs ea) { MatrixMethods dlg = new MatrixMethods(); dlg.Matrix = Matrix; if (dlg.ShowDialog() == DialogResult.OK) { Matrix = dlg.Matrix; btnUpdate.PerformClick(); } }
public void GaussianEliminationTest() { var mat1 = new Matrix(new[, ] { { 1936.0 / 45, 692.0 / 15 }, { 692.0 / 15, 324.0 / 5 } }); var polyu = KtPolynomial.Create(1); var poly1 = KtPolynomial.Create(0, 572.0 / 45, 0, -11.0 / 90); var poly2 = KtPolynomial.Create(-32.0 / 3, 932.0 / 45, -2, 2.0 / 45); var expression1 = new Expression( ((poly1, polyu), Limit.Create(0, 4)), ((poly2, polyu), Limit.Create(4, 9)), ((poly2, polyu), Limit.Create(9, 15))); var poly3 = KtPolynomial.Create(0, 63.0 / 5, 0, -1 / 15.0); var poly4 = KtPolynomial.Create(-243 / 2.0, 531.0 / 10, -9.0 / 2, 1.0 / 10); var expression2 = new Expression( ((poly3, polyu), Limit.Create(0, 4)), ((poly3, polyu), Limit.Create(4, 9)), ((poly4, polyu), Limit.Create(9, 15))); var mat2 = new Matrix(new[, ] { { expression1 }, { expression2 } }); var actual = MatrixMethods.GaussianElimination(mat1, mat2); //GetEllapsedTime(mat1, mat2); var expPoly1a = KtPolynomial.Create(0, 2727.0 / 7420, 0, -109.0 / 14840); var expPoly1b = KtPolynomial.Create(-1944.0 / 1855, 8559.0 / 7420, -729.0 / 3710, 67.0 / 7420); var expPoly1c = KtPolynomial.Create(3159.0 / 424, -24921.0 / 14840, 351.0 / 2968, -39.0 / 14840); var expPoly2a = KtPolynomial.Create(0, -374.0 / 5565, 0, 187.0 / 44520); var expPoly2b = KtPolynomial.Create(1384.0 / 1855, -3488.0 / 5565, 519.0 / 3710, -83.0 / 11130); var expPoly2c = KtPolynomial.Create(-761.0 / 106, 22427.0 / 11130, -57.0 / 371, 19.0 / 5565); var expected1 = new Expression( ((expPoly1a, polyu), Limit.Create(0, 4)), ((expPoly1b, polyu), Limit.Create(4, 9)), ((expPoly1c, polyu), Limit.Create(9, 15))); var expected2 = new Expression( ((expPoly2a, polyu), Limit.Create(0, 4)), ((expPoly2b, polyu), Limit.Create(4, 9)), ((expPoly2c, polyu), Limit.Create(9, 15))); var expected = new Matrix(new[, ] { { expected1 }, { expected2 } }); Assert.AreEqual(expected1, actual[0, 0]); Assert.AreEqual(expected2, actual[1, 0]); Assert.AreEqual(expected, actual); }
public void MatrixNotSquareExceptionTest() { var d = new double[, ] { { 0.0, 1.0, 1 }, { 0, 1, 1 } }; var e = new double[, ] { { 0.0, 1.0, 1 }, { 0, 1, 1 } }; var ex = Assert.ThrowsException <MatrixNotSquareExeption>(() => { var x = MatrixMethods.GaussianElimination(new Matrix(d), new Matrix(e)); } ); Console.WriteLine(ex.Message); }
private void Scene() { Graphics graphics = Graphics.FromImage(bitmap); SolidBrush brush = new SolidBrush(Color.Black); graphics.FillRectangle(brush, 0, 0, bitmap.Width, bitmap.Height); //Tworzenie macierzy rzutowania na 2d float nearDistance = 0.1f; float farDistance = 1000.0f; float angle = 90.0f; //kąt widzenia float aspectRatio = (float)bitmap.Height / (float)bitmap.Width; // wspołczynnik proporcji wyświetlanego ekranu (bitmapy) matProjection = MatrixMethods.Projection(angle, aspectRatio, nearDistance, farDistance); //Tworzenie macierzy rotacji wkierunkach Z, X matRotationZ = MatrixMethods.RotationZ(angleZ); matRotationX = MatrixMethods.RotationX(angleX); List <Triangle> trianglesToRaster = new List <Triangle>(); matTranslation = MatrixMethods.Translation(0.0f, 0.0f, zPosition); //nowa pozycja po rotacji matWorld = MatrixMethods.MatrixIdentity(); matWorld = MatrixMethods.MultiplyMatrix(matRotationZ, matRotationX); matWorld = MatrixMethods.MultiplyMatrix(matWorld, matTranslation); //Vector kierunku poruszania się kamery. VectorMethods vLookDiraction = new VectorMethods(); VectorMethods vUp = new VectorMethods { x = 0, y = 1, z = 0 }; VectorMethods vTarget = new VectorMethods { x = 0, y = 0, z = 5 }; MatrixMethods matCameraRot = MatrixMethods.RotationY(0); vLookDiraction = MatrixMethods.Multiply(matCameraRot, vTarget); vTarget = VectorMethods.AddVectors(vCamera, vLookDiraction); MatrixMethods matCamera = MatrixMethods.CalculatePoint(vCamera, vTarget, vUp); //Tworzenie macierzy widoku kamery MatrixMethods matView = MatrixMethods.InverseMatrix(matCamera); foreach (var triangle in scene.triangles) { Triangle projectedTriangle, transformedTriangle, viewedTriangle; projectedTriangle = new Triangle(3); transformedTriangle = new Triangle(3); viewedTriangle = new Triangle(3); //Tworzenie vektorów transormacji for (int i = 0; i < 3; i++) { transformedTriangle.points[i] = MatrixMethods.Multiply(matWorld, triangle.points[i]); } //Wygląd 'trojkatow' od frontu, z widoku kamery VectorMethods normal, edge1, edge2; edge1 = VectorMethods.SubVectors(transformedTriangle.points[1], transformedTriangle.points[0]); edge2 = VectorMethods.SubVectors(transformedTriangle.points[2], transformedTriangle.points[0]); normal = VectorMethods.CrossProduct(edge1, edge2); normal = VectorMethods.VectorNormalise(normal); // stworzenie wektora z promieniem kamery VectorMethods cameraRay = VectorMethods.SubVectors(transformedTriangle.points[0], vCamera); if (VectorMethods.ScalarProduct(normal, cameraRay) < 0.0f) { //Kierunek światła i cienowanie VectorMethods lightDirection = new VectorMethods { x = 0.0f, y = 1.0f, z = -1.0f }; lightDirection = VectorMethods.VectorNormalise(lightDirection); //wspołczynnik cieniowania float dp = (float)Math.Max(0.1f, VectorMethods.ScalarProduct(lightDirection, normal)); Color c = draw.ChangeColor(Color.Black, dp); //zmiana wektora transormacji korzystając z widoku kamery viewedTriangle.points[0] = MatrixMethods.Multiply(matView, transformedTriangle.points[0]); viewedTriangle.points[1] = MatrixMethods.Multiply(matView, transformedTriangle.points[1]); viewedTriangle.points[2] = MatrixMethods.Multiply(matView, transformedTriangle.points[2]); //rzutowanie wektorow(trojkątów) na 2d for (int i = 0; i < 3; i++) { projectedTriangle.points[i] = MatrixMethods.Multiply(matProjection, viewedTriangle.points[i]); } for (int i = 0; i < 3; i++) { projectedTriangle.points[i] = VectorMethods.DivideByNumber(projectedTriangle.points[i], projectedTriangle.points[i].w); } projectedTriangle.color = c; //przeskalowanie figur na ekranie(współrzedne x,y) VectorMethods vectorOffSetView = new VectorMethods { x = 1, y = 1, z = 0 }; for (int i = 0; i < 3; i++) { projectedTriangle.points[i] = VectorMethods.AddVectors(projectedTriangle.points[i], vectorOffSetView); } //skalowanie do wielkości wyświetlanej bitmapy projectedTriangle.points[0].x *= 0.5f * (float)bitmap.Width; projectedTriangle.points[0].y *= 0.5f * (float)bitmap.Height; projectedTriangle.points[1].x *= 0.5f * (float)bitmap.Width; projectedTriangle.points[1].y *= 0.5f * (float)bitmap.Height; projectedTriangle.points[2].x *= 0.5f * (float)bitmap.Width; projectedTriangle.points[2].y *= 0.5f * (float)bitmap.Height; //Tworzeni listy do sortowania trojkątów projectedTriangle.zValue = (projectedTriangle.points[0].z + projectedTriangle.points[1].z + projectedTriangle.points[2].z) / 3.0f; trianglesToRaster.Add(projectedTriangle); } } //sortowanie trojkatów względem wspołrzednej z trianglesToRaster.Sort((a, b) => b.zValue.CompareTo(a.zValue)); //rysowanie trojkatow foreach (var triangle in trianglesToRaster) { draw.DrawTriangle(triangle, bitmap, triangle.color); pictureBox1.Image = bitmap; } }
#pragma warning disable IDE0051 // Remove unused private members private static void GetEllapsedTime(Matrix mat1, Matrix mat2) #pragma warning restore IDE0051 // Remove unused private members { Console.WriteLine(DiagnosticsExtensions.ElapsedTime(() => { for (int i = 0; i < interval; i++) { var actual2 = MatrixMethods.GaussianElimination(mat1, mat2); } })); Console.WriteLine(DiagnosticsExtensions.ElapsedTime(() => { for (int i = 0; i < interval; i++) { var actual2 = MatrixMethods.GaussianElimination2(mat1, mat2); } })); Console.WriteLine(DiagnosticsExtensions.ElapsedTime(() => { for (int i = 0; i < interval; i++) { var actual2 = MatrixMethods.GaussianElimination2(mat1, mat2); } })); Console.WriteLine(DiagnosticsExtensions.ElapsedTime(() => { for (int i = 0; i < interval; i++) { var actual1 = MatrixMethods.GaussianElimination(mat1, mat2); } })); Console.WriteLine(DiagnosticsExtensions.ElapsedTime(() => { for (int i = 0; i < interval; i++) { var actual1 = MatrixMethods.GaussianElimination(mat1, mat2); } })); Console.WriteLine(DiagnosticsExtensions.ElapsedTime(() => { for (int i = 0; i < interval; i++) { var actual2 = MatrixMethods.GaussianElimination2(mat1, mat2); } })); Console.WriteLine(DiagnosticsExtensions.ElapsedTime(() => { for (int i = 0; i < interval; i++) { var actual2 = MatrixMethods.GaussianElimination2(mat1, mat2); } })); Console.WriteLine(DiagnosticsExtensions.ElapsedTime(() => { for (int i = 0; i < interval; i++) { var actual1 = MatrixMethods.GaussianElimination(mat1, mat2); } })); Console.WriteLine(DiagnosticsExtensions.ElapsedTime(() => { for (int i = 0; i < interval; i++) { var actual1 = MatrixMethods.GaussianElimination(mat1, mat2); } })); Console.WriteLine(DiagnosticsExtensions.ElapsedTime(() => { for (int i = 0; i < interval; i++) { var actual2 = MatrixMethods.GaussianElimination2(mat1, mat2); } })); Console.WriteLine(DiagnosticsExtensions.ElapsedTime(() => { for (int i = 0; i < interval; i++) { var actual2 = MatrixMethods.GaussianElimination2(mat1, mat2); } })); Console.WriteLine(DiagnosticsExtensions.ElapsedTime(() => { for (int i = 0; i < interval; i++) { var actual1 = MatrixMethods.GaussianElimination(mat1, mat2); } })); }