DIRECTORY Matrix3d, RealFns, Rope, Vector3d; Vector3dImpl: CEDAR PROGRAM IMPORTS Matrix3d, RealFns EXPORTS Vector3d ~ BEGIN Triple: TYPE ~ Vector3d.Triple; Line: TYPE ~ Vector3d.Line; Null: PUBLIC PROC [v: Triple] RETURNS [BOOL] ~ { RETURN[v.x = 0.0 AND v.y = 0.0 AND v.z = 0.0]; }; Equal: PUBLIC PROC [v1, v2: Triple, tol: REAL _ 0.001] RETURNS [BOOL] ~ { RETURN[ABS[v1.x-v2.x] 0.000001 THEN Normalize[[v1.x-dot*v0.x, v1.y-dot*v0.y, v1.z-dot*v0.z]] ELSE v1]; }; Ortho: PUBLIC PROC [v: Triple, crosser: Triple _ [0.0, 0.0, 0.0]] RETURNS [Triple] ~ { mag: REAL _ Mag[v]; IF Equal[crosser, v] THEN crosser _ [crosser.z, crosser.y, crosser.x]; RETURN[IF mag = 0.0 THEN [0.0, 0.0, 0.0] ELSE Mul[Normalize[Cross[v, crosser]], mag]]; }; RotateAbout: PUBLIC PROC [v, axis: Triple, a: REAL, degrees: BOOL _ TRUE] RETURNS [Triple] ~ { rotate: Matrix3d.Matrix _ Matrix3d.MakePureRotate[axis, a, degrees]; RETURN[Matrix3d.TransformVec[v, rotate]]; }; Collinear: PUBLIC PROC [p1, p2, p3: Triple, tol: REAL _ 0.01] RETURNS [BOOL] ~ { RETURN[Parallel[Sub[p1, p2], Sub[p2, p3], tol]]; }; VecsCoplanar: PUBLIC PROC [v1, v2, v3: Triple, tol: REAL _ 0.01] RETURNS [BOOL] ~ { e1: REAL _ v1.x*(v2.y*v3.z-v3.y*v2.z); e2: REAL _ v1.y*(v2.x*v3.z-v3.x*v2.z); e3: REAL _ v1.z*(v2.x*v3.y-v3.x*v2.y); RETURN[ABS[e2-e1-e3] < tol]; }; PtsCoplanar: PUBLIC PROC [p1, p2, p3, p4: Triple, tol: REAL _ 0.01] RETURNS [BOOL] ~ { RETURN[VecsCoplanar[Sub[p4, p1], Sub[p3, p1], Sub[p2, p1], tol]]; }; Parallel: PUBLIC PROC [v1, v2: Triple, tol: REAL _ 0.005] RETURNS [BOOL] ~ { par: BOOL _ FALSE; temp1: Triple _ Normalize[v1]; temp2: Triple _ Normalize[v2]; RETURN[ABS[Dot[temp1, temp2]] > 1.-tol]; }; Perp: PUBLIC PROC [v1, v2: Triple, tol: REAL _ 0.005] RETURNS [BOOL _ FALSE] ~ { perp: BOOL _ FALSE; temp1: Triple _ Normalize[v1]; temp2: Triple _ Normalize[v2]; RETURN[ABS[Dot[temp1, temp2]] < tol]; }; PtOnLine: PUBLIC PROC [p: Triple, l: Line, tol: REAL _ 0.005] RETURNS [BOOL] ~ { RETURN[Distance[p, LinePoint[p, l]] < tol]; }; Mul: PUBLIC PROC [v: Triple, s: REAL] RETURNS [Triple] ~ { RETURN[[v.x*s, v.y*s, v.z*s]]; }; Div: PUBLIC PROC [v: Triple, s: REAL] RETURNS [Triple] ~ { RETURN[IF s # 0.0 THEN [v.x/s, v.y/s, v.z/s] ELSE [v.x, v.y, v.z]]; }; MulC: PUBLIC PROC [v1, v2: Triple] RETURNS [Triple] ~ { RETURN[[v1.x*v2.x, v1.y*v2.y, v1.z*v2.z]]; }; DivC: PUBLIC PROC [v1, v2: Triple] RETURNS [Triple] ~ { ret: Triple _ v1; IF v2.x # 0.0 THEN ret.x _ ret.x/v2.x; IF v2.y # 0.0 THEN ret.y _ ret.x/v2.y; IF v2.z # 0.0 THEN ret.z _ ret.x/v2.z; RETURN[ret]; }; PolarFromCartesian: PUBLIC PROC [cartesian: Triple] RETURNS [Triple] ~ { xzSum: REAL _ cartesian.x*cartesian.x+cartesian.z*cartesian.z; lng: REAL _ RealFns.ArcTanDeg[cartesian.z, cartesian.x]; lat: REAL _ RealFns.ArcTanDeg[cartesian.y, RealFns.SqRt[xzSum]]; mag: REAL _ RealFns.SqRt[xzSum+cartesian.y*cartesian.y]; IF lat < 0.0 THEN lat _ 360.0+lat; RETURN[[lng, lat, mag]]; }; CartesianFromPolar: PUBLIC PROC [polar: Triple] RETURNS [Triple] ~ { cosmag: REAL _ RealFns.CosDeg[polar.y]*polar.z; RETURN[[ cosmag*RealFns.CosDeg[polar.x], polar.z*RealFns.SinDeg[polar.y], cosmag*RealFns.SinDeg[polar.x]]]; }; END. *Vector3dImpl.mesa Copyright c 1984 by Xerox Corporation. All rights reserved. Bloomenthal, February 19, 1986 10:25:24 am PST Standard Geometric Operations on 3d vectors or points Compute determinant of matrix of vectors: Scalar Operations Component-wise Operations Miscellaneous Operations Κ=˜šœ™Jšœ Οmœ1™Jšœžœ/˜8Jšœžœ7˜@Jšœžœ/˜8Jšžœ žœ˜"Jšžœ˜J˜J˜—š œžœžœžœ ˜DJšœžœ#˜/šžœ˜Jšœ˜Jšœ ˜ Jšœ!˜!—J˜J˜——Jšžœ˜J˜J˜—…—κQ