Vector2.mesa
Copyright Ó 1985, 1987, 1991 by Xerox Corporation. All rights reserved.
Doug Wyatt, March 7, 1985 1:20:28 pm PST
Michael Plass, January 7, 1987 11:04:49 am PST
Defines VEC, a two dimensional vector type, and several useful vector operations.
Vector2: CEDAR DEFINITIONS
~ BEGIN
VEC: TYPE ~ RECORD [x, y: REAL];
Add: PROC [v1, v2: VEC] RETURNS [VEC];
InlineAdd: PROC [v1, v2: VEC] RETURNS [VEC]
~ INLINE { RETURN[[v1.x+v2.x, v1.y+v2.y]] };
Sum, v1+v2.
Sub: PROC [v1, v2: VEC] RETURNS [VEC];
InlineSub: PROC [v1, v2: VEC] RETURNS [VEC]
~ INLINE { RETURN[[v1.x-v2.x, v1.y-v2.y]] };
Difference, v1-v2.
Neg: PROC [v: VEC] RETURNS [VEC];
InlineNeg: PROC [v: VEC] RETURNS [VEC]
~ INLINE { RETURN[[-v.x, -v.y]] };
Negative, -v.
Mul: PROC [v: VEC, s: REAL] RETURNS [VEC];
InlineMul: PROC [v: VEC, s: REAL] RETURNS [VEC]
~ INLINE { RETURN[[v.x*s, v.y*s]] };
Multiplication by a scalar, sv.
Div: PROC [v: VEC, s: REAL] RETURNS [VEC];
InlineDiv: PROC [v: VEC, s: REAL] RETURNS [VEC]
~ INLINE { RETURN[[v.x/s, v.y/s]] };
Division by a scalar, v/s.
MulC: PROC [v1, v2: VEC] RETURNS [VEC];
InlineMulC: PROC [v1, v2: VEC] RETURNS [VEC]
~ INLINE { RETURN[[v1.x*v2.x, v1.y*v2.y]] };
Componentwise multiplication.
DivC: PROC [v1, v2: VEC] RETURNS [VEC];
InlineDivC: PROC [v1, v2: VEC] RETURNS [VEC]
~ INLINE { RETURN[[v1.x/v2.x, v1.y/v2.y]] };
Componentwise division.
Dot: PROC [v1, v2: VEC] RETURNS [REAL];
InlineDot: PROC [v1, v2: VEC] RETURNS [REAL]
~ INLINE { RETURN[v1.x*v2.x+v1.y*v2.y] };
Dot (inner) product, v1"v2 = |v1| |v2| cos(theta).
Cross: PROC [v1, v2: VEC] RETURNS [REAL];
InlineCross: PROC [v1, v2: VEC] RETURNS [REAL]
~ INLINE { RETURN[v1.x*v2.y-v1.y*v2.x] };
Magnitude of cross (outer) product, | v1 v2 | = |v1| |v2| sin(theta).
Square: PROC [v: VEC] RETURNS [REAL];
InlineSquare: PROC [v: VEC] RETURNS [REAL]
~ INLINE { RETURN[v.x*v.x+v.y*v.y] };
Square, v"v = |v| |v|.
Length: PROC [v: VEC] RETURNS [REAL];
Length (magnitude), |v| = SqRt[v"v].
Unit: PROC [v: VEC] RETURNS [VEC];
Unit vector, v / |v|.
END.