OnionCoreArc.mesa 
Copyright © 1985, 1986 by Xerox Corporation. All rights reversed.
Created by Bertrand Serlet, August 17, 1986 10:36:30 pm PDT
Last Edited by: Serlet, July 3, 1985 1:20:20 pm PDT
DIRECTORY
CD, CoreGeometry, Rope;
OnionCoreArc: CEDAR DEFINITIONS =
BEGIN
ROPE: TYPE = Rope.ROPE;
Side: TYPE = CoreGeometry.Side;
Arc: TYPE = REF ArcRec;
ArcRec: TYPE = RECORD [
rect: CD.Rect,     -- this is the bounding rect of all components. The arc, whatever its thickness, is included inside this bbox.
segs: LIST OF Seg -- the ring segments, non sorted
];
Seg: TYPE = REF SegRec;
SegRec: TYPE = RECORD [point1, point2: INT, side1, side2: Side]; -- always rotating in the direct direction (counterClockWise). By convention, point1 is included but point2 is not.
EmptyArc: PROC [rect: CD.Rect] RETURNS [arc: Arc];
Length: PROC [arc: Arc] RETURNS [length: INT ← 0];
ConnectSegBitToArc: PROC [min, max: INT, side: Side, arc: Arc] RETURNS [connection: Arc];
The 2 arcs can be of different sizes
NotOverlapping: PROC [arc1, arc2: Arc, minDist: INT] RETURNS [notOverlapping: BOOLTRUE];
The union is positionned to fit on the largest rect
It is assumed that arc1 and arc2 do not overlap.
Union: PROC [arc1, arc2: Arc] RETURNS [union: Arc];
EachSegBitProc: TYPE = PROC [min, max: INT, side: Side];
EnumerateSegBits: PROC [arc: Arc, eachSegBit: EachSegBitProc];
END.