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); }
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))); }
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); }
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))); }
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))); }
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))); }
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))); }
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)); }
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); }
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); }