SVMeasureImpl.mesa
Copyright © 1986 by Xerox Corporation. All rights reserved.
Last edited by Bier on July 8, 1987
Contents: Routines for measuring slopes, angles, and similar quantities in Gargoyle3D scenes.
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] = {
Returns azimuth (angle from the z=0 plane) as a positive number in [0..180).
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 {
On the positive side of the z=0 plane.
degrees ← degrees + 180.0;
};
IF degrees = 180.0 THEN degrees ← 0.0;
};
SlopeOfPoints: PUBLIC PROC [p0, p1: Point3d] RETURNS [degrees: REAL] = {
Returns slope (angle from the y=0 plane) as a positive number in [0..180).
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 {
On the positive side of the z=0 plane.
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] = {
Returns azimuth and slope.
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 {
On the positive side of the z=0 plane.
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 [lengthInDots: REAL] = {
Returns the Euclidean distance between two points in screen dots.
lengthInDots ← SVVector3d.Distance[p0, p1];
};
END.