<<>> <> <> <> <> DIRECTORY G2dBasic, G3dBasic, G3dMatrix, G3dPlane; G3dPolygon: CEDAR DEFINITIONS ~ BEGIN <> PolygonProc: TYPE ~ PROC [nPolygon: NAT, polygon: NatSequence] RETURNS [continue: BOOL ¬ TRUE]; << nPolygon is polygon id; polygon is sequence of vertex indices.>> <> Triangle: TYPE ~ REF TriangleRep; TriangleRep: TYPE ~ RECORD [ p0, p1, p2: Triple ¬ [], -- triangle vertices a0, a1, a2: Quad ¬ [], -- nearness accelerators l0, l1, l2: Triple ¬ [], -- planar line equations plane: Plane ¬ [], -- plane of triangle majorPlane: MajorPlane ¬ xy, -- major plane of triangle refAny: REF ANY ¬ NIL -- for client use ]; Polygon: TYPE ~ REF PolygonRep; PolygonRep: TYPE ~ RECORD [ points: TripleSequence ¬ NIL, -- sequence of points indices: NatSequence ¬ NIL, -- to points, if nil use points only normal: Triple ¬ [], -- polygon normal plane: Plane ¬ [], -- plane of polygon majorPlane: MajorPlane ¬ unknown, -- major plane of polygon center: Triple ¬ [], -- center of polygon area: REAL ¬ 0.0, -- area of polygon fwdFacing: BOOL ¬ FALSE, -- true if facing towards eyepoint accs: QuadSequence ¬ NIL, -- nearness accelerators lines: TripleSequence ¬ NIL, -- planar line equations neighbors: PolygonSequence ¬ NIL, -- neighbor across edge convex: BOOL ¬ TRUE, -- if polygon is convex refAny: REF ANY ¬ NIL -- for client use ]; <> <> <> NearTriangle: TYPE ~ RECORD [ point: Triple ¬ [], -- point on triangle inside: BOOL ¬ FALSE, -- true iff point inside triangle w0, w1, w2: REAL ¬ 0.0 -- point = w0*p0+w1*p1+w2*p2 ]; NearPolygon: TYPE ~ RECORD [ point: Triple ¬ [], -- point on polygon inside: BOOL ¬ FALSE, -- true iff point is inside polygon distance: REAL ¬ 0.0 -- distance to point on polygon ]; <> TriangleSequence: TYPE ~ REF TriangleSequenceRep; TriangleSequenceRep: TYPE ~ RECORD [ length: CARDINAL ¬ 0, element: SEQUENCE maxLength: CARDINAL OF Triangle ]; PolygonSequence: TYPE ~ REF PolygonSequenceRep; PolygonSequenceRep: TYPE ~ RECORD [ forwardFacingValid: BOOL ¬ FALSE, normalsValid: BOOL ¬ FALSE, centersValid: BOOL ¬ FALSE, areasValid: BOOL ¬ FALSE, length: CARDINAL ¬ 0, element: SEQUENCE maxLength: CARDINAL OF Polygon ]; Nat3Sequence: TYPE ~ REF Nat3SequenceRep; Nat3SequenceRep: TYPE ~ RECORD [ length: CARDINAL ¬ 0, element: SEQUENCE maxLength: CARDINAL OF Nat3 ]; <> Border: TYPE ~ G2dBasic.Border; Nat3: TYPE ~ G2dBasic.Nat3; NatSequence: TYPE ~ G3dBasic.NatSequence; SurfaceSequence: TYPE ~ G3dBasic.SurfaceSequence; Quad: TYPE ~ G3dBasic.Quad; QuadSequence: TYPE ~ G3dBasic.QuadSequence; RealSequence: TYPE ~ G3dBasic.RealSequence; Segment: TYPE ~ G3dBasic.Segment; Triple: TYPE ~ G3dBasic.Triple; TripleSequence: TYPE ~ G3dBasic.TripleSequence; Matrix: TYPE ~ G3dMatrix.Matrix; Plane: TYPE ~ G3dPlane.Plane; MajorPlane: TYPE ~ G3dPlane.MajorPlane; <> SetTriangle: PROC [triangle: Triangle, accs, lines: BOOL ¬ FALSE]; <> <> <> <> <<>> SetPolygon: PROC [ polygon: Polygon, vertices: TripleSequence ¬ NIL, normal, center, area, accs, lines: BOOL ¬ FALSE]; <> <> <> <> <> <> <> <> <> <<>> SetPolygonNeighbors: PROC [polygons: PolygonSequence]; <> <> IsConvex: PROC [polygon: Polygon] RETURNS [BOOL]; <> <<>> NPoints: PROC [points: TripleSequence, polygon: NatSequence ¬ NIL] RETURNS [NAT]; <> PolygonFlatness: PROC [ points: TripleSequence, polygon: NatSequence ¬ NIL, polygonPlane: Plane ¬ []] RETURNS [REAL]; <> <> <<>> PolygonReverse: PROC [poly: NatSequence] RETURNS [NatSequence]; <> <> InsidePolygon: PROC [q: Triple, polygon: Polygon] RETURNS [Border]; <> <> <<>> InsidePolygonXY: PROC [q: Triple, points: TripleSequence, indices: NatSequence ¬ NIL] RETURNS [Border]; <> <<>> InsidePolygonXZ: PROC [q: Triple, points: TripleSequence, indices: NatSequence ¬ NIL] RETURNS [Border]; <> <<>> InsidePolygonYZ: PROC [q: Triple, points: TripleSequence, indices: NatSequence ¬ NIL] RETURNS [Border]; <> <> TriangleArea: PROC [p0, p1, p2: Triple] RETURNS [REAL]; <> <<>> PolygonArea: PROC [ points: TripleSequence, polygon: NatSequence ¬ NIL, polygonPlane: Plane ¬ []] RETURNS [REAL]; <> <> PolygonAreas: PROC [ points: TripleSequence, polygons: SurfaceSequence, areas: RealSequence ¬ NIL] RETURNS [RealSequence]; <> <> PolygonAngles: PROC [ points: TripleSequence, polygon: NatSequence ¬ NIL, angles: RealSequence ¬ NIL] RETURNS [RealSequence]; <> <> <<>> TriangleAngles: PROC [p0, p1, p2: Triple] RETURNS [Triple]; <> <
> TriangleCenter: PROC [p0, p1, p2: Triple] RETURNS [Triple]; <> PolygonCenter: PROC [ points: TripleSequence, polygon: NatSequence ¬ NIL, solid: BOOL ¬ TRUE] RETURNS [Triple]; <> <> <> PolygonCenters: PROC [ points: TripleSequence, polygons: SurfaceSequence, solid: BOOL ¬ TRUE, centers: TripleSequence ¬ NIL] RETURNS [TripleSequence]; <> <> TriangleNormal: PROC [p0, p1, p2: Triple, unitize: BOOL ¬ FALSE] RETURNS [Triple]; <> <> << >> PolygonNormal: PROC [ points: TripleSequence, polygon: NatSequence ¬ NIL, normalize: BOOL ¬ FALSE] RETURNS [Triple]; <> <> <> <> <> << >> PolygonNormals: PROC [ points: TripleSequence, polygons: SurfaceSequence, normals: TripleSequence ¬ NIL, unitize: BOOL ¬ FALSE] RETURNS [TripleSequence]; <> <> <> NearestToTriangle: PROC [triangle: Triangle, q: Triple] RETURNS [NearTriangle]; <> <> <> <> <> <> <<>> NearestToPolygon: PROC [polygon: Polygon, q: Triple] RETURNS [NearPolygon]; <> <> <> <> <> <<>> NearestTriangleEdge: PROC [triangle: Triangle, q: Triple] RETURNS [Segment]; <> <<>> NearestPolygonEdge: PROC [polygon: Polygon, q: Triple] RETURNS [Segment]; <> <> ApplyToPolygons: PROC [polygonProc: PolygonProc, polygons: SurfaceSequence]; <> <<>> ApplyToFrontFacingPolygons: PROC [ polygonProc: PolygonProc, polygons: SurfaceSequence, view: Matrix, faceCenters: TripleSequence, normals: TripleSequence]; <> <> Triangulate2Polygons: PROC [polygon0, polygon1: NatSequence, points: TripleSequence] RETURNS [Nat3Sequence]; <> <> <> <> <> CopyPolygonSequence: PROC [polygons: PolygonSequence] RETURNS [PolygonSequence]; <> <<>> AddToPolygonSequence: PROC [polygons: PolygonSequence, polygon: Polygon] RETURNS [PolygonSequence]; <> <<>> LengthenPolygonSequence: PROC [polygons: PolygonSequence, amount: REAL ¬ 1.3] RETURNS [PolygonSequence]; <> <<>> CopyTriangleSequence: PROC [triangles: TriangleSequence] RETURNS [TriangleSequence]; <> <<>> AddToTriangleSequence: PROC [triangles: TriangleSequence, triangle: Triangle] RETURNS [TriangleSequence]; <> <<>> LengthenTriangleSequence: PROC [triangles: TriangleSequence, amount: REAL ¬ 1.3] RETURNS [TriangleSequence]; <> END.