<> <> <> <<>> DIRECTORY Real USING [SqRt]; Vector2: CEDAR DEFINITIONS IMPORTS Real ~ BEGIN VEC: TYPE ~ RECORD[x, y: REAL]; Add: PROC[a, b: VEC] RETURNS[VEC]; InlineAdd: PROC[a, b: VEC] RETURNS[VEC] ~ INLINE { RETURN[[a.x+b.x, a.y+b.y]] }; <> Sub: PROC[a, b: VEC] RETURNS[VEC]; InlineSub: PROC[a, b: VEC] RETURNS[VEC] ~ INLINE { RETURN[[a.x-b.x, a.y-b.y]] }; <> Neg: PROC[a: VEC] RETURNS[VEC]; InlineNeg: PROC[a: VEC] RETURNS[VEC] ~ INLINE { RETURN[[-a.x, -a.y]] }; <> Mul: PROC[a: VEC, s: REAL] RETURNS[VEC]; InlineMul: PROC[a: VEC, s: REAL] RETURNS[VEC] ~ INLINE { RETURN[[a.x*s, a.y*s]] }; <> Div: PROC[a: VEC, s: REAL] RETURNS[VEC]; InlineDiv: PROC[a: VEC, s: REAL] RETURNS[VEC] ~ INLINE { RETURN[[a.x/s, a.y/s]] }; <> SqrMag: PROC[a: VEC] RETURNS[REAL]; InlineSqrMag: PROC[a: VEC] RETURNS[REAL] ~ INLINE { RETURN[a.x*a.x+a.y*a.y] }; <> Mag: PROC[a: VEC] RETURNS[REAL]; InlineMag: PROC[a: VEC] RETURNS[REAL] ~ INLINE { RETURN[Real.SqRt[a.x*a.x+a.y*a.y]] }; <> <<>> Dot: PROC[a, b: VEC] RETURNS[REAL]; InlineDot: PROC[a, b: VEC] RETURNS[REAL] ~ INLINE { RETURN[a.x*b.x+a.y*b.y] }; <> Cross: PROC[a, b: VEC] RETURNS[REAL]; InlineCross: PROC[a, b: VEC] RETURNS[REAL] ~ INLINE { RETURN[a.x*b.y-a.y*b.x] }; <> Unit: PROC[a: VEC] RETURNS[VEC]; InlineUnit: PROC[a: VEC] RETURNS[VEC] ~ INLINE { RETURN[InlineDiv[a, InlineMag[a]]] }; <> Normal: PROC[a: VEC] RETURNS[VEC]; InlineNormal: PROC[a: VEC] RETURNS[VEC] ~ INLINE { RETURN[[-a.y, a.x]] }; <> END.