File: SVMatrix2d.mesa
Last edited by Bier on June 1, 1984 4:38:07 pm PDT
Author: Eric Bier on July 29, 1984 2:22:21 pm PDT
Contents: My own package for manipulating Homogenous 3 x 3 matrices. Parallels Matrix3d in many places
DIRECTORY
SV2d,
SVVector2d;
SVMatrix2d: DEFINITIONS =
BEGIN
Matrix3by3: TYPE = SV2d.Matrix3by3;
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.