-- File: SVPolygon2d.mesa -- Last edited by Bier on December 18, 1982 1:07 am -- Author: Eric Bier on August 20, 1982 12:46 pm -- Contents: Routines for creating, manipulating, and playing with polygons. Part of the SolidViews package. DIRECTORY SV2d; SVPolygon2d: DEFINITIONS = BEGIN Point2d: TYPE = SV2d.Point2d; Polygon: TYPE = REF PolygonObj; PolygonObj: TYPE = SV2d.PolygonObj; Path: TYPE = REF PathObj; PathObj: TYPE = SV2d.PathObj; TrigPolygon: TYPE = REF TrigPolygonObj; TrigPolygonObj: TYPE = SV2d.TrigPolygonObj; -- POLYGONS CreatePoly: PROC [len: NAT] RETURNS [poly: Polygon]; CopyPoly: PROC [poly: Polygon] RETURNS [copy: Polygon]; CircumHexagon: PROC [r: REAL] RETURNS [hex: Polygon]; -- creates a hexigon which circumscribes the circle whose center is on the origin and whose radius is r. ClearPoly: PROC [poly: Polygon]; AddPolyPoint: PROC [poly: Polygon, point: Point2d] RETURNS [polyPlusPoint: Polygon]; PutPolyPoint: PROC [poly: Polygon, index: NAT, point: Point2d] RETURNS [newPoly: Polygon]; IsClockwisePoly: PROC [poly: Polygon] RETURNS [BOOL]; InvertPoly: PROC [poly: Polygon] RETURNS [ylop: Polygon]; -- from clockwise to counter-clockwise or vice-versa InvertPolyInPlace: PROC [poly: Polygon]; PartPolyGetsPartPath: PROC [fromPath: Path, fromStart: NAT, toPoly: Polygon, toStart: NAT, duration: NAT] RETURNS [newPoly: Polygon]; -- toPoly in range [toStart..toStart+duration-1] gets -- fromPath in range [fromStart..fromStart+duration-1]; PartPolyGetsPartPoly: PROC [fromPoly: Polygon, fromStart: NAT, toPoly: Polygon, toStart: NAT, duration: NAT] RETURNS [newPoly: Polygon]; -- toPoly in range [toStart..toStart+duration-1] gets -- fromPoly in range [fromStart..fromStart+duration-1]; PathToPolygon: PROC [path: Path] RETURNS [poly: Polygon]; -- TRIG POLYGONS (a richer [and slower] structure) PolygonToTrigPolygon: PROC [poly: Polygon] RETURNS [trigPoly: TrigPolygon]; -- PATHS (open version of a polygon) CreatePath: PROC [len: NAT] RETURNS [path: Path]; CopyPath: PROC [path: Path] RETURNS [copy: Path]; ClearPath: PROC [path: Path]; AddPathPoint: PROC [path: Path, point: Point2d] RETURNS [pathPlusPoint: Path]; InsertPathPoint: PROC [path: Path, point: Point2d] RETURNS [newPath: Path]; SplicePathPoint: PROC [path: Path, point: Point2d, index: INTEGER] RETURNS [newPath: Path]; AttemptToSplicePastEndOfPath: ERROR; DeletePathPoint: PROC [path: Path, index: NAT] RETURNS [newPath: Path]; PutPathPoint: PROC [path: Path, index: NAT, point: Point2d]; ConcatPath: PROC [path1, path2: Path] RETURNS [cat: Path]; SubPath: PROC [path: Path, lo, hi: NAT] RETURNS [subpath: Path]; SubPathOfPoly: PROC [poly: Polygon, lo, hi: NAT] RETURNS [subpath: Path]; ShiftUpPath: PROC [path: Path, startAt: NAT, by: NAT]; ShiftDownPath: PROC [path: Path, startAt: NAT, by: NAT]; -- startAt the index of the highest element which should be shifted down. Must be greater than zero. ShiftingDataOffLeftEnd: ERROR; ShiftingDownNonExistentElements: ERROR; PolygonToPath: PROC [poly: Polygon] RETURNS [path: Path]; PartPathGetsPartPath: PROC [fromPath: Path, fromStart: NAT, toPath: Path, toStart: NAT, duration: NAT] RETURNS [newPath: Path]; -- toPath in range [toStart..toStart+duration-1] gets fromPath in range [fromStart..fromStart+duration-1]; fromPath gets result. PointPolyClass: TYPE = {in, on, out}; DifferenceAngles: PROC [c, v: REAL] RETURNS [cMinusV: REAL]; -- c and v must be angles in the range -180 < theta <= 180. -- dt will be in the rangle -180< dt <= 180. -- we always choose the shortest way around the circle from v to c. CirclePointInPoly: PROC [point: Point2d, poly: Polygon] RETURNS [class: PointPolyClass]; SquarePointInPoly: PROC [point: Point2d, poly: Polygon] RETURNS [class: PointPolyClass]; BoysePointInPoly: PROC [point: Point2d, poly: Polygon] RETURNS [class: PointPolyClass]; SignedArea: PROC [poly: Polygon] RETURNS [area: REAL]; ClockwisePerimeterAroundUnitSquare: PROC [from, to: Point2d] RETURNS [perim: REAL]; END. Κˆ– "Mesa" style˜Iprocš¨Οcœ4 œΟk œž œžœ žœžœžœžœžœžœžœžœžœ!žœΟnœžœžœžœŸœžœžœŸ œžœžœžœiŸ œžœŸ œžœCŸ œžœžœ-œŸœžœžœžœŸ œžœžœHŸœžœŸœžœžœžœ žœnœŸœžœ žœžœ žœ5œ ,œŸ œžœžœGŸœžœžœAŸ œžœžœžœŸœžœžœŸ œžœŸ œžœžœŸœžœžœŸœžœ%žœžœ0žœŸœžœžœžœŸ œžœžœŸ œžœžœŸœžœžœžœŸ œžœžœžœŸ œžœžœžœŸ œžœžœžœeœžœ#žœŸ œžœžœŸœžœžœžœ žœlœœžœŸœžœžœžœ žœ=œ-œDŸœžœ!žœŸœžœ!žœŸœžœ!žœŸ œžœžœžœŸ"œžœžœ žœžœ˜›—…—ž,