DIRECTORY JaM USING [State, PopReal, PushReal, Register], JaMIPrivate USING [], Vector2; JaMIVector2Impl: CEDAR PROGRAM IMPORTS JaM, Vector2 EXPORTS JaMIPrivate ~ BEGIN OPEN JaM; VEC: TYPE ~ Vector2.VEC; PopVec: PROC [self: State] RETURNS [VEC] ~ { y: REAL ~ PopReal[self]; x: REAL ~ PopReal[self]; RETURN[[x, y]]; }; PushVec: PROC [self: State, v: VEC] ~ { PushReal[self, v.x]; PushReal[self, v.y]; }; ApplyV2Add: PUBLIC PROC [self: State] ~ { v2: VEC = PopVec[self]; v1: VEC = PopVec[self]; PushVec[self, Vector2.Add[v1, v2]]; -- Sum, v1+v2. }; ApplyV2Sub: PUBLIC PROC [self: State] ~ { v2: VEC = PopVec[self]; v1: VEC = PopVec[self]; PushVec[self, Vector2.Sub[v1, v2]]; -- Difference, v1-v2. }; ApplyV2Neg: PUBLIC PROC [self: State] ~ { v1: VEC = PopVec[self]; PushVec[self, Vector2.Neg[v1]]; -- Negative, -v. }; ApplyV2Mul: PUBLIC PROC [self: State] ~ { v1: VEC = PopVec[self]; s1: REAL = PopReal[self]; PushVec[self, Vector2.Mul[v1, s1]]; -- Multiplication by a scalar, sv. }; ApplyV2Div: PUBLIC PROC [self: State] ~ { v1: VEC = PopVec[self]; s1: REAL = PopReal[self]; PushVec[self, Vector2.Div[v1, s1]]; -- Division by a scalar, v/s. }; ApplyV2MulC: PUBLIC PROC [self: State] ~ { v2: VEC = PopVec[self]; v1: VEC = PopVec[self]; PushVec[self, Vector2.MulC[v1, v2]]; -- Componentwise multiplication. }; ApplyV2DivC: PUBLIC PROC [self: State] ~ { v2: VEC = PopVec[self]; v1: VEC = PopVec[self]; PushVec[self, Vector2.DivC[v1, v2]]; -- Componentwise division. }; ApplyV2Dot: PUBLIC PROC [self: State] ~ { v2: VEC = PopVec[self]; v1: VEC = PopVec[self]; PushReal[self, Vector2.Dot[v1, v2]]; -- Dot (inner) product, v19v2 = |v1| |v2| cos(theta). }; ApplyV2Cross: PUBLIC PROC [self: State] ~ { v2: VEC = PopVec[self]; v1: VEC = PopVec[self]; PushReal[self, Vector2.Cross[v1, v2]]; -- Magnitude of cross (outer) product, |v1Xv2| = |v1| |v2| sin(theta). }; ApplyV2Square: PUBLIC PROC [self: State] ~ { v1: VEC = PopVec[self]; PushReal[self, Vector2.Square[v1]]; -- Square, v9v = |v||v|. }; ApplyV2Length: PUBLIC PROC [self: State] ~ { v1: VEC = PopVec[self]; PushReal[self, Vector2.Length[v1]]; -- Length (magnitude), |v| = SqRt[v9v]. }; ApplyV2Unit: PUBLIC PROC [self: State] ~ { v1: VEC = PopVec[self]; PushVec[self, Vector2.Unit[v1]]; -- Unit vector, v/|v|. }; ApplyV2Exchange: PUBLIC PROC [self: State] ~ { v2: VEC = PopVec[self]; v1: VEC = PopVec[self]; PushVec[self, v2]; PushVec[self, v1]; }; RegisterVector2: PUBLIC PROC [self: State] ~ { Register[self, ".v2add", ApplyV2Add]; Register[self, ".v2sub", ApplyV2Sub]; Register[self, ".v2neg", ApplyV2Neg]; Register[self, ".v2mul", ApplyV2Mul]; Register[self, ".v2div", ApplyV2Div]; Register[self, ".v2mulc", ApplyV2MulC]; Register[self, ".v2divc", ApplyV2DivC]; Register[self, ".v2dot", ApplyV2Dot]; Register[self, ".v2cross", ApplyV2Cross]; Register[self, ".v2square", ApplyV2Square]; Register[self, ".v2length", ApplyV2Length]; Register[self, ".v2unit", ApplyV2Unit]; Register[self, ".v2exch", ApplyV2Exchange]; }; END. ®JaMIVector2Impl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Tim Diebert: July 31, 1985 2:11:08 pm PDT McCreight, November 27, 1985 3:18:59 pm PST Êû˜™Icodešœ Ïmœ1™