<> <> <> <> <> DIRECTORY GGBasicTypes; GGCircles: CEDAR DEFINITIONS = BEGIN Arc: TYPE = GGBasicTypes.Arc; Circle: TYPE = GGBasicTypes.Circle; Point: TYPE = GGBasicTypes.Point; Edge: TYPE = GGBasicTypes.Edge; Line: TYPE = GGBasicTypes.Line; Vector: TYPE = GGBasicTypes.Vector; <<>> <> CreateEmptyCircle: PROC [] RETURNS [circle: Circle]; CopyCircle: PROC [from: Circle, to: Circle]; <> <<>> FillCircleFromPointAndRadius: PROC [pt: Point, radius: REAL, circle: Circle]; <<"circle" now has center at "pt" and radius of "radius".>> CircleFromPointAndRadius: PROC [pt: Point, radius: REAL] RETURNS [circle: Circle]; <> FillCircleFrom3Points: PROC [p0, p1, p2: Point, circle: Circle] RETURNS [linear: BOOL]; <<"circle" now passes through the three points. If the points are roughly collinear, creates a large circle passing through p0 and p2.>> CircleFrom3Points: PROC [p0, p1, p2: Point] RETURNS [circle: Circle, linear: BOOL]; <> CircleMeetsLine: PROC [circle: Circle, line: Line] RETURNS [points: ARRAY [1..2] OF Point, hitCount: [0..2], tangent: BOOL]; <> CircleMeetsEdge: PROC [circle: Circle, edge: Edge] RETURNS [points: ARRAY [1..2] OF Point, hitCount: [0..2], tangent: BOOL]; <> CircleMeetsCircle: PROC [circle1, circle2: Circle] RETURNS [points: ARRAY [1..2] OF Point, hitCount: [0..2], tangent: BOOL]; <> CircleMeetsArc: PROC [circle: Circle, arc: Arc] RETURNS [points: ARRAY [1..2] OF Point, hitCount: [0..2], tangent: BOOL]; <> ArcMeetsLine: PROC [arc: Arc, line: Line] RETURNS [points: ARRAY [1..2] OF Point, hitCount: [0..2], tangent: BOOL]; <> ArcMeetsEdge: PROC [arc: Arc, edge: Edge] RETURNS [points: ARRAY [1..2] OF Point, hitCount: [0..2], tangent: BOOL]; <> ArcMeetsArc: PROC [arc1, arc2: Arc] RETURNS [points: ARRAY [1..2] OF Point, hitCount: [0..2], tangent: BOOL]; <> SignedCircleDistance: PROC [pt: Point, circle: Circle] RETURNS [d: REAL]; CircleDistance: PROC [pt: Point, circle: Circle] RETURNS [d: REAL]; PointProjectedOntoCircle: PROC [pt: Point, circle: Circle] RETURNS [projectedPt: Point]; <> <> <> <> <<>> <> CreateEmptyArc: PROC RETURNS [arc: Arc]; CopyArc: PROC [from: Arc, to: Arc]; FillArc: PROC [v0, v1, v2: Point, arc: Arc]; CreateArc: PROC [v0, v1, v2: Point] RETURNS [arc: Arc]; CirclePointOnArc: PROC [pt: Point, arc: Arc] RETURNS [BOOL]; <> NearestEndpoint: PROC [pt: Point, arc: Arc] RETURNS [endpoint: Point]; DistanceSquaredToNearestEndpoint: PROC [pt: Point, arc: Arc] RETURNS [distanceSquared: REAL]; NearestPointOnArc: PROC [pt: Point, arc: Arc] RETURNS [onArc: Point]; <> <<>> DistancePointToArc: PROC [pt: Point, arc: Arc] RETURNS [distance: REAL]; <> DistanceSquaredPointToArc: PROC [pt: Point, arc: Arc] RETURNS [distanceSquared: REAL]; OnArc: PROC [pt: Point, arc: Arc] RETURNS [BOOL]; <<>> END.