<> <> <> <> <<>> DIRECTORY SV2d, SV3d, SVMeasure, SVVector2d, SVVector3d; SVMeasureImpl: CEDAR PROGRAM IMPORTS SVVector2d, SVVector3d EXPORTS SVMeasure = BEGIN Point3d: TYPE = SV3d.Point3d; Vector3d: TYPE = SV3d.Vector3d; Vector2d: TYPE = SV2d.Vector2d; AzimuthOfPoints: PUBLIC PROC [p0, p1: Point3d] RETURNS [degrees: REAL] = { <> vector: Vector3d; vectorShadow: Vector2d; epsilon: REAL = 1.0E-8; vector _ SVVector3d.Sub[p1, p0]; vectorShadow _ [vector[1], -vector[3]]; IF SVVector2d.MagnitudeSquared[vectorShadow] < epsilon THEN degrees _ 0.0 ELSE degrees _ SVVector2d.AngleFromVector[vectorShadow]; IF degrees<0.0 THEN { <> degrees _ degrees + 180.0; }; IF degrees = 180.0 THEN degrees _ 0.0; }; SlopeOfPoints: PUBLIC PROC [p0, p1: Point3d] RETURNS [degrees: REAL] = { <> vector: Vector3d; vectorShadow: Vector2d; angleFromVertical, azimuth: REAL; epsilon: REAL = 1.0E-8; vector _ SVVector3d.Sub[p1, p0]; vectorShadow _ [vector[1], -vector[3]]; IF SVVector2d.MagnitudeSquared[vectorShadow] < epsilon THEN azimuth _ 0.0 ELSE azimuth _ SVVector2d.AngleFromVector[vectorShadow]; angleFromVertical _ SVVector3d.AngleCCWBetweenVectors[[0,1,0], vector]; IF azimuth<0.0 THEN { <> azimuth _ azimuth + 180.0; degrees _ angleFromVertical + 90.0; } ELSE degrees _ 90.0 - angleFromVertical; IF degrees >= 180.0 THEN degrees _ degrees - 180.0 ELSE IF degrees < 0.0 THEN degrees _ degrees + 180.0; }; AzimuthAndSlopeOfPoints: PUBLIC PROC [p0, p1: Point3d] RETURNS [azimuth, slope: REAL] = { <> vector: Vector3d; vectorShadow: Vector2d; angleFromVertical: REAL; epsilon: REAL = 1.0E-8; vector _ SVVector3d.Sub[p1, p0]; vectorShadow _ [vector[1], -vector[3]]; IF SVVector2d.MagnitudeSquared[vectorShadow] < epsilon THEN azimuth _ 0.0 ELSE azimuth _ SVVector2d.AngleFromVector[vectorShadow]; IF vector = [0,0,0] THEN RETURN[0.0, 0.0]; angleFromVertical _ SVVector3d.AngleCCWBetweenVectors[[0,1,0], vector]; IF azimuth<0.0 THEN { <> azimuth _ azimuth + 180.0; slope _ angleFromVertical + 90.0; } ELSE slope _ 90.0 - angleFromVertical; IF azimuth = 180.0 THEN azimuth _ 0.0; IF slope >= 180.0 THEN slope _ slope - 180.0 ELSE IF slope < 0.0 THEN slope _ slope + 180.0; }; DistanceBetweenPoints: PUBLIC PROC [p0, p1: Point3d] RETURNS [distance: REAL] = { <> distance _ SVVector3d.Distance[p0, p1]; }; END.