File: SVMatrix2d.mesa
Last edited by Bier on June 1, 1984 4:38:07 pm PDT
Author: Eric Bier on January 28, 1987 12:34:52 pm PST
Contents: My own package for manipulating Homogenous 3 x 3 matrices. Parallels SVMatrix3d in many places
DIRECTORY
SV2d,
SVVector2d;
SVMatrix2d: CEDAR 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.