DIRECTORY RealFns, SV3d, SVVector2d, SVVector3d; SVVector3dImpl: PROGRAM IMPORTS RealFns EXPORTS SVVector3d = BEGIN Vector: TYPE = SV3d.Vector; Vector2d: TYPE = SVVector2d.Vector2d; Add: PUBLIC PROC [v1: Vector, v2: Vector] RETURNS [sumV: Vector] = { sumV[1] _ v1[1] + v2[1]; sumV[2] _ v1[2] + v2[2]; sumV[3] _ v1[3] + v2[3]; }; Difference: PUBLIC PROC [v1: Vector, v2: Vector] RETURNS [v1Minusv2: Vector] = { v1Minusv2[1] _ v1[1] - v2[1]; v1Minusv2[2] _ v1[2] - v2[2]; v1Minusv2[3] _ v1[3] - v2[3]; }; Scale: PUBLIC PROC [v: Vector, scalar: REAL] RETURNS [scaledV: Vector] = { scaledV[1] _ v[1]*scalar; scaledV[2] _ v[2]*scalar; scaledV[3] _ v[3]*scalar; }; Normalize: PUBLIC PROC [v: Vector] RETURNS [normV: Vector] = { mag: REAL _ Magnitude[v]; normV[1] _ v[1]/mag; normV[2] _ v[2]/mag; normV[3] _ v[3]/mag; }; Negate: PUBLIC PROC [v: Vector] RETURNS [negV: Vector] = { negV[1] _ -v[1]; negV[2] _ -v[2]; negV[3] _ -v[3]; }; DotProduct: PUBLIC PROC [v1: Vector, v2: Vector] RETURNS [scalar: REAL] = { scalar _ v1[1]*v2[1] + v1[2]*v2[2] + v1[3]*v2[3]; }; CrossProduct: PUBLIC PROC [v1: Vector, v2: Vector] RETURNS [prodV: Vector] = { prodV[1] _ v1[2]*v2[3] - v1[3]*v2[2]; prodV[2] _ v1[3]*v2[1] - v1[1]*v2[3]; prodV[3] _ v1[1]*v2[2] - v1[2]*v2[1]; }; Magnitude: PUBLIC PROC [v: Vector] RETURNS [magnitude: REAL] = { magnitude _ RealFns.SqRt[(v[1]*v[1]+v[2]*v[2]+v[3]*v[3])]; }; Parallel: PUBLIC PROC [v1, v2: Vector] RETURNS [BOOL] = { a,b,c: REAL; IF v2[1] = 0 THEN { IF v1[1] # 0 THEN RETURN[FALSE] ELSE a _ 0} ELSE {IF v1[1] = 0 THEN IF v2[1] # 0 THEN RETURN[FALSE] ELSE a _ v1[1]/v2[1]}; IF v2[2] = 0 THEN { IF v1[2] # 0 THEN RETURN[FALSE] ELSE b _ 0} ELSE {IF v1[2] = 0 THEN IF v2[2] # 0 THEN RETURN[FALSE] ELSE b _ v1[2]/v2[2]}; IF v2[3] = 0 THEN { IF v1[3] # 0 THEN RETURN[FALSE] ELSE c _ 0} ELSE {IF v1[3] = 0 THEN IF v2[3] # 0 THEN RETURN[FALSE] ELSE c _ v1[3]/v2[3]}; RETURN[AllEqual[a, b, c]]; }; AllEqual: PRIVATE PROC [a, b, c: REAL] RETURNS [BOOL] = { IF a = 0 THEN { IF b = 0 THEN RETURN[TRUE]-- both vectors have only a z component ELSE IF c = 0 THEN RETURN[TRUE] -- both vectors have only a y component ELSE RETURN[b=c]; } ELSE { IF b = 0 THEN { IF c = 0 THEN RETURN[TRUE]-- both vectors have only an x component ELSE RETURN[a=c]; } ELSE { IF c = 0 THEN RETURN[a=b] ELSE RETURN[a=b AND b = c]; }; }; }; -- end of AllEqual Perpendicular: PUBLIC PROC [v1, v2: Vector] RETURNS [BOOL] = { RETURN[DotProduct[v1, v2] = 0]; }; Vector2DAsXYVector: PUBLIC PROC [vXY: Vector2d] RETURNS [vZeroZ: Vector] = { vZeroZ[1] _ vXY[1]; vZeroZ[2] _ vXY[2]; vZeroZ[3] _ 0; }; Vector2DAsYZVector: PUBLIC PROC [vYZ: Vector2d] RETURNS [vZeroX: Vector] = { vZeroX[1] _ 0; vZeroX[2] _ vYZ[1]; vZeroX[3] _ vYZ[2]; }; Vector2DAsZXVector: PUBLIC PROC [vZX: Vector2d] RETURNS [vZeroY: Vector] = { vZeroY[1] _ vZX[2]; vZeroY[2] _ 0; vZeroY[3] _ vZX[1]; }; ProjectOntoXYPlane: PUBLIC PROC [v: Vector] RETURNS [v2d: Vector2d] = { v2d[1] _ v[1]; v2d[2] _ v[2]; }; ProjectOntoYZPlane: PUBLIC PROC [v: Vector] RETURNS [v2d: Vector2d] = { v2d[1] _ v[2]; v2d[2] _ v[3]; }; ProjectOntoZXPlane: PUBLIC PROC [v: Vector] RETURNS [v2d: Vector2d] = { v2d[1] _ v[3]; v2d[2] _ v[1]; }; END. rFile: SVVector3dImpl.mesa Author: Eric Bier before January 12, 1983 1:35 pm Last edited by Bier on August 12, 1983 10:52 pm Contents: Vector addition and multiplication and stuff like that. Returns the unit vector with the same direction as v. | i j k | | v1x v1y v1z |=(v1y*v2z - v1z*v2y) i + (v1z*v2x - v1x*v2z) j | v2x v2y v2z |(v1x*v2y - v1y*v2x) k ΚΚ– "cedar" style˜Iheadšœ™Iprocšœ1™1Lšœ/™/LšœA™AL˜šΟk ˜ Lšœ˜Lšœ˜Lšœ ˜ Lšœ ˜ L˜—šœ˜Lšœ˜Lšœ ˜—L˜Lš˜˜Lšœœ˜Lšœ œ˜%L˜šΟnœœœœ˜DLšœ˜Lšœ˜Lšœ˜Lšœ˜—L˜šž œœœœ˜PLšœ˜Lšœ˜Lšœ˜Lšœ˜—L˜š žœœœœœ˜JLšœO˜OLšœ˜—šž œœœ œ˜>Lšœ5™5Lšœœ˜Lšœ˜Lšœ˜Lšœ˜Lšœ˜—šžœœœ œ˜:Lšœ4˜4Lšœ˜—š ž œœœœ œ˜KLšœ1˜1Lšœ˜—šž œœœœ˜NLšœ™Lšœ=™=Lšœ$™$Lšœ%˜%Lšœ%˜%Lšœ%˜%Lšœ˜—L˜š ž œœœ œ œ˜@Lšœ:˜:Lšœ˜—L˜š žœœœœœ˜9Lšœœ˜ Lšœ œœ œœœœ˜?Lšœœ œœ œœœœ˜NLšœ œœ œœœœ˜?Lšœœ œœ œœœœ˜NLšœ œœ œœœœ˜?Lšœœ œœ œœœœ˜NLšœ˜Lšœ˜—L˜š žœœœ œœœ˜9šœœ˜Lš œœœœΟc'˜ALš œœœœœœŸ'˜KLšœœœ˜Lšœ˜—šœ˜šœœ˜Lš œœœœŸ(˜BLšœœ˜Lšœ˜—šœ˜Lšœœœ˜Lšœœœ˜Lšœ˜—Lšœ˜—LšœŸ˜—L˜L˜š ž œœœœœ˜>Lšœ˜Lšœ˜L˜—šžœœœœ˜LLšœ˜Lšœ˜Lšœ˜Lšœ˜—L˜šžœœœœ˜LLšœ˜Lšœ˜Lšœ˜Lšœ˜—L˜šžœœœœ˜LLšœ˜Lšœ˜Lšœ˜Lšœ˜L˜—šžœœœ œ˜GLšœ˜Lšœ˜Lšœ˜—L˜šžœœœ œ˜GLšœ˜Lšœ˜Lšœ˜—L˜šžœœœ œ˜GLšœ˜Lšœ˜Lšœ˜—L˜—Lšœ˜L˜L˜L˜—…— ‚Ύ