-- File: SVFaces.mesa -- Last edited by Bier on December 18, 1982 1:15 am -- Author: Eric Bier on August 27, 1982 10:03 am -- Contents: Definitions of various face types such as Cone, Disk Ring, and Cylinder and procedures which make them from simpler data DIRECTORY SV2d, SVBoundBox, SVVector3d; SVFaces: DEFINITIONS = BEGIN BoundBox: TYPE = SVBoundBox.BoundBox; BoundHedron: TYPE = SVBoundBox.BoundHedron; TrigLineSeg: TYPE = REF TrigLineSegObj; TrigLineSegObj: TYPE = SV2d.TrigLineSegObj; Vector: TYPE = SVVector3d.Vector; -- the cone described here is revolute around the y-axis. Otherwise it is very general, allowing for an arbitrary apex point (on the y-axis) and an arbitrary spread ratio. Cone: TYPE = REF ConeObj; ConeObj: TYPE = RECORD [ h: REAL, -- y at the apex M: REAL, -- r/|y-h| yHi, yLo: REAL, normalPointsOut: BOOL, noseIsUp: BOOL, boundHedron: BoundHedron, boundBox: BoundBox]; -- the disk ring described here is revolute around the y-axis. Otherwise it is very general. It may be in an arbitrary horizontal plane (y = yPlane), may have any two radii, rIn and rOut subject to rIn, rOut >= 0 AND rOut > rIn, and may have an upward or downward pointing normal. DiskRing: TYPE = REF DiskRingObj; DiskRingObj: TYPE = RECORD [ yPlane: REAL, normal: Vector, rInSquared, rOutSquared: REAL, boundHedron: BoundHedron, boundBox: BoundBox]; -- the cylinder described here is revolute around the y-axis. Otherwise it is very general. It may have its top and bottom in arbitrary horizontal planes (y = yHigh and y = yLow) subject to yHigh > yLow and may have an arbitrary radius r. Cylinder: TYPE = REF CylinderObj; CylinderObj: TYPE = RECORD [ yHi, yLo: REAL, r: REAL, rSquared: REAL, normalPointsOut: BOOL, boundHedron: BoundHedron, boundBox: BoundBox]; -- the edge on rectangle has a surface normal parallel to the xy plane. That is, it is edge on when viewed from the z direction. EdgeOnRect: TYPE = REF EdgeOnRectObj; EdgeOnRectObj: TYPE = RECORD [ frontZ, backZ: REAL, A, B, D: REAL, -- plane equation Ax + By + D = 0. normal: Vector, valHi, valLo: REAL, valIsY: BOOL, -- valHi and valLo will be y values if the edge on rectangle is more closely verical than horizontal and x values otherwise boundHedron: BoundHedron, boundBox: BoundBox ]; ConeFromTrigLineSeg: PROC [seg: TrigLineSeg] RETURNS [cone: Cone]; AttemptToCreateDegenerateCone: ERROR; DiskRingFromTrigLineSeg: PROC [seg: TrigLineSeg] RETURNS [diskRing: DiskRing]; AttemptToCreateDegenerateDiskRing: ERROR; CylinderFromTrigLineSeg: PROC [seg: TrigLineSeg] RETURNS [cylinder: Cylinder]; AttemptToCreateDegenerateCylinder: ERROR; EdgeOnRectFromTrigLineSeg: PROC [seg: TrigLineSeg, frontZ, backZ: REAL] RETURNS [edgeOnRect: EdgeOnRect]; AttemptToCreateDegenerateEdgeOnRect: ERROR; END.