-- File: SVMatrix2d.mesa
-- Last edited by Bier on December 18, 1982 1:05 am
-- Author: Eric Bier on November 18, 1982 8:40 pm
-- Contents: My own package for manipulating Homogenous 3 x 3 matrices. Parallels Matrix3d in many places
DIRECTORY
SV2d,
SVVector2d;
SVMatrix2d: DEFINITIONS =
BEGIN
Matrix3by3: TYPE = ARRAY [1..3] OF ARRAY [1..3] OF REAL;
Point2d: TYPE = SV2d.Point2d;
Vector2d: TYPE = SVVector2d.Vector2d;
Identity: PROC [] RETURNS [identityMat: Matrix3by3];
Update: PROC [mat: Matrix3by3, point: Point2d] RETURNS [newPoint: Point2d];
UpdateVector: PROC [mat: Matrix3by3, vec: Vector2d] RETURNS [newVec: Vector2d];
-- vectors can be rotated and scaled, but not translated
-- The next three procedures perform an efficient matrix multiplication as though mat were being multiplied to its left (a transform in reference coordinates) by a matrix which translates or rotates respectively (See Paul).
Scale: PROC [mat: Matrix3by3, sx, sy: REAL] RETURNS [transMat: Matrix3by3];
Translate: PROC [mat: Matrix3by3, dx, dy: REAL] RETURNS [transMat: Matrix3by3];
RotateCCW: PROC [mat: Matrix3by3, degrees: REAL] RETURNS [transMat: Matrix3by3];
-- The next three procedures perform an efficient matrix multiplication as though mat were being multiplied on its right (a transform in local coordinates) by a matrix which translates or rotates respectively (See Paul).
LocalScale: PROC [mat: Matrix3by3, sx, sy: REAL] RETURNS [transMat: Matrix3by3];
LocalTranslate: PROC [mat: Matrix3by3, dx, dy: REAL] RETURNS [transMat: Matrix3by3];
LocalRotateCCW: PROC [mat: Matrix3by3, degrees: REAL] RETURNS [transMat: Matrix3by3];
MatMult: PROC [left, right: Matrix3by3] RETURNS [transMat: Matrix3by3];
-- MatMult is almost a general 3 by 3 matrix operation. However, it assumes that the last row of each matrix is [0 0 1].
MakeScaleMat: PROC [sx, sy: REAL] RETURNS [scale: Matrix3by3];
MakeTranslateMat: PROC [dx, dy: REAL] RETURNS [trans: Matrix3by3];
MakeRotateCCWMat: PROC [degrees: REAL] RETURNS [rot: Matrix3by3];
MakeMatFromXAxis: PROC [xAxis: Vector2d, origin: Point2d] RETURNS [mat: Matrix3by3];
-- not yet implemented
MakeMatFromYAxis: PROC [yAxis: Vector2d, origin: Point2d] RETURNS [mat: Matrix3by3];
-- not yet implemented
MakeMatFromAxes: PROC [xAxis, yAxis: Vector2d, origin: Point2d] RETURNS [mat: Matrix3by3];
-- uses the axes directly. Doesn't even check to see if they are orthogonal
ScaleFromMatrix: PROC [mat: Matrix3by3] RETURNS [sx, sy: REAL];
-- finds out how much this matrix will scale an object it is applied to
OriginOfMatrix: PROC [mat: Matrix3by3] RETURNS [origin: Point2d];
XAxisOfMatrix: PROC [mat: Matrix3by3] RETURNS [xAxis: Vector2d];
YAxisOfMatrix: PROC [mat: Matrix3by3] RETURNS [yAxis: Vector2d];
RotationOfMatrix: PROC [mat: Matrix3by3] RETURNS [degrees: REAL];
Cofactor: PROC [mat: Matrix3by3, row, col: NAT] RETURNS [cof: REAL];
Determinant: PROC [mat: Matrix3by3] RETURNS [det: REAL];
Transpose: PROC [mat: Matrix3by3] RETURNS [MatT: Matrix3by3];
Inverse: PROC [mat: Matrix3by3] RETURNS [inverse: Matrix3by3];
-- inverts any matrix of the given form (even with scaling)
DegenerateInverse: SIGNAL;
WorldToLocal: PROC [AinWorld,BinWorld: Matrix3by3] RETURNS [BinTermsOfA: Matrix3by3];
END.