Beispiel #1
0
        public static Matrix Multiply(TokenType left, TokenType right)
        {
            Matrix l   = left as Matrix;
            Matrix r   = right as Matrix;
            Matrix ret = Matrix.CreateUnsafeMatrix(l.rows, r.columns);

            if (l.columns != r.rows)
            {
                throw new ExprCoreException("왼쪽 행렬의 열의 개수와 오른쪽 행렬의 행의 개수가 다릅니다.");
            }

            for (int i = 0; i < l.rows; i++)
            {
                for (int j = 0; j < r.columns; j++)
                {
                    Fraction sum = 0;
                    for (int k = 0; k < l.columns; k++)
                    {
                        TokenType lParam = l.data[i, k];
                        TokenType rParam = r.data[k, j];
                        if (lParam is Fraction && rParam is Fraction)
                        {
                            sum = FractionOperators.Add(sum, FractionOperators.Multiply(lParam, rParam));
                        }
                        else
                        {
                            throw new ExprCoreException("상수인 행렬만 곱할 수 있습니다.");
                        }
                    }
                    ret.data[i, j] = sum;
                }
            }

            return(ret);
        }
Beispiel #2
0
        public static Vec2 Negative(TokenType operand)
        {
            Vec2 vec = operand as Vec2;

            Vector.CheckNumberic(vec);
            return(new Vec2(FractionOperators.Negative(vec.X), FractionOperators.Negative(vec.Y)));
        }
Beispiel #3
0
        private static Matrix Sum(TokenType left, TokenType right, bool negative)
        {
            Matrix l   = left as Matrix;
            Matrix r   = right as Matrix;
            Matrix ret = Matrix.CreateUnsafeMatrix(l.rows, l.columns);

            if (l.rows != r.rows || l.columns != r.columns)
            {
                throw new ExprCoreException("행과 열이 다른 행렬은 더할 수 없습니다.");
            }

            for (int i = 0; i < l.rows; i++)
            {
                for (int j = 0; j < l.columns; j++)
                {
                    TokenType lParam = l.data[i, j];
                    TokenType rParam = r.data[i, j];
                    if (lParam is Fraction && rParam is Fraction)
                    {
                        ret.data[i, j] = negative ? FractionOperators.Subtract(lParam, rParam) : FractionOperators.Add(lParam, rParam);
                    }
                    else
                    {
                        throw new ExprCoreException("상수인 행렬만 더할 수 있습니다.");
                    }
                }
            }

            return(ret);
        }
Beispiel #4
0
        public static Vec2 Add(TokenType left, TokenType right)
        {
            Vec2 l = left as Vec2;
            Vec2 r = right as Vec2;

            Vector.CheckNumberic(l, r);
            return(new Vec2(FractionOperators.Add(l.X, r.X), FractionOperators.Add(l.Y, r.Y)));
        }
Beispiel #5
0
        public static Fraction Dot(TokenType left, TokenType right)
        {
            Vec2 l = left as Vec2;
            Vec2 r = right as Vec2;

            Vector.CheckNumberic(l, r);
            return(FractionOperators.Add(FractionOperators.Multiply(l.X, r.X), FractionOperators.Multiply(l.Y, r.Y)));
        }
Beispiel #6
0
        public static Vec2 Scala(TokenType left, TokenType right)
        {
            Fraction l = left as Fraction;
            Vec2     r = right as Vec2;

            Vector.CheckNumberic(r);
            return(new Vec2(FractionOperators.Multiply(l, r.X), FractionOperators.Multiply(l, r.Y)));
        }
Beispiel #7
0
        public static Vec3 Subtract(TokenType left, TokenType right)
        {
            Vec3 l = left as Vec3;
            Vec3 r = right as Vec3;

            Vector.CheckNumberic(l, r);
            return(new Vec3(FractionOperators.Subtract(l.X, r.X), FractionOperators.Subtract(l.Y, r.Y), FractionOperators.Subtract(l.Z, r.Z)));
        }
Beispiel #8
0
        public static Vec3 Cross(TokenType left, TokenType right)
        {
            Vec3 l = left as Vec3;
            Vec3 r = right as Vec3;

            Vector.CheckNumberic(r);

            Fraction x = FractionOperators.Subtract(FractionOperators.Multiply(l.Y, r.Z), FractionOperators.Multiply(l.Z, r.Y));
            Fraction y = FractionOperators.Subtract(FractionOperators.Multiply(l.Z, r.X), FractionOperators.Multiply(l.X, r.Z));
            Fraction z = FractionOperators.Subtract(FractionOperators.Multiply(l.X, r.Y), FractionOperators.Multiply(l.Y, r.X));

            return(new Vec3(x, y, z));
        }
Beispiel #9
0
        public static Matrix Negative(TokenType operand)
        {
            Matrix mat = operand as Matrix;

            Matrix.CheckNumbericMatrix(mat);

            Matrix ret = Matrix.CreateUnsafeMatrix(mat.rows, mat.columns);

            for (int i = 0; i < ret.rows; i++)
            {
                for (int j = 0; j < ret.columns; j++)
                {
                    ret.data[i, j] = FractionOperators.Negative(mat.data[i, j]);
                }
            }

            return(ret);
        }
Beispiel #10
0
        public static Matrix Scala(TokenType left, TokenType right)
        {
            Fraction l   = left as Fraction;
            Matrix   r   = right as Matrix;
            Matrix   ret = Matrix.CreateUnsafeMatrix(r.rows, r.columns);

            for (int i = 0; i < r.rows; i++)
            {
                for (int j = 0; j < r.columns; j++)
                {
                    if (r.data[i, j] is Fraction)
                    {
                        ret.data[i, j] = FractionOperators.Multiply(l, r.data[i, j]);
                    }
                    else
                    {
                        throw new ExprCoreException("상수인 행렬만 스칼라 곱연산을 할 수 있습니다.");
                    }
                }
            }

            return(ret);
        }