<> <> <> <> DIRECTORY CGArea, CGClipper, CGReducer, GraphicsBasic, PolygonDefs; Polygon: CEDAR PROGRAM IMPORTS CGArea, CGClipper, CGReducer EXPORTS PolygonDefs = BEGIN OPEN PolygonDefs; PolyCreate: PUBLIC PROCEDURE RETURNS [polygon: PolygonDescriptor] = <> BEGIN polygon _ CGReducer.New[size: 4]; CGClipper.Load[self: clipper, reducer: polygon]; END; PolyVertex: PUBLIC PROCEDURE [polygon: PolygonDescriptor, x, y: REAL] = <> {CGReducer.Vertex[self: polygon, v: [x: x, y: y]]}; PolyGenerate: PUBLIC PROCEDURE [ polygon: PolygonDescriptor, outputTrapezoid: PROCEDURE [llx, lrx, ly, ulx, urx, uy: REAL]] = <> BEGIN tiling: CGArea.Ref = CGArea.New[size: 4]; CGReducer.Close[polygon]; CGReducer.Generate[self: polygon, area: tiling]; UNTIL CGArea.Empty[tiling] DO t: GraphicsBasic.Trap = CGArea.Remove[tiling]; outputTrapezoid[llx: t.xbotL, lrx: t.xbotR, ly: t.ybot, ulx: t.xtopL, urx: t.xtopR, uy: t.ytop]; ENDLOOP; END; PolyDestroy: PUBLIC PROCEDURE [polygon: PolygonDescriptor] = <> {NULL}; huge: REAL _ 1.0E20; clipper: CGClipper.Ref _ CGClipper.New[size: 4]; CGClipper.SetBox[self: clipper, box: [xmin: -huge, ymin: -huge, xmax: huge, ymax: huge]]; END.