-- File: SVVector2d.mesa
-- Last edited by Bier on December 18, 1982 1:02 am
-- Author: Eric Bier on August 12, 1983 9:25 pm
-- renamed from Vector2d to SVVector2d on October 1, 1982 9:22 pm
-- Contents: Routines for manipulation vectors in two dimensions

DIRECTORY
 SV2d;

SVVector2d: DEFINITIONS =
BEGIN

Point2d: TYPE = SV2d.Point2d;
TrigLineSeg: TYPE = SV2d.TrigLineSeg;
Vector2d: TYPE = SV2d.Vector2d;

VectorFromAngle: PROC [angle: REAL] RETURNS [vector: Vector2d];
-- angle must be in degrees in the range: -180 < angle <= 180.
-- vector is a unit vector.

VectorPlusAngle: PROC [v: Vector2d, degrees: REAL] RETURNS [rotatedV: Vector2d];

AngleFromVector: PROC [v: Vector2d] RETURNS [position: REAL];
AngleCCWBetweenVectors: PROC [v1, v2: Vector2d] RETURNS [difference: REAL];
-- difference will be in: 0 <= difference < 360. A clockwise angle
AngleCWBetweenVectors: PROC [v1, v2: Vector2d] RETURNS [difference: REAL];
-- difference will be in: 0 <= difference < 360. A counter-clockwise angle
SmallestAngleBetweenVectors: PROC [v1, v2: Vector2d] RETURNS [difference: REAL];
-- all angles in degrees. RETURNS ClockwiseAngle or CounterClockwiseAngle. Whichever is smaller. -180< difference <= 180.

Difference: PROC [v1, v2: Vector2d] RETURNS [v1MinusV2: Vector2d];
Sum: PROC [v1, v2: Vector2d] RETURNS [v1PlusV2: Vector2d];
Scale: PROC [v: Vector2d, s: REAL] RETURNS [vTimesS: Vector2d];
Normalize: PROC [v: Vector2d] RETURNS [normV: Vector2d];
ElementwiseProduct: PROC [v1, v2: Vector2d] RETURNS [v1Timesv2: Vector2d];
DotProduct: PROC [v1, v2: Vector2d] RETURNS [scalar: REAL];
Magnitude: PROC [v: Vector2d] RETURNS [mag: REAL];
MagnitudeSquared: PROC [v: Vector2d] RETURNS [magSquared: REAL];

VectorFromPoints: PROC [tail, head: Point2d] RETURNS [vector: Vector2d];

RightNormalOfTrigLineSeg: PROC [seg: TrigLineSeg] RETURNS [normal: Vector2d];
LeftNormalOfTrigLineSeg: PROC [seg: TrigLineSeg] RETURNS [normal: Vector2d];

END.