Exemplo n.º 1
0
        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();
        }
Exemplo n.º 2
0
#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);
 }
Exemplo n.º 4
0
    void ButtonMethodsOnClick(object obj, EventArgs ea)
    {
        MatrixMethods dlg = new MatrixMethods();

        dlg.Matrix = Matrix;

        if (dlg.ShowDialog() == DialogResult.OK)
        {
            Matrix = dlg.Matrix;
            btnUpdate.PerformClick();
        }
    }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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;
            }
        }
Exemplo n.º 8
0
#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);
                                                                        }
                                                                }));
        }