DIRECTORY G2dBasic, G2dVector, G3dBasic, G3dPolygon, G3dShape, G3dVector, G3dWingedEdge, IO, Rope; G3dWingedEdgeImpl: CEDAR PROGRAM IMPORTS G2dBasic, G2dVector, G3dBasic, G3dShape, G3dVector, IO, Rope EXPORTS G3dWingedEdge ~ BEGIN Face: TYPE ~ G3dShape.Face; FaceRep: TYPE ~ G3dShape.FaceRep; FaceSequence: TYPE ~ G3dShape.FaceSequence; FaceSequenceRep: TYPE ~ G3dShape.FaceSequenceRep; Validity: TYPE ~ G3dShape.Validity; IntSequence: TYPE ~ G3dBasic.IntSequence; IntSequenceRep: TYPE ~ G3dBasic.IntSequenceRep; NatSequence: TYPE ~ G3dBasic.NatSequence; NatSequenceRep: TYPE ~ G3dBasic.NatSequenceRep; RealSequence: TYPE ~ G3dBasic.RealSequence; ROPE: TYPE ~ Rope.ROPE; Shape: TYPE ~ G3dShape.Shape; ShapeRep: TYPE ~ G3dShape.ShapeRep; Surface: TYPE ~ G3dBasic.Surface; SurfaceSequence: TYPE ~ G3dBasic.SurfaceSequence; SurfaceSequenceRep: TYPE ~ G3dBasic.SurfaceSequenceRep; Triple: TYPE ~ G3dBasic.Triple; TripleSequence: TYPE ~ G3dBasic.TripleSequence; Vertex: TYPE ~ G3dShape.Vertex; VertexRep: TYPE ~ G3dShape.VertexRep; VertexSequence: TYPE ~ G3dShape.VertexSequence; VertexSequenceRep: TYPE ~ G3dShape.VertexSequenceRep; WEdge: TYPE ~ G3dWingedEdge.WEdge; WEdgeRep: TYPE ~ G3dWingedEdge.WEdgeRep; WEdgeData: TYPE ~ G3dWingedEdge.WEdgeData; WEdgeDataRep: TYPE ~ G3dWingedEdge.WEdgeDataRep; WFace: TYPE ~ G3dWingedEdge.WFace; WFaceRep: TYPE ~ G3dWingedEdge.WFaceRep; WShape: TYPE ~ G3dWingedEdge.WShape; WShapeRep: TYPE ~ G3dWingedEdge.WShapeRep; WVertex: TYPE ~ G3dWingedEdge.WVertex; WVertexRep: TYPE ~ G3dWingedEdge.WVertexRep; WVertexProc: TYPE ~ G3dWingedEdge.WVertexProc; WEdgeProc: TYPE ~ G3dWingedEdge.WEdgeProc; WFaceProc: TYPE ~ G3dWingedEdge.WFaceProc; ClockDirection: TYPE ~ G3dWingedEdge.ClockDirection; Error: PUBLIC ERROR [code: ATOM, reason: ROPE] = CODE; ShapeFromWingedEdge: PUBLIC PROC [wShape: WShape] RETURNS [shape: Shape] ~ { shape NEW[ShapeRep []]; shape.vertices GetVerticesFromWingedEdge[wShape]; shape.surfaces GetSurfacesFromWingedEdge[wShape]; shape.faces GetFacesFromWingedEdge[wShape]; }; WingedEdgeFromShape: PUBLIC PROC [shape: Shape] RETURNS [wShape: WShape] ~ { localShape: Shape G3dShape.CopyShape[shape]; G3dShape.SetFaceNormals[localShape]; wShape NEW[WShapeRep []]; wShape.vertexRing VerticesFromShape[localShape]; wShape.faceRing FacesFromShape[localShape]; wShape.edgeRing EdgesFromShape[localShape, wShape]; BuildFaceEdgeRings[localShape, wShape]; BuildVertexEdgeRings[localShape, wShape]; BuildEdgeFaceAndWingPointers[localShape, wShape]; }; VerticesFromShape: PROC [shape: Shape] RETURNS [vRing: WVertex NIL] ~ { IF shape.vertices.length = 0 THEN RETURN; FOR i: INT IN [0 .. shape.vertices.length) DO newVertex: WVertex NEW[WVertexRep []]; newVertex.basicVertex NEW[VertexRep shape.vertices[i]]; shape.vertices[i].ref newVertex; newVertex.index i; vRing InsertVertexIntoRing[newVertex, vRing]; ENDLOOP; }; EdgesFromShape: PROC [shape: Shape, wShape: WShape] RETURNS [eRing: WEdge NIL] ~ { count: INT 0; IF shape.surfaces.length = 0 THEN RETURN; FOR i: INT IN [0 .. shape.surfaces.length) DO surface: Surface shape.surfaces[i]; FOR j: INT IN [0 .. surface.vertices.length) DO v1: NAT surface.vertices[j]; v2: NAT surface.vertices[(j+1) MOD surface.vertices.length]; v1V: WVertex NARROW[shape.vertices[v1].ref]; v2V: WVertex NARROW[shape.vertices[v2].ref]; IF GetEdgeFromVertices[v1V, v2V, eRing] = NIL THEN { newEdge: WEdge NEW[WEdgeRep []]; newEdge.edgeData NEW[WEdgeDataRep []]; newEdge.edgeData.aVertex v1V; newEdge.edgeData.bVertex v2V; newEdge.edgeData.index count; newEdge.edgeData.owner newEdge; count count+1; eRing InsertEdgeIntoRing[newEdge, eRing]; }; ENDLOOP; ENDLOOP; }; FacesFromShape: PROC [shape: Shape] RETURNS [fRing: WFace NIL] ~ { IF shape.surfaces.length = 0 THEN RETURN; FOR i: INT IN [0 .. shape.surfaces.length) DO newFace: WFace NEW[WFaceRep []]; IF shape.faces # NIL THEN newFace.basicFace NEW[FaceRep shape.faces[i]]; shape.surfaces[i].clientData newFace; newFace.index i; fRing InsertFaceIntoRing[newFace, fRing]; ENDLOOP; }; BuildFaceEdgeRings: PROC [shape: Shape, wShape: WShape] ~ { BuildFaceEdgeRing: PROC [f: WFace, surface: Surface] RETURNS [eRing: WEdgeNIL] ~ { FOR j: INT IN [0 .. surface.vertices.length) DO v1: NAT surface.vertices[j]; v2: NAT surface.vertices[(j+1) MOD surface.vertices.length]; v1V: WVertex NARROW[shape.vertices[v1].ref]; v2V: WVertex NARROW[shape.vertices[v2].ref]; e: WEdge GetEdgeFromVertices[v1V, v2V, wShape.edgeRing]; newEdge: WEdge NEW[WEdgeRep []]; newEdge.edgeData e.edgeData; eRing InsertEdgeIntoRing[newEdge, eRing]; ENDLOOP; }; f: WFace wShape.faceRing; index: INT 0; WHILE ((index = 0) OR (f # wShape.faceRing)) DO surface: Surface shape.surfaces[index]; f.edgeRing BuildFaceEdgeRing[f, surface]; index index+1; f f.next; ENDLOOP; }; BuildVertexEdgeRings: PROC [shape: Shape, wShape: WShape] ~ { BuildVertexEdgeRing: PROC [v: WVertex] RETURNS [eRing: WEdge NIL] ~ { e: WEdge wShape.edgeRing; didLoop: BOOL FALSE; WHILE ((didLoop = FALSE) OR (e # wShape.edgeRing)) DO IF e.edgeData.aVertex = v OR e.edgeData.bVertex = v THEN { newEdge: WEdge NEW[WEdgeRep []]; newEdge.edgeData e.edgeData; eRing InsertEdgeIntoRing[newEdge, eRing]; }; didLoop TRUE; e e.next; ENDLOOP; }; v: WVertex wShape.vertexRing; didLoop: BOOL FALSE; WHILE ((didLoop = FALSE) OR (v # wShape.vertexRing)) DO v.edgeRing BuildVertexEdgeRing[v]; didLoop TRUE; v v.next; ENDLOOP; }; SortVertexEdges: PROC [wShape: WShape] ~ { SortVertex: PROC [v: WVertex] RETURNS [eRing: WEdge NIL] ~ { EdgeFromRingByIndex: PROC [i: INT] RETURNS [WEdge] ~ { e: WEdge v.edgeRing; FOR j: INT IN [0 .. i) DO e e.next; ENDLOOP; RETURN[e]; }; FirstUnusedEdge: PROC [ns: IntSequence] RETURNS [INT] ~ { FOR i: INT IN [0 .. es.length) DO IF es[i] >= 0 THEN RETURN[i]; ENDLOOP; RETURN[-1]; }; MarkEdge: PROC [target: WEdge] ~ { FOR i: INT IN [0 .. es.length) DO IF es[i] = target.edgeData.index THEN { es[i] -1; RETURN; }; ENDLOOP; Error[$BookKeeping, "Couldn't clear desired target edge from vertex list"]; }; BackUpEdges: PROC [firstE: WEdge] RETURNS [WEdge] ~ { newE: WEdge firstE; nextE: WEdge firstE; DO IF newE.edgeData.aVertex = v THEN nextE newE.edgeData.bCWedge ELSE nextE newE.edgeData.aCWedge; IF nextE.edgeData = firstE.edgeData THEN RETURN[firstE]; IF nextE = NIL THEN RETURN[newE]; newE nextE; ENDLOOP; }; AddToEring: PROC [firstE: WEdge] ~ { AddEdge: PROC [e: WEdge] ~ { newEdge: WEdge NEW[WEdgeRep e]; eRing InsertEdgeIntoRing[newEdge, eRing]; MarkEdge[e]; }; newE: WEdge firstE; nextE: WEdge firstE; DO AddEdge[newE]; IF newE.edgeData.aVertex = v THEN nextE newE.edgeData.aCCWedge ELSE nextE newE.edgeData.bCCWedge; IF nextE.edgeData = firstE.edgeData THEN RETURN; newE nextE; ENDLOOP; }; InitEdgeSequence: PROC RETURNS [es: IntSequence] ~ { numEdges: INT CountEdgesAroundVertex[v]; e: WEdge v.edgeRing; count: INT 0; es NEW[IntSequenceRep[numEdges]]; es.length numEdges; DO es[count] e.edgeData.index; count count+1; e e.next; IF e = v.edgeRing THEN RETURN; ENDLOOP; }; es: IntSequence InitEdgeSequence[]; firstBlank: INT FirstUnusedEdge[es]; WHILE firstBlank >= 0 DO keyEdge: WEdge EdgeFromRingByIndex[firstBlank]; keyEdge BackUpEdges[keyEdge]; AddToEring[keyEdge]; firstBlank FirstUnusedEdge[es]; ENDLOOP; }; v: WVertex wShape.vertexRing; didLoop: BOOL FALSE; WHILE ((didLoop = FALSE) OR (v # wShape.vertexRing)) DO v.edgeRing SortVertex[v]; didLoop TRUE; v v.next; ENDLOOP; }; BuildEdgeFaceAndWingPointers: PROC [shape: Shape, wShape: WShape] ~ { WalkFace: PROC [face: WFace, surface: Surface] ~ { FOR j: INT IN [0 .. surface.vertices.length) DO v0: NAT surface.vertices[(j-1) MOD surface.vertices.length]; v1: NAT surface.vertices[j]; v2: NAT surface.vertices[(j+1) MOD surface.vertices.length]; v3: NAT surface.vertices[(j+2) MOD surface.vertices.length]; v0V: WVertex NARROW[shape.vertices[v0].ref]; v1V: WVertex NARROW[shape.vertices[v1].ref]; v2V: WVertex NARROW[shape.vertices[v2].ref]; v3V: WVertex NARROW[shape.vertices[v3].ref]; e: WEdge GetEdgeFromVertices[v1V, v2V, wShape.edgeRing]; ed: WEdgeData e.edgeData; IF ed.aVertex = v1V THEN { -- this is a clockwise edge ed.aFace face; ed.aCWedge GetEdgeFromVertices[v2V, v3V, wShape.edgeRing]; ed.aCCWedge GetEdgeFromVertices[v0V, v1V, wShape.edgeRing]; } ELSE { -- this is a counter-clockwise edge ed.bFace face; ed.bCWedge GetEdgeFromVertices[v2V, v3V, wShape.edgeRing]; ed.bCCWedge GetEdgeFromVertices[v0V, v1V, wShape.edgeRing]; }; ENDLOOP; }; f: WFace wShape.faceRing; index: INT 0; WHILE ((index = 0) OR (f # wShape.faceRing)) DO surface: Surface shape.surfaces[index]; WalkFace[f, surface]; index index+1; f f.next; ENDLOOP; }; GetVerticesFromWingedEdge: PROC [wShape: WShape] RETURNS [vs: VertexSequence] ~ { didLoop: BOOL FALSE; v: WVertex wShape.vertexRing; vs NEW[VertexSequenceRep[0]]; vs.valid wShape.vertexValidities; IF wShape.vertexRing = NIL THEN RETURN; WHILE (NOT didLoop) OR (v # wShape.vertexRing) DO vs G3dShape.AddToVertexSequence[vs, v.basicVertex]; v v.next; didLoop TRUE; ENDLOOP; }; GetSurfacesFromWingedEdge: PROC [wShape: WShape] RETURNS [ss: SurfaceSequence] ~ { WalkFace: PROC [face: WFace] RETURNS [ns: NatSequence NIL] ~ { AddVertex: PROC [v: WVertex] ~ { ns G2dBasic.AddToNatSequence[ns, v.index]; }; loopCount: INT 0; e: WEdge face.edgeRing; n1, n2: WVertex; o1: WVertex e.edgeData.aVertex; o2: WVertex e.edgeData.bVertex; IF face.edgeRing = NIL THEN RETURN; WHILE (loopCount = 0) OR (e.edgeData # face.edgeRing.edgeData) DO e NextEdgeAroundFaceFromEdge[e, face, cw]; IF e.edgeData = face.edgeRing.edgeData THEN EXIT; n1 e.edgeData.aVertex; n2 e.edgeData.bVertex; IF loopCount=0 THEN { SELECT TRUE FROM (o1 = n1) OR (o1 = n2) => AddVertex[o1]; (o2 = n1) OR (o2 = n2) => AddVertex[o2]; ENDCASE => Error[$BadTopology, "These edges don't link"]; }; IF e # face.edgeRing THEN SELECT TRUE FROM (o1 = n2) OR (o2 = n2) => AddVertex[n1]; (o1 = n1) OR (o2 = n1) => AddVertex[n2]; ENDCASE => Error[$BadTopology, "These edges don't link"]; o1 n1; o2 n2; loopCount loopCount+1; ENDLOOP; }; didLoop: BOOL FALSE; f: WFace wShape.faceRing; ss NEW[SurfaceSequenceRep[0]]; IF f = NIL THEN RETURN; WHILE (NOT didLoop) OR (f # wShape.faceRing) DO e: WEdge f.edgeRing; surface: Surface []; surface.vertices WalkFace[f]; ss G3dBasic.AddToSurfaceSequence[ss, surface]; f f.next; didLoop TRUE; ENDLOOP; }; GetFacesFromWingedEdge: PROC [wShape: WShape] RETURNS [fs: FaceSequence] ~ { didLoop: BOOL FALSE; f: WFace wShape.faceRing; fs NEW[FaceSequenceRep[0]]; fs.valid wShape.faceValidities; IF f = NIL THEN RETURN; WHILE (NOT didLoop) OR (f # wShape.faceRing) DO IF f.basicFace # NIL THEN fs G3dShape.AddToFaceSequence[fs, f.basicFace]; f f.next; didLoop TRUE; ENDLOOP; }; InsertVertexIntoRing: PUBLIC PROC [v: WVertex, vRing: WVertex] RETURNS [WVertex] ~ { IF vRing = NIL THEN { v.next v.previous v; RETURN[v]; }; v.previous vRing.previous; v.next vRing; vRing.previous.next v; vRing.previous v; RETURN[vRing]; }; InsertCopyOfVertexIntoRing: PUBLIC PROC [v: WVertex, vRing: WVertex] RETURNS [WVertex] ~ { copy: WVertex NEW[WVertexRep v]; RETURN[InsertVertexIntoRing[copy, vRing]]; }; InsertEdgeIntoRing: PUBLIC PROC [e: WEdge, eRing: WEdge] RETURNS [WEdge] ~ { IF eRing = NIL THEN { e.next e.previous e; RETURN[e]; }; e.previous eRing.previous; e.next eRing; eRing.previous.next e; eRing.previous e; RETURN[eRing]; }; InsertCopyOfEdgeIntoRing: PUBLIC PROC [e: WEdge, eRing: WEdge] RETURNS [WEdge] ~ { copy: WEdge NEW[WEdgeRep e]; RETURN[InsertEdgeIntoRing[copy, eRing]]; }; InsertFaceIntoRing: PUBLIC PROC [f: WFace, fRing: WFace] RETURNS [WFace] ~ { IF fRing = NIL THEN { f.next f.previous f; RETURN[f]; }; f.previous fRing.previous; f.next fRing; fRing.previous.next f; fRing.previous f; RETURN[fRing]; }; InsertCopyOfFaceIntoRing: PUBLIC PROC [f: WFace, fRing: WFace] RETURNS [WFace] ~ { copy: WFace NEW[WFaceRep f]; RETURN[InsertFaceIntoRing[copy, fRing]]; }; ReverseEdgeRing: PUBLIC PROC [eRing: WEdge] ~ { e: WEdge eRing; IF eRing = NIL THEN RETURN; DO tmp: WEdge e.next; e.next e.previous; e.previous tmp; e tmp; IF e = eRing THEN EXIT; ENDLOOP; }; SetWings: PUBLIC PROC [e1, e2: WEdge] ~ { IF e1 = NIL OR e2 = NIL THEN Error[$BadInput, "An input wing is NIL!"]; IF e1.edgeData = NIL OR e2.edgeData = NIL THEN Error[$BadInput, "An input wing data field is NIL!"]; SELECT TRUE FROM e1.edgeData.aVertex = e2.edgeData.aVertex => { SELECT TRUE FROM e1.edgeData.bFace = e2.edgeData.aFace => { e1.edgeData.bCWedge e2.edgeData.owner; e2.edgeData.aCCWedge e1.edgeData.owner; }; e1.edgeData.aFace = e2.edgeData.bFace => { e1.edgeData.aCCWedge e2.edgeData.owner; e2.edgeData.bCWedge e1.edgeData.owner; }; ENDCASE => Error[$BadTopology, "The input edges do not share a face"]; }; e1.edgeData.aVertex = e2.edgeData.bVertex => { SELECT TRUE FROM e1.edgeData.bFace = e2.edgeData.bFace => { e1.edgeData.bCWedge e2.edgeData.owner; e2.edgeData.bCCWedge e1.edgeData.owner; }; e1.edgeData.aFace = e2.edgeData.aFace => { e1.edgeData.aCCWedge e2.edgeData.owner; e2.edgeData.aCWedge e1.edgeData.owner; }; ENDCASE => Error[$BadTopology, "The input edges do not share a face"]; }; e1.edgeData.bVertex = e2.edgeData.aVertex => { SELECT TRUE FROM e1.edgeData.aFace = e2.edgeData.aFace => { e1.edgeData.aCWedge e2.edgeData.owner; e2.edgeData.aCCWedge e1.edgeData.owner; }; e1.edgeData.bFace = e2.edgeData.bFace => { e1.edgeData.bCCWedge e2.edgeData.owner; e2.edgeData.bCWedge e1.edgeData.owner; }; ENDCASE => Error[$BadTopology, "The input edges do not share a face"]; }; e1.edgeData.bVertex = e2.edgeData.bVertex => { SELECT TRUE FROM e1.edgeData.aFace = e2.edgeData.bFace => { e1.edgeData.aCWedge e2.edgeData.owner; e2.edgeData.bCCWedge e1.edgeData.owner; }; e1.edgeData.bFace = e2.edgeData.aFace => { e1.edgeData.bCCWedge e2.edgeData.owner; e2.edgeData.aCWedge e1.edgeData.owner; }; ENDCASE => Error[$BadTopology, "The input edges do not share a face"]; }; ENDCASE => Error[$BadInput, "The input edges do not share a common vertex"]; }; VertexFromIndex: PUBLIC PROC [wShape: WShape, vNum: INT] RETURNS [v: WVertex] ~ { v wShape.vertexRing; DO IF v.index = vNum THEN RETURN[v]; v v.next; IF v = wShape.vertexRing THEN RETURN[NIL]; ENDLOOP; }; EdgeFromIndex: PUBLIC PROC [wShape: WShape, eNum: INT] RETURNS [e: WEdge] ~ { e wShape.edgeRing; DO IF e.edgeData.index = eNum THEN RETURN[e]; e e.next; IF e = wShape.edgeRing THEN RETURN[NIL]; ENDLOOP; }; FaceFromIndex: PUBLIC PROC [wShape: WShape, fNum: INT] RETURNS [f: WFace] ~ { f wShape.faceRing; DO IF f.index = fNum THEN RETURN[f]; f f.next; IF f = wShape.faceRing THEN RETURN[NIL]; ENDLOOP; }; GetEdgeFromVertices: PROC [aV, bV: WVertex, eRing: WEdge] RETURNS [WEdge] ~ { Match: PROC [v1, v2: WVertex, e: WEdge] RETURNS [BOOL] ~ { RETURN[(e.edgeData.aVertex = aV AND e.edgeData.bVertex = bV) OR (e.edgeData.aVertex = bV AND e.edgeData.bVertex = aV)]; }; e: WEdge eRing; didLoop: BOOL FALSE; IF e = NIL THEN RETURN [NIL]; WHILE ((NOT didLoop) OR (e # eRing)) AND (NOT Match[aV, bV, e]) DO didLoop TRUE; e e.next; ENDLOOP; IF Match[aV, bV, e] THEN RETURN [e.edgeData.owner] ELSE RETURN [NIL]; }; CountEdgesAroundVertex: PROC [v: WVertex] RETURNS [numEdges: INT 0] ~ { e: WEdge v.edgeRing; WHILE ((numEdges = 0) OR (e # v.edgeRing)) DO numEdges numEdges+1; e e.next; ENDLOOP; }; CountEdgesAroundFace: PROC [f: WFace] RETURNS [numEdges: INT 0] ~ { e: WEdge f.edgeRing; WHILE ((numEdges = 0) OR (e # f.edgeRing)) DO numEdges numEdges+1; e e.next; ENDLOOP; }; DebugVertexRing: PROC [vRing: WVertex] RETURNS [r: ROPE] ~ { DebugVertex: PROC [v: WVertex] RETURNS [d: ROPE] ~ { d IO.PutFR1["basicVertex point = %g\n", IO.int[v.index]]; d Rope.Concat[d, "edgeRing: "]; IF v.edgeRing = NIL THEN d Rope.Concat[d, "NIL RING\n"] ELSE { ep: WEdge v.edgeRing; DO d Rope.Concat[d, DebugEdge[ep]]; ep ep.next; IF ep.edgeData = v.edgeRing.edgeData THEN EXIT; ENDLOOP; }; IF v.next = NIL THEN d Rope.Concat[d, "ERROR: v.next = NIL"]; IF v.previous = NIL THEN d Rope.Concat[d, "ERROR: v.previous = NIL"]; }; vp: WVertex vRing; r NIL; IF vp = NIL THEN { r "empty ring"; RETURN; }; r Rope.Concat[r, DebugVertex[vp]]; vp vp.next; WHILE vp # vRing DO r Rope.Concat[r, DebugVertex[vp]]; vp vp.next; ENDLOOP; }; DebugEdge: PROC [e: WEdge, verbose: BOOL FALSE] RETURNS [d: ROPE NIL] ~ { IF e = NIL THEN RETURN ELSE { aCW: WEdge e.edgeData.aCWedge; aCCW: WEdge e.edgeData.aCCWedge; bCW: WEdge e.edgeData.bCWedge; bCCW: WEdge e.edgeData.bCCWedge; d IO.PutFR1["edge %d\n", IO.int[e.edgeData.index]]; IF verbose THEN { d Rope.Concat[d, IO.PutFR[">>> edge vertices %d to %d -> index %g\n", IO.int[e.edgeData.aVertex.index], IO.int[e.edgeData.bVertex.index], IO.int[e.edgeData.index]]]; d Rope.Concat[d, IO.PutFLR["aCCW=%g aCW=%g bCCW=%g bCW=%g ", LIST[IO.int[aCCW.edgeData.index], IO.int[aCW.edgeData.index], IO.int[bCCW.edgeData.index], IO.int[bCW.edgeData.index]]]]; d Rope.Concat[d, IO.PutFR["aFace=%g bFace=%g\n", IO.int[e.edgeData.aFace.index], IO.int[e.edgeData.bFace.index]]]; }; }; IF e.next = NIL THEN d Rope.Concat[d, "ERROR: e.next = NIL"]; IF e.previous = NIL THEN d Rope.Concat[d, "ERROR: e.previous = NIL"]; }; DebugFaceRing: PROC [fRing: WFace] RETURNS [r: ROPE] ~ { DebugFace: PROC [f: WFace] RETURNS [d: ROPE] ~ { d IO.PutFR1["face index %g\n", IO.int[f.index]]; IF f.basicFace = NIL THEN d Rope.Concat[d, "basicFace is NIL\n"] ELSE d Rope.Concat[d, IO.PutFR["basicFace normal = %g %g %g\n", IO.real[f.basicFace.normal.x], IO.real[f.basicFace.normal.y], IO.real[f.basicFace.normal.z]]]; d Rope.Concat[d, "edgeRing: "]; IF f.edgeRing = NIL THEN d Rope.Concat[d, "NIL RING\n"] ELSE { ep: WEdge f.edgeRing; d Rope.Concat[d, DebugEdge[ep]]; ep ep.next; WHILE ep # f.edgeRing DO d Rope.Concat[d, DebugEdge[ep]]; ep ep.next; ENDLOOP; }; IF f.next = NIL THEN d Rope.Concat[d, "ERROR: f.next = NIL"]; IF f.previous = NIL THEN d Rope.Concat[d, "ERROR: f.previous = NIL"]; }; fp: WFace fRing; r NIL; IF fp = NIL THEN { r "empty ring"; RETURN; }; r Rope.Concat[r, DebugFace[fp]]; fp fp.next; WHILE fp # fRing DO r Rope.Concat[r, DebugFace[fp]]; fp fp.next; ENDLOOP; }; DebugEdgeRing: PROC [eRing: WEdge] RETURNS [r: ROPE] ~ { ep: WEdge eRing; r NIL; IF ep = NIL THEN { r "empty ring"; RETURN; }; r Rope.Concat[r, DebugEdge[ep, TRUE]]; ep ep.next; WHILE ep # eRing DO r Rope.Concat[r, DebugEdge[ep, TRUE]]; ep ep.next; ENDLOOP; }; ApplyToFaces: PUBLIC PROC [wShape: WShape, ff: WFaceProc] ~ { ApplyToFaceRing[wShape.faceRing, ff]; }; ApplyToEdges: PUBLIC PROC [wShape: WShape, ef: WEdgeProc] ~ { ApplyToEdgeRing[wShape.edgeRing, ef]; }; ApplyToVertices: PUBLIC PROC [wShape: WShape, vf: WVertexProc] ~ { ApplyToVertexRing[wShape.vertexRing, vf]; }; NextVertexAroundFaceFromEdge: PUBLIC PROC [edge: WEdge, face: WFace, dir: ClockDirection] RETURNS [WVertex] ~ { e: WEdge NIL; IF face = NIL THEN Error[$BadInput, "No face specified"]; IF edge = NIL THEN RETURN[AnyVertexOnFace[face]]; IF edge.edgeData = NIL THEN Error[$MissingData, "This edge has no data"]; SELECT TRUE FROM edge.edgeData.aFace = face => { SELECT dir FROM cw => RETURN[VertexNotOnFirstEdge[edge, edge.edgeData.aCWedge]]; ccw => RETURN[VertexNotOnFirstEdge[edge, edge.edgeData.aCCWedge]]; ENDCASE; }; edge.edgeData.bFace = face => { SELECT dir FROM cw => RETURN[VertexNotOnFirstEdge[edge, edge.edgeData.bCWedge]]; ccw => RETURN[VertexNotOnFirstEdge[edge, edge.edgeData.bCCWedge]]; ENDCASE; }; ENDCASE => Error[$BadTopology, "This edge is not adjacent to this face"]; RETURN[NIL]; }; NextVertexAroundFaceFromVertex: PUBLIC PROC [vertex: WVertex, face: WFace, dir: ClockDirection] RETURNS [WVertex] ~ { edge: WEdge face.edgeRing; IF face = NIL THEN Error[$BadInput, "No face specified"]; DO IF edge.edgeData.aVertex = vertex OR edge.edgeData.bVertex = vertex THEN EXIT; edge edge.next; IF edge = face.edgeRing THEN EXIT; ENDLOOP; IF edge = face.edgeRing THEN Error[$BadTopology, "This face does not contain this vertex"]; SELECT TRUE FROM edge.edgeData.aFace = face => { SELECT TRUE FROM edge.edgeData.aVertex = vertex => SELECT dir FROM cw => RETURN[edge.edgeData.bVertex]; ccw => RETURN[VertexNotOnFirstEdge[edge, edge.edgeData.aCCWedge]]; ENDCASE; edge.edgeData.bVertex = vertex => SELECT dir FROM cw => RETURN[VertexNotOnFirstEdge[edge, edge.edgeData.aCWedge]]; ccw => RETURN[edge.edgeData.aVertex]; ENDCASE; ENDCASE => Error[$BadTopology, "This edge does not contain this vertex"]; }; edge.edgeData.bFace = face => { SELECT TRUE FROM edge.edgeData.aVertex = vertex => SELECT dir FROM cw => RETURN[VertexNotOnFirstEdge[edge, edge.edgeData.bCWedge]]; ccw => RETURN[edge.edgeData.bVertex]; ENDCASE; edge.edgeData.bVertex = vertex => SELECT dir FROM cw => RETURN[edge.edgeData.aVertex]; ccw => RETURN[VertexNotOnFirstEdge[edge, edge.edgeData.bCCWedge]]; ENDCASE; ENDCASE => Error[$BadTopology, "This edge does not contain this vertex"]; }; ENDCASE => Error[$BadTopology, "This edge is not adjacent to this face"]; RETURN[NIL]; }; NextVertexAroundVertex: PUBLIC PROC [vertex: WVertex, face: WFace, dir: ClockDirection] RETURNS [WVertex] ~ { edge: WEdge; IF face = NIL THEN Error[$BadInput, "No face specified"]; IF vertex = NIL THEN RETURN[AnyVertexOnFace[face]]; edge EdgeUsingVertex[face.edgeRing, vertex]; SELECT TRUE FROM edge.edgeData.aFace = face => { SELECT TRUE FROM vertex = edge.edgeData.aVertex => SELECT dir FROM cw => RETURN[edge.edgeData.bVertex]; ccw => RETURN[VertexNotOnFirstEdge[edge, edge.edgeData.aCCWedge]]; ENDCASE; vertex = edge.edgeData.bVertex => SELECT dir FROM cw => RETURN[VertexNotOnFirstEdge[edge, edge.edgeData.aCWedge]]; ccw => RETURN[edge.edgeData.aVertex]; ENDCASE; ENDCASE => Error[$BadTopology, "Edge does not contain vertex"]; }; edge.edgeData.bFace = face => { SELECT TRUE FROM vertex = edge.edgeData.aVertex => SELECT dir FROM cw => RETURN[VertexNotOnFirstEdge[edge, edge.edgeData.bCWedge]]; ccw => RETURN[edge.edgeData.bVertex]; ENDCASE; vertex = edge.edgeData.bVertex => SELECT dir FROM cw => RETURN[edge.edgeData.aVertex]; ccw => RETURN[VertexNotOnFirstEdge[edge, edge.edgeData.bCCWedge]]; ENDCASE; ENDCASE => Error[$BadTopology, "Edge does not contain vertex"]; }; ENDCASE => Error[$BadTopology, "This edge is not adjacent to this face"]; RETURN[NIL]; }; VertexAcrossEdge: PUBLIC PROC [vertex: WVertex, edge: WEdge] RETURNS [WVertex] ~ { IF edge = NIL THEN Error[$BadInput, "No edge specified"]; IF vertex = NIL THEN { IF edge.edgeData = NIL THEN Error[$MissingData, "This edge has no data"]; RETURN[edge.edgeData.aVertex]; }; SELECT TRUE FROM edge.edgeData.aVertex = vertex => RETURN[edge.edgeData.bVertex]; edge.edgeData.bVertex = vertex => RETURN[edge.edgeData.aVertex]; ENDCASE => Error[$BadTopology, "This vertex is not on this edge"]; }; NextEdgeAroundFaceFromEdge: PUBLIC PROC [edge: WEdge, face: WFace, dir: ClockDirection] RETURNS [WEdge] ~ { IF face = NIL THEN Error[$BadInput, "No face specified"]; IF edge = NIL THEN RETURN[AnyEdgeOnFace[face]]; SELECT TRUE FROM edge.edgeData.aFace = face => { SELECT dir FROM cw => RETURN[edge.edgeData.aCWedge]; ccw => RETURN[edge.edgeData.aCCWedge]; ENDCASE; }; edge.edgeData.bFace = face => { SELECT dir FROM cw => RETURN[edge.edgeData.bCWedge]; ccw => RETURN[edge.edgeData.bCCWedge]; ENDCASE; }; ENDCASE => Error[$BadTopology, "This edge is not adjacent to this face"]; RETURN[NIL]; }; NextEdgeAroundVertex: PUBLIC PROC [vertex: WVertex, edge: WEdge, dir: ClockDirection] RETURNS [WEdge] ~ { didLoop: BOOL FALSE; e: WEdge; IF vertex = NIL THEN Error[$BadInput, "No vertex specified"]; IF edge = NIL THEN RETURN[AnyEdgeOnVertex[vertex]]; e vertex.edgeRing; WHILE (NOT didLoop) OR (e # vertex.edgeRing) DO IF e.edgeData = edge.edgeData THEN RETURN[e.next]; e e.next; didLoop TRUE; ENDLOOP; Error[$BadTopology, "This edge is not adjacent to this vertex"]; }; NextEdgeAroundFaceFromVertex: PUBLIC PROC [vertex: WVertex, face: WFace, dir: ClockDirection] RETURNS [WEdge] ~ { edge: WEdge; IF face = NIL THEN Error[$BadInput, "No face specified"]; IF vertex = NIL THEN RETURN[AnyEdgeOnFace[face]]; edge EdgeUsingVertex[face.edgeRing, vertex]; SELECT TRUE FROM edge.edgeData.aFace = face => { SELECT TRUE FROM vertex = edge.edgeData.aVertex => SELECT dir FROM cw => RETURN[edge]; ccw => RETURN[edge.edgeData.aCCWedge]; ENDCASE; vertex = edge.edgeData.bVertex => SELECT dir FROM cw => RETURN[edge.edgeData.aCWedge]; ccw => RETURN[edge]; ENDCASE; ENDCASE => Error[$BadTopology, "Edge does not contain vertex"]; }; edge.edgeData.bFace = face => { SELECT TRUE FROM vertex = edge.edgeData.aVertex => SELECT dir FROM cw => RETURN[edge.edgeData.bCWedge]; ccw => RETURN[edge]; ENDCASE; vertex = edge.edgeData.bVertex => SELECT dir FROM cw => RETURN[edge]; ccw => RETURN[edge.edgeData.bCCWedge]; ENDCASE; ENDCASE => Error[$BadTopology, "Edge does not contain vertex"]; }; ENDCASE => Error[$BadTopology, "This edge is not adjacent to this face"]; RETURN[NIL]; }; NextFaceAroundEdge: PUBLIC PROC [vertex: WVertex, edge: WEdge, dir: ClockDirection] RETURNS [WFace] ~ { IF edge = NIL THEN Error[$BadInput, "No edge specified"]; IF vertex = NIL THEN RETURN[AnyFaceOnVertex[vertex]]; SELECT dir FROM cw => RETURN [edge.edgeData.aFace]; ccw => RETURN [edge.edgeData.bFace]; ENDCASE; RETURN [NIL]; }; NextFaceAroundVertex: PUBLIC PROC [vertex: WVertex, face: WFace, dir: ClockDirection] RETURNS [WFace] ~ { edge: WEdge; IF face = NIL THEN RETURN[AnyFaceOnVertex[vertex]]; edge EdgeUsingVertex[face.edgeRing, vertex]; SELECT TRUE FROM edge.edgeData.aFace = face => { face: WFace edge.edgeData.aFace; SELECT TRUE FROM vertex = edge.edgeData.aVertex => SELECT dir FROM cw => RETURN[FaceAcrossEdge[edge.edgeData.aCCWedge, face]]; ccw => RETURN[FaceAcrossEdge[edge, face]]; ENDCASE; vertex = edge.edgeData.bVertex => SELECT dir FROM cw => RETURN[FaceAcrossEdge[edge, face]]; ccw => RETURN[FaceAcrossEdge[edge.edgeData.aCWedge, face]]; ENDCASE; ENDCASE => Error[$BadTopology, "Edge does not contain vertex"]; }; edge.edgeData.bFace = face => { face: WFace edge.edgeData.bFace; SELECT TRUE FROM vertex = edge.edgeData.aVertex => SELECT dir FROM cw => RETURN[FaceAcrossEdge[edge, face]]; ccw => RETURN[FaceAcrossEdge[edge.edgeData.bCWedge, face]]; ENDCASE; vertex = edge.edgeData.bVertex => SELECT dir FROM cw => RETURN[FaceAcrossEdge[edge.edgeData.bCCWedge, face]]; ccw => RETURN[FaceAcrossEdge[edge, face]]; ENDCASE; ENDCASE => Error[$BadTopology, "Edge does not contain vertex"]; }; ENDCASE => Error[$BadTopology, "This edge is not adjacent to this face"]; RETURN[NIL]; }; FaceAcrossEdge: PUBLIC PROC [edge: WEdge, face: WFace] RETURNS [WFace] ~ { IF face=NIL THEN RETURN[AnyFaceOnEdge[edge]]; IF edge.edgeData.aFace = face THEN RETURN [edge.edgeData.bFace]; IF edge.edgeData.bFace = face THEN RETURN [edge.edgeData.aFace]; Error[$BadInput, "This edge does not contain this face"]; }; ApplyToVertexRing: PUBLIC PROC [vRing: WVertex, vf: WVertexProc] ~ { didLoop: BOOL FALSE; v: WVertex vRing; IF vRing = NIL THEN RETURN; WHILE (NOT didLoop) OR (v # vRing) DO vf[v]; v v.next; didLoop TRUE; ENDLOOP; }; ApplyToEdgeRing: PUBLIC PROC [eRing: WEdge, ef: WEdgeProc] ~ { didLoop: BOOL FALSE; e: WEdge eRing; IF eRing = NIL THEN RETURN; WHILE (NOT didLoop) OR (e # eRing) DO ef[e]; e e.next; didLoop TRUE; ENDLOOP; }; ApplyToFaceRing: PUBLIC PROC [fRing: WFace, ff: WFaceProc] ~ { didLoop: BOOL FALSE; f: WFace fRing; IF fRing = NIL THEN RETURN; WHILE (NOT didLoop) OR (f # fRing) DO ff[f]; f f.next; didLoop TRUE; ENDLOOP; }; InvertEdge: PUBLIC PROC [e: WEdge] ~ { ed: WEdgeData e.edgeData; tmpE: WEdge; tmpV: WVertex; tmpF: WFace; tmpV ed.aVertex; ed.aVertex ed.bVertex; ed.bVertex tmpV; tmpF ed.aFace; ed.aFace ed.bFace; ed.bFace tmpF; tmpE ed.aCWedge; ed.aCWedge ed.bCWedge; ed.bCWedge tmpE; tmpE ed.aCCWedge; ed.aCCWedge ed.bCCWedge; ed.bCCWedge tmpE; }; EvertEdge: PUBLIC PROC [e: WEdge] ~ { ed: WEdgeData e.edgeData; tmpE: WEdge; tmpF: WFace; tmpF ed.aFace; ed.aFace ed.bFace; ed.bFace tmpF; tmpE ed.aCWedge; ed.aCWedge ed.bCWedge; ed.bCWedge tmpE; tmpE ed.aCCWedge; ed.aCCWedge ed.bCCWedge; ed.bCWedge tmpE; }; InvertWShape: PUBLIC PROC [wShape: WShape] ~ { ApplyToEdgeRing[wShape.edgeRing, InvertEdge]; }; EvertWShape: PUBLIC PROC [wShape: WShape] ~ { ApplyToEdgeRing[wShape.edgeRing, EvertEdge]; }; AnyVertexOnFace: PUBLIC PROC [face: WFace] RETURNS [WVertex] ~ { IF face.edgeRing = NIL THEN Error[$MissingEdges, "This face has no edges"]; IF face.edgeRing.edgeData = NIL THEN Error[$MissingEdges, "This edge has no data"]; RETURN[face.edgeRing.edgeData.aVertex]; }; AnyEdgeOnFace: PUBLIC PROC [face: WFace] RETURNS [WEdge] ~ { IF face.edgeRing = NIL THEN Error[$MissingEdges, "This face has no edges"]; RETURN[face.edgeRing]; }; AnyEdgeOnVertex: PUBLIC PROC [vertex: WVertex] RETURNS [WEdge] ~ { IF vertex.edgeRing = NIL THEN Error[$MissingEdges, "This vertex has no edges"]; RETURN[vertex.edgeRing]; }; AnyFaceOnVertex: PUBLIC PROC [vertex: WVertex] RETURNS [WFace] ~ { IF vertex.edgeRing = NIL THEN Error[$MissingEdges, "This vertex has no edges"]; RETURN[vertex.edgeRing.edgeData.aFace]; }; AnyFaceOnEdge: PUBLIC PROC [edge: WEdge] RETURNS [WFace] ~ { IF edge.edgeData = NIL THEN Error[$MissingData, "This edge has no data"]; RETURN[edge.edgeData.aFace]; }; VertexNotOnFirstEdge: PUBLIC PROC [e1, e2: WEdge] RETURNS [WVertex] ~ { IF e1 = NIL OR e1.edgeData = NIL OR e2 = NIL OR e2.edgeData = NIL THEN Error[$BadInput, "Incoming edges incomplete"]; IF e1.edgeData.aVertex = e2.edgeData.aVertex THEN RETURN[e2.edgeData.bVertex]; IF e1.edgeData.aVertex = e2.edgeData.bVertex THEN RETURN[e2.edgeData.aVertex]; IF e1.edgeData.bVertex = e2.edgeData.aVertex THEN RETURN[e2.edgeData.bVertex]; IF e1.edgeData.bVertex = e2.edgeData.bVertex THEN RETURN[e2.edgeData.aVertex]; Error[$BadInput, "These edges have no common vertex"]; }; EdgeUsingVertex: PUBLIC PROC [eRing: WEdge, v: WVertex] RETURNS [WEdge] ~ { didLoop: BOOL FALSE; e: WEdge eRing; IF eRing = NIL THEN Error[$BadInput, "Edge ring empty"]; WHILE (NOT didLoop) OR (e # eRing) DO IF e.edgeData.aVertex = v OR e.edgeData.bVertex = v THEN RETURN [e]; e e.next; didLoop TRUE; ENDLOOP; Error[$BadInput, "No edge in the ring includes this vertex"]; }; FaceContainingVertices: PUBLIC PROC [v1, v2: WVertex] RETURNS [WFace] ~ { FaceAInV2: PROC [face: WFace] RETURNS [BOOL] ~ { doLoop2: BOOL TRUE; loop2E: WEdge v2.edgeRing; WHILE doLoop2 OR (loop2E # v2.edgeRing) DO IF (loop2E.edgeData.aFace = face) OR (loop2E.edgeData.bFace = face) THEN RETURN[TRUE]; doLoop2 FALSE; loop2E loop2E.next; ENDLOOP; RETURN[FALSE]; }; doLoop1: BOOL TRUE; loop1E: WEdge v1.edgeRing; WHILE doLoop1 OR (loop1E # v1.edgeRing) DO IF FaceAInV2[loop1E.edgeData.aFace] THEN RETURN [loop1E.edgeData.aFace]; IF FaceAInV2[loop1E.edgeData.bFace] THEN RETURN [loop1E.edgeData.bFace]; doLoop1 FALSE; loop1E loop1E.next; ENDLOOP; Error[$BadTopology, "These vertices have no face in common"]; }; EdgeContainingVertices: PUBLIC PROC [v1, v2: WVertex] RETURNS [WEdge] ~ { Error[$Unimplemented, "This routine doesn't do anything yet"]; }; VertexContainingEdges: PUBLIC PROC [e1, e2: WEdge] RETURNS [WVertex] ~ { Error[$Unimplemented, "This routine doesn't do anything yet"]; }; EdgeContainingFaces: PUBLIC PROC [f1, f2: WFace] RETURNS [WEdge] ~ { Error[$Unimplemented, "This routine doesn't do anything yet"]; }; VertexContainingFaces: PUBLIC PROC [f1, f2: WFace] RETURNS [WVertex] ~ { Error[$Unimplemented, "This routine doesn't do anything yet"]; }; EdgeAdjacentToFace: PUBLIC PROC [edge: WEdge, face: WFace] RETURNS [BOOL] ~ { Error[$Unimplemented, "This routine doesn't do anything yet"]; }; VertexAdjacentToFace: PUBLIC PROC [vertex: WVertex, face: WFace] RETURNS [BOOL] ~ { Error[$Unimplemented, "This routine doesn't do anything yet"]; }; VertexAdjacentToEdge: PUBLIC PROC [vertex: WVertex, edge: WEdge] RETURNS [BOOL] ~ { Error[$Unimplemented, "This routine doesn't do anything yet"]; }; SpurVertex: PUBLIC PROC [vertex: WVertex] RETURNS [BOOL] ~ { Error[$Unimplemented, "This routine doesn't do anything yet"]; }; WireEdge: PUBLIC PROC [edge: WEdge] RETURNS [BOOL] ~ { Error[$Unimplemented, "This routine doesn't do anything yet"]; }; EdgesAroundVertex: PUBLIC PROC [vertex: WVertex] RETURNS [numEdges: INT 0] ~ { e: WEdge vertex.edgeRing; WHILE ((numEdges = 0) OR (e # vertex.edgeRing)) DO numEdges numEdges+1; e e.next; ENDLOOP; }; FacesAroundVertex: PUBLIC PROC [vertex: WVertex] RETURNS [INT] ~ { Error[$Unimplemented, "This routine doesn't do anything yet"]; }; VerticesAroundEdge: PUBLIC PROC [edge: WEdge] RETURNS [INT] ~ { Error[$Unimplemented, "This routine doesn't do anything yet"]; }; FacesAroundEdge: PUBLIC PROC [edge: WEdge] RETURNS [INT] ~ { Error[$Unimplemented, "This routine doesn't do anything yet"]; }; VerticesAroundFace: PUBLIC PROC [face: WFace] RETURNS [INT] ~ { Error[$Unimplemented, "This routine doesn't do anything yet"]; }; EdgesAroundFace: PUBLIC PROC [face: WFace] RETURNS [numEdges: INT 0] ~ { e: WEdge face.edgeRing; DO numEdges numEdges+1; e e.next; IF e = face.edgeRing THEN EXIT; ENDLOOP; }; VerticesInWShape: PUBLIC PROC [wShape: WShape] RETURNS [numVerts: INT 0] ~ { v: WVertex wShape.vertexRing; IF v = NIL THEN RETURN; DO numVerts numVerts+1; v v.next; IF v = wShape.vertexRing THEN EXIT; ENDLOOP; }; EdgesInWShape: PUBLIC PROC [wShape: WShape] RETURNS [numEdges: INT 0] ~ { e: WEdge wShape.edgeRing; IF e = NIL THEN RETURN; DO numEdges numEdges+1; e e.next; IF e = wShape.edgeRing THEN EXIT; ENDLOOP; }; FacesInWShape: PUBLIC PROC [wShape: WShape] RETURNS [numFaces: INT 0] ~ { f: WFace wShape.faceRing; IF f = NIL THEN RETURN; WHILE ((numFaces = 0) OR (f # wShape.faceRing)) DO numFaces numFaces+1; f f.next; ENDLOOP; }; Genus: PUBLIC PROC [wShape: WShape] RETURNS [genus: INT 2] ~ { numVertices: INT VerticesInWShape[wShape]; numEdges: INT EdgesInWShape[wShape]; numFaces: INT FacesInWShape[wShape]; genus numFaces - numEdges + numVertices; }; NewWShape: PUBLIC PROC RETURNS [WShape] ~ { Error[$Unimplemented, "This routine doesn't do anything yet"]; }; InsertVertexIntoShape: PUBLIC PROC [wShape: WShape, vetex: WVertex] ~ { Error[$Unimplemented, "This routine doesn't do anything yet"]; }; InsertEdgeIntoShape: PUBLIC PROC [wShape: WShape, edge: WEdge] ~ { Error[$Unimplemented, "This routine doesn't do anything yet"]; }; InsertFaceIntoShape: PUBLIC PROC [wShape: WShape, face: WFace] ~ { Error[$Unimplemented, "This routine doesn't do anything yet"]; }; DeleteWShape: PUBLIC PROC [wShape: WShape] ~ { IF wShape = NIL THEN RETURN; DeleteVertexRing[wShape.vertexRing]; DeleteEdgeRing[wShape.edgeRing]; DeleteFaceRing[wShape.faceRing]; }; SplitEdge: PUBLIC PROC [wShape: WShape, edge: WEdge] RETURNS [newV: WVertex] ~ { newEdge: WEdge NEW[WEdgeRep []]; newEdge.edgeData NEW[WEdgeDataRep edge.edgeData]; newEdge.edgeData.owner newEdge; newEdge.edgeData.index EdgesInWShape[wShape]; newV NEW[WVertexRep []]; newV.index VerticesInWShape[wShape]; newV.basicVertex InterpolateVertices[edge.edgeData.aVertex.basicVertex, edge.edgeData.bVertex.basicVertex]; wShape.edgeRing InsertEdgeIntoRing[newEdge, wShape.edgeRing]; wShape.vertexRing InsertVertexIntoRing[newV, wShape.vertexRing]; edge.edgeData.aFace.edgeRing InsertCopyOfEdgeIntoRing[newEdge, edge.edgeData.aFace.edgeRing]; edge.edgeData.bFace.edgeRing InsertCopyOfEdgeIntoRing[newEdge, edge.edgeData.bFace.edgeRing]; newV.edgeRing InsertCopyOfEdgeIntoRing[edge, NIL]; newV.edgeRing InsertCopyOfEdgeIntoRing[newEdge, newV.edgeRing]; newEdge.edgeData.aVertex newV; edge.edgeData.bVertex newV; newEdge.edgeData.bVertex.edgeRing ReplaceEdgeInRing[edge, newEdge, newEdge.edgeData.bVertex.edgeRing]; SetWings[newEdge, edge.edgeData.aCWedge]; SetWings[newEdge, edge.edgeData.bCCWedge]; newEdge.edgeData.aCCWedge newEdge.edgeData.bCWedge edge; edge.edgeData.aCWedge edge.edgeData.bCCWedge newEdge; }; CollapseEdge: PUBLIC PROC [wShape: WShape, edge: WEdge] RETURNS [WVertex] ~ { Error[$Unimplented, "This routine is unimplemented"]; }; RemoveEdge: PUBLIC PROC [wShape: WShape, edge: WEdge] RETURNS [WFace] ~ { face: WFace edge.edgeData.aFace; newRing, edgeLoop: WEdge; DeleteEdgeFromRing[edge, edge.edgeData.aVertex.edgeRing]; DeleteEdgeFromRing[edge, edge.edgeData.bVertex.edgeRing]; edgeLoop edge.edgeData.bFace.edgeRing; DO IF edgeLoop.edgeData # edge.edgeData THEN IF edgeLoop.edgeData.aFace = edge.edgeData.bFace THEN edgeLoop.edgeData.aFace edge.edgeData.aFace ELSE edgeLoop.edgeData.bFace edge.edgeData.aFace; edgeLoop edgeLoop.next; IF edgeLoop = edge.edgeData.bFace.edgeRing THEN EXIT; ENDLOOP; newRing NIL; edgeLoop edge.edgeData.aFace.edgeRing; DO IF edgeLoop.edgeData # edge.edgeData THEN newRing InsertCopyOfEdgeIntoRing[edgeLoop, newRing]; edgeLoop edgeLoop.next; IF edgeLoop = edge.edgeData.aFace.edgeRing THEN EXIT; ENDLOOP; edgeLoop edge.edgeData.bFace.edgeRing; DO IF edgeLoop.edgeData # edge.edgeData THEN newRing InsertCopyOfEdgeIntoRing[edgeLoop, newRing]; edgeLoop edgeLoop.next; IF edgeLoop = edge.edgeData.bFace.edgeRing THEN EXIT; ENDLOOP; DeleteEdgeRing[edge.edgeData.aFace.edgeRing]; edge.edgeData.aFace.edgeRing newRing; SetWings[edge.edgeData.bCCWedge, edge.edgeData.aCWedge]; SetWings[edge.edgeData.aCCWedge, edge.edgeData.bCWedge]; DeleteFaceFromRing[edge.edgeData.bFace, wShape.faceRing]; edge.edgeData.owner NIL; DeleteEdgeFromRing[edge, wShape.edgeRing]; RETURN[face]; }; InsertBridge: PUBLIC PROC [wShape: WShape, v1, v2: WVertex] RETURNS [newFace: WFace NIL, newEdge: WEdge NIL] ~ { FindWings: PROC ~ { -- find edges ej, ek, er, es and set them GetPairOfEdges: PROC [targetV: WVertex] RETURNS [WEdge, WEdge] ~ { face: WFace FaceContainingVertices [v1, v2]; edge: WEdge AnyEdgeOnFace[face]; lastEdge: WEdge; WHILE edge.edgeData.aVertex # targetV AND edge.edgeData.bVertex # targetV DO edge NextEdgeAroundFaceFromEdge[edge, face, cw]; ENDLOOP; edge NextEdgeAroundFaceFromEdge[edge, face, cw]; IF edge.edgeData.aVertex # targetV AND edge.edgeData.bVertex # targetV THEN edge NextEdgeAroundFaceFromEdge[edge, face, ccw]; lastEdge NextEdgeAroundFaceFromEdge[edge, face, ccw]; RETURN[lastEdge, edge]; }; [ek, er] GetPairOfEdges[v1]; [es, ej] GetPairOfEdges[v2]; }; newRing, edgeLoop: WEdge NIL; ej, ek, er, es: WEdge NIL; oldFace: WFace FaceContainingVertices [v1, v2]; FindWings[]; newEdge NEW[WEdgeRep []]; newEdge.edgeData NEW[WEdgeDataRep []]; newEdge.edgeData.owner newEdge; newEdge.edgeData.index EdgesInWShape[wShape]; wShape.edgeRing InsertEdgeIntoRing[newEdge, wShape.edgeRing]; newFace NEW[WFaceRep []]; newFace.index FacesInWShape[wShape]; wShape.faceRing InsertFaceIntoRing[newFace, wShape.faceRing]; newEdge.edgeData.aVertex v1; newEdge.edgeData.bVertex v2; v2.edgeRing InsertCopyOfEdgeIntoRing[newEdge, v2.edgeRing]; v1.edgeRing InsertCopyOfEdgeIntoRing[newEdge, v1.edgeRing]; newEdge.edgeData.bFace newFace; newEdge.edgeData.aFace oldFace; edgeLoop er; DO newFace.edgeRing InsertCopyOfEdgeIntoRing[edgeLoop, newFace.edgeRing]; IF edgeLoop = es THEN EXIT; edgeLoop NextEdgeAroundFaceFromEdge[edgeLoop, oldFace, cw]; ENDLOOP; edgeLoop newFace.edgeRing; DO IF edgeLoop.edgeData.aFace = oldFace THEN edgeLoop.edgeData.aFace newFace ELSE edgeLoop.edgeData.bFace newFace; edgeLoop edgeLoop.next; IF edgeLoop = newFace.edgeRing THEN EXIT; ENDLOOP; edgeLoop ej; DO newRing InsertCopyOfEdgeIntoRing[edgeLoop, newRing]; IF edgeLoop = ek THEN EXIT; edgeLoop NextEdgeAroundFaceFromEdge[edgeLoop, oldFace, cw]; ENDLOOP; newFace.edgeRing InsertCopyOfEdgeIntoRing[newEdge, newFace.edgeRing]; newRing InsertCopyOfEdgeIntoRing[newEdge, newRing]; SetWings[newEdge, ej]; SetWings[newEdge, es]; SetWings[newEdge, er]; SetWings[newEdge, ek]; DeleteEdgeRing[oldFace.edgeRing]; oldFace.edgeRing newRing; }; RemoveVertex: PUBLIC PROC [wShape: WShape, v1: WVertex] RETURNS [newEdge: WEdge NIL] ~ { Error[$Unimplemented, "This routine doesn't do anything yet"]; }; InterpolateVertices: PROC [va, vb: Vertex] RETURNS [newV: Vertex] ~ { newV NEW[VertexRep va]; newV.point G3dVector.Midpoint[va.point, vb.point]; newV.normal G3dVector.Midpoint[va.normal, vb.normal]; newV.color G3dVector.Midpoint[va.color, vb.color]; newV.texture G2dVector.Midpoint[va.texture, vb.texture]; newV.transmittance (va.transmittance + vb.transmittance)/2.0; }; ReplaceEdgeInRing: PROC [old, new, ring: WEdge, deleteOld: BOOL TRUE] RETURNS [newCopy: WEdge] ~ { e: WEdge ring; newCopy NEW[WEdgeRep new]; IF e = NIL THEN RETURN; DO IF e.edgeData = old.edgeData THEN { newCopy.previous e.previous; newCopy.next e.next; e.previous.next newCopy; e.next.previous newCopy; e.next e.previous NIL; RETURN; }; e e.next; IF e.edgeData = ring.edgeData THEN Error[$BadTopology, "This edge is not in this ring"]; ENDLOOP; }; DeleteVertexFromRing: PROC [old, ring: WVertex, deleteOld: BOOL TRUE] ~ { v: WVertex ring; IF v = NIL THEN RETURN; DO IF v = old THEN { v.previous.next v.next; v.next.previous v.previous; v.next v.previous NIL; RETURN; }; v v.next; IF v = ring THEN EXIT; ENDLOOP; }; DeleteEdgeFromRing: PROC [old, ring: WEdge, deleteOld: BOOL TRUE] ~ { e: WEdge ring; IF e = NIL THEN RETURN; DO IF e.edgeData = old.edgeData THEN { e.previous.next e.next; e.next.previous e.previous; e.next e.previous NIL; RETURN; }; e e.next; IF e = ring THEN EXIT; ENDLOOP; }; DeleteFaceFromRing: PROC [old, ring: WFace, deleteOld: BOOL TRUE] ~ { f: WFace ring; IF f = NIL THEN RETURN; DO IF f = old THEN { f.previous.next f.next; f.next.previous f.previous; f.next f.previous NIL; RETURN; }; f f.next; IF f = ring THEN EXIT; ENDLOOP; }; DeleteVertexRing: PROC [ring: WVertex] ~ { IF ring = NIL THEN RETURN; IF ring.previous # NIL THEN ring.previous.next NIL; IF ring.next # NIL THEN ring.next.previous NIL; ring.next ring.previous NIL; }; DeleteEdgeRing: PROC [ring: WEdge] ~ { IF ring = NIL THEN RETURN; IF ring.previous # NIL THEN ring.previous.next NIL; IF ring.next # NIL THEN ring.next.previous NIL; ring.next ring.previous NIL; ring.edgeData NIL; }; DeleteFaceRing: PROC [ring: WFace] ~ { IF ring = NIL THEN RETURN; IF ring.previous # NIL THEN ring.previous.next NIL; IF ring.next # NIL THEN ring.next.previous NIL; ring.next ring.previous NIL; }; END.  G3dWingedEdgeImpl.mesa Copyright 1990, 1992 by Xerox Corporation. All rights reserved. Glassner, March 10, 1990 5:07:22 pm PST Bloomenthal, July 15, 1992 5:49 pm PDT Types WShape/Shape Conversion Procedures SortVertexEdges[wShape]; -- unnecessary; the edges are unsorted around vtx by def'n WingedEdge From Shape Procedures -- this is just ApplyToFaceRing but it tracks and passes the associated surface -- this is just ApplyToEdgeRing but it uses the result -- this is just ApplyToVertexRing but it uses the result -- this is just ApplyToVertexRing but it uses the result -- this is just ApplyToFaceRing but it tracks and passes the associated surface Shape From Winged Edge Procedures Construction Utility Procedures Given a pair of edges e1, e2 that have a common vertex, the connecting wings are set according to one of the following eight patterns (see Baumgart74, pg. 22) [Artwork node; type 'Artwork on' to command tool] Lookup Procedures Counting Procedures Debug Procedures Apply A Function To All Elements of A WShape Vertex Access Edge Access Face Access NextFaceAroundVertex finds any edge that is on this face and vertex (call this edge e), and then performs one of the following eight cases to determine the next face around the vertex. In the figure, the input vertex is one common to all three shapes; it is marked with a circle. The input face is shaded in grey. Edge e is indicated with an arrow. The horizontal rows show the desired face marked with a star; the triangle is the next face clockwise, the rectangle is the next face counterclockwise. In each case we return the face across an edge with respect to the input face; the correct edge to use is shown in bold. In four cases that edge is just e; the other four cases each use one of the wings. The legends refer to the position of the passed-in vertex and face with respect to e. Each case is marked with the name of the edge used to find the next face, opposite the input face; this edge is marked in bold. Ring Looping Procedures Miscellaneous Adjacencies Toplogical Set Operators This is a dumb O(n2) algorithm, but for small numbers of edges on each vertex it should be okay. It would be nice to replace it with something more clever someday. Toplogical Predicates Valencies Node Construction Euler Operators Insert a new vertex in the center of this edge and add a new edge colinear with the input edge. The wings for the edges are updated at the new vertex. The following diagram shows the order of interconnect of the links. Links marked with P are inherited from the parent configuration. Links marked with a * represent a duplication of the indicated edge data structure (though not the data it points to). The diagrom follows the one above; the bold edge and vertex on the right side are the new elements. [Artwork node; type 'Artwork on' to command tool] Step 1: Create the edge and its data structures Step 2: Create the vertex and its data structures Step 3: Hook the edge into the object edge ring Step 4: Hook the vertex into the object edge ring Step 5: Hook the new edge into the edge rings for both faces Step 6: Point the new vertex at the two edges Step 7: Set up the starting vertex of the new edge Step 8: Direct the old edge to the new Vertex Step 9: Hook back the old bVertex into the new edge Step 10: Connect the aCW wings Step 11: Connect the bCCW wings Step 12: Connect the back wings of the new edge to the old edge Step 13: Connect the front wings of the old edge to the new edge remove the edge and one of its vertices, and move all edges into the deleted vertex to the other vertex [Artwork node; type 'Artwork on' to command tool] Remove the edge and return the face subsuming the two old faces [Artwork node; type 'Artwork on' to command tool] step 1: Delete the pointer from vertex a to the edge step 2: Delete the pointer from vertex b to the edge step 3: Repoint all edges pointing to face b to point to face a Step 4: Build the new edge ring for face a Step 5: Link the old wings on aVertex Step 6: Link the old wings on bVertex Step 7: Delete bFace from object Step 8: Delete edge from object Insert a new edge between two vertices. The edge is directed from v1 to v2. The order of updating the appropriate links is shown below. A * indicates that a copy of the indicated edge is created (but not the data it points to). The new edge is shown in bold. Steps 9 and 11 are in parentheses; they have been subsumed into steps 18 and 19, respectively. Links labeled with P are inherited from the parent configuration. [Artwork node; type 'Artwork on' to command tool] Setup: Find the four wings of the new edge Step 1: Create the new edge Step 2: Add the new edge to the object's edge ring Step 3: Create the new face Step 4: Add the new face to the object's face ring Step 5: Assign the first vertex to the new edge's tail Step 6: Assign the second vertex to the new edge's head Step 7: Insert the new edge into the edge-list at the head vertex Step 8: Insert the new edge into the edge-list at the tail vertex Step 9: Link the new edge to the new face Step 10: Link the new edge to the old face Step 11: Build the edge ring for the new face Step 12: Set the edges around the new face to point to the new face Step 13: Build the edge ring for the old face, and point the edges at the new face Step 14: Link the new face to the new edge Step 15: Link the old edge to the new face Step 16: Set the new edge's aCW wings Step 17: Set the new edge's bCCW wings Step 18: Set the new edge's bCW wings Step 19: Set the new edge's aCCW wings Cleanup: Reclaim old face edge ring, and replace old face edge ring with new Utility Cut the links and let the GC pick up the (now non-circular) storage Cut the links and let the GC pick up the (now non-circular) storage Cut the links and let the GC pick up the (now non-circular) storage ʋ"cedarcode" styleNewlineDelimiter J e6BJ'J&JJk NbJbln J3DJJJheadlJ !J&J.J3J (J-J2J-J2J.JJ "J'J&J3J8J $J2J $J)J2J7JJ 'J,J.J3J 'J,J )J.J+J0JJ1J.J.JJ 7JJ n ;""LJJ3J3J-JJLJ.J$J J2J-J5J'J)J11JSJ IJ)-J*J!J.J.(4J$J*J JJJ!JJ+JJJJJDJ)-J$JMJ'JJ+JJJ#;S /JJ>J.J.J:J$JJ+JJJOOJJ/J)J+JJ JJJ#=GJ66JJ  5:J$JJ+JJ J JJJ88JJ  7J$J J JJJ* > 6JJ   .J J9J HJ J"!'J JJJJKJ  5JJJ"J#J" 8J !J JJ $J$J+J JJJJJ#J $J"0J JJ4J *JJJ#JJJJ JJJJ%J &J1JJJ!JJJ88JJ  7JJ J JJJJ#E$2 /J>JJ>J>J.J.J.J.J:Jc"JJC!e2kxjxerox pressfonts Helvetica-mrr;/e e1.aF = e2.aFkxjxerox pressfonts Helvetica-mrrz>_/ e1.aCW _ e2kxjxerox pressfonts Helvetica-mrr  e2.aCCW _ e1kOq ?1 YOq q YOq xjOq ?1 YOq q YOq kxjOq q YkC3}?1 Yafa<I_KBC3}xjC3}?1 Yafa<I_KBC3}kxjOq ?1 Ykxjxerox pressfonts Helvetica-mrr=/ e2kxjxerox pressfonts Helvetica-mrrW^W;e1kxjxerox pressfonts Helvetica-mrrF7Mh e1.bF = e2.bFkxjxerox pressfonts Helvetica-mrrePD9 e1.bCCW _ e2kxjxerox pressfonts Helvetica-mrrXE 7 e2.bCW _ e1kxjxerox pressfonts Helvetica-mrrmWVih e1.bV = e2.aVka5o"Oa5Iuca5oxja5o"Oa5Iuca5okxja5oucksS)a5ouPJ}g27BsS)xjsS)a5ouPJ}g27BsS)kxja5o"Okga5oaS)Y(Bgxjga5oaS)Y(Bgkxjxerox pressfonts Helvetica-mrr5]e1kxjxerox pressfonts Helvetica-mrruq>C!e2kxjxerox pressfonts Helvetica-mrrO/e e1.aF = e2.bFkxjxerox pressfonts Helvetica-mrrB'/ e1.aCW _ e2kxjxerox pressfonts Helvetica-mrrEz)  e2.bCCW _ e1kq S1 Yq Bk" Yq xjq S1 Yq Bk" Yq kxjq Bk" Ykxjq S1 Ykxjxerox pressfonts Helvetica-mrrQ/ e2kxjxerox pressfonts Helvetica-mrr^W;e1kxjxerox pressfonts Helvetica-mrr]<7Mh e1.bF = e2.aFkxjxerox pressfonts Helvetica-mrrPD9 e1.bCCW _ e2kxjxerox pressfonts Helvetica-mrruE 7 e2.aCW _ e1kxjxerox pressfonts Helvetica-mrrVih e1.bV = e2.bVkxjWqkxjyqkxj%qkxjC5DA"kxjC DA"k{Eҫq S/zT/c{Eҫxj{Eҫq S/zT/c{Eҫk]Mb-qoq ,!/ e[a+]Mb-qxj]Mb-qoq ,!/ e[a+]Mb-qk_xC eq G-q[1+_xC exj_xC eq G-q[1+_xC ekxa eOq fGҫG<1+xa exjxa eOq fGҫG<1+xa ekxgJ}J5oaS)BxgJ}xjxgJ}J5oaS)BxgJ}k.3$]YfɳeBpIFS#.3$xj.3$]YfɳeBpIFS#.3$k S)oqoHG21B S)xj S)oqoHG21B S)kVC}fq YL>G491_KBVCxjVC}fq YL>G491_KBVCkkkg33JJ +G .J5.*J(J)J*J)J(JJ?FJ.*J(J)J*J)J(JJ?FJ.*J(J)J*J)J(JJ?FJ.*J(J)J*J)J(JJ?FJJELJ QJJ!J J*J JJ MJJ*J J(J JJ MJJ!J J(J JJ! M:?J7JJJ J   CJ J JJJJ  IJ-JJ JJJ   EJ-JJ JJ< 4J$;J!J!%JJ"J J#/JJJ +?J/GJJJJ0J$J  J$J JJJ M J J J"J J"J5 2GJ CJ)>J=J;2JAJJJ +?J/GJJ 8  0J2J-J (J!J!%JJ"J J"J JJJ +?J/GJJJJ0J"J  J"J JJJ 8JJJ0J!(J  J!(J JJ,, $=J%%JJ $=J%%JJ&BJ))J 0YJJ J'9J1J.IJ4@J5BJJJ4@J5BJJJBIJ JJ4_JJJ'9J  NJJ"JJ>!J$J5BJ!J4@J%J J>J!J4@J%J!J$J5BJ J>JJBIJ JJ4WJJ J'9J 3J.!J$J5BJ!J4@J%JJ8?J!J4@J%J!J$J5BJJ8?JJBIJ JJ9bseAKI9bxjI9bseAm >9bseAKI9bkxj3B!emk@IGemj.dqDM@IGxj@IGemj.dqDM@IGkxj37emFk@IM)emF[K0dqY@IM)xj@IM)emF[K0dqY@IM)kxjWA?B!kRQ@H?B!n_V)_)ZRQ@HxjRQ@H?B!n_V)_)ZRQ@HkxjWAF?7kRQ@a?7n__V -RQ@axjRQ@a?7n__V -RQ@akxjseAvGFFkIseAFm >seA7IxjIseAFm >seA7Ikə!E~Qe\}c59%Al]?l]9@}c5B H!E`ɗxjə!E~Qe\}c59%Al]?l]9@}c5B H!E`ɗk|7!ə!Ex5\}c5TAl]|7!?G6l]T@}c5`mH!El|7!ɗxj|7!ə!Ex5\}c5TAl]|7!?G6l]T@}c5`mH!El|7!ɗkʳə<!E/[Q=/}c5oAl]ʳ?^6l]o@}c5~H!EBxʳɗxjʳə<!E/[Q=/}c5oAl]ʳ?^6l]o@}c5~H!EBxʳɗk?8m2Ql6g#u+t Yn??8mz/EGyn?l%(l L?8m2xj?8m2Ql6g#u+t Yn??8mz/EGyn?l%(l L?8m2kAA2PQlRpu+tn?AAz/Elkn?//l)(l(AA2xjAA2PQlRpu+tn?AAz/Elkn?//l)(l(AA2k\A2V=lYyu+t in?\Az/Ekn?CW/l9(l\A2xj\A2V=lYyu+t in?\Az/Ekn?CW/l9(l\A2kwA2p>=l+t*n?wAz/E kn?W+/lJ(l&wA2xjwA2p>=l+t*n?wAz/E kn?W+/lJ(l&wA2kxji:C1TK kxj)m@fAkxj0a)m[AkxjA)mw>Akxj7mFq[FkxjemFq[FkxjWAFq[FkxjseAFq[Fkxjxerox pressfonts Helvetica-mrrc+Cekxjxerox pressfonts Helvetica-mrr7e.aCWkxjxerox pressfonts Helvetica-mrrc+x>3e.aCCWkxjxerox pressfonts Helvetica-mrrCCe.bCWkxjxerox pressfonts Helvetica-mrrMOAe.bCCWkxjxerox pressfonts Helvetica-mrr7x>3ekxjxerox pressfonts Helvetica-mrrCx>3ekxjxerox pressfonts Helvetica-mrrMOCekxjxerox pressfonts Helvetica-mrrBO+vertex=bkkkgJJJ J3J.J""J/;J*J"J)J.;JJ8?JJ""J)J.;J"J/;J*JJ8?JJBIJ JJ JJ-J@J@J9J&DJ JJ   &JJ J JJJ">J JJ   &JJ J JJJ">J JJ   &JJ J JJ  &JJ JJ J>J6J>JBJJ %JJ J J6J>JAJJ .J.JJ -J-J @J0KJ/SJ!'JJ  >JJHJ>>JJ DJ>>JJHJ>>J MJ>>JJ  SJ>>JJ  SJ>>JJ >JJ 6J>>J    PJ2JJ JJJ BJ>>JJ ?J>>JJ >JJ ?J>>JJ   JJJJ JJJJ   NJJJJ J#JJJ   KJJJJ J!JJJ   KJJ2JJ JJJ   @J ,J &J &J*J  +J>>JJ%GJ>>JJ"BJ>>JJ"BJ>>JJ .J J$J J J PJInterpress/Xerox/3.0 fjkj=xjmu+Dxj9Kڙhkxj&mY9Kڗ&mkxjs7Yhڗs7kxjxj }9Kڠk9KtA2tA2 J2A9KA JHAH JHtA9KtA Jkxjxj }hڠkhtA'92tA'92 J'92AhA J=A= J=tAhtA Jkhڙ"u 4r4hڗxjhڙ"u 4r4hڗkxjڙKkxjbHQYڗbHQkxjQYKڗQkxjxj }ڠktA>tA> J>AA J>A> J>tAtA Jkxjxj }KڠkKtA 3>tA 3> J 3>AKA J>A> J>tAKtA JkKڙtEu 4r4KڗxjKڙtEu 4r4Kڗkxjxj }ڠktA8tA8 J8AA JoAo JotAtA JkڙYku 4r4ڗxjڙYku 4r4ڗkxjxerox pressfonts Helvetica-mrrhFnewEdgekxj*ڙ9򗘠kxjxerox pressfonts Helvetica-mrr z newVertexkxjڙkxjxerox pressfonts Helvetica-mrrOoldEdgekxjڗkkkg Interpress:0.0 mm xmin 0.0 mm ymin 128.7435 mm xmax 31.97228 mm ymax 34.7945 mm bigger topLeading 34.7945 mm bigger topIndent 1.411111 mm bigger bottomLeading 0.5 0.3 0.95 backgroundColor the topLeading 6 pt .sub backgroundAscent 3 pt backgroundDescent 4 pt outlineBoxThickness 1 pt outlineBoxBearoff#Gargoyle file for scene: stuffed from Gargoyle at February 27, 1990 10:03:08 pm PST Produced by version 8906.16 Scripts: Slope: [F 150.0] [F 135.0] [F 120.0] [F 90.0] [F 60.0] [F 45.0] [F 30.0] [F 0.0] Angle: [F 90.0] [F 60.0] [F 45.0] [F 30.0] [F 0.0] [F -30.0] [F -45.0] [F -60.0] [F -90.0] Radius: [F 5.555556e-2 1/18] [F 0.1111111 1/9] [F 0.125 1/8] [F 0.25 1/4] [F 0.3333333 1/3] [F 0.5 1/2] [F 0.6666667 2/3] [F 0.75 3/4] [F 1.0 1] [F 2.0 2] [F 4.0 4] LineDistance: [F 0.0 0] [F 5.555556e-2 1/18] [F 0.1111111 1/9] [F 0.5 1/2] [F 1.0 1] Midpoints: F Heuristics: F ShowAlignments: T ScaleUnit: 72.0 DisplayStyle: print Gravity: T GravityExtent: 0.3472222 GravityType: pointsPreferred DefaultFont: xerox/xc1-2-2/helvetica [r1: 0.0 s: [10.0 10.0] r2: 0.0] 1.0 1.0 Defaults: [1 0.5] [1 1.0] 2.0 round round Dashed: F Shadows: []F Anchor: F Palette: F Entities: [20]: Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T F [112.8231,570.0] (Line ) [205.8231,570.0] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [2] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T F [89.44038,556.5] (Line ) [112.8231,570.0] (Line ) [89.44038,583.5] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [2] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T F [229.2058,556.5] (Line ) [205.8231,570.0] (Line ) [229.2058,583.5] fwd: T pList: ( ) Circle [0.0 -5.00313 112.8231 5.00313 0.0 570.0] strokeWidth: 2.0 strokeColor: [1 1.0] fillColor: [1 1.0] dashes: ( F ) props: ( F ) fwd: T pList: ( ) Circle [0.0 -5.00313 205.8231 5.00313 0.0 570.0] strokeWidth: 2.0 strokeColor: [1 1.0] fillColor: [1 1.0] dashes: ( F ) props: ( F ) fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T F [205.8231,570.0] (Line ) [182.6409,576.2116] (Line ) [182.6409,563.7884] (Line ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T F [334.0,570.0] (Line ) [427.0,570.0] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [2] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T F [310.6173,556.5] (Line ) [334.0,570.0] (Line ) [310.6173,583.5] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [2] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T F [450.3827,556.5] (Line ) [427.0,570.0] (Line ) [450.3827,583.5] fwd: T pList: ( ) Circle [0.0 -5.00313 334.0 5.00313 0.0 570.0] strokeWidth: 2.0 strokeColor: [1 1.0] fillColor: [1 1.0] dashes: ( F ) props: ( F ) fwd: T pList: ( ) Circle [0.0 -5.00313 427.0 5.00313 0.0 570.0] strokeWidth: 2.0 strokeColor: [1 1.0] fillColor: [1 1.0] dashes: ( F ) props: ( F ) fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T F [427.0,570.0] (Line ) [403.8178,576.2116] (Line ) [403.8178,563.7884] (Line ) fwd: T pList: ( ) Circle [0.0 -5.00313 380.5 5.00313 0.0 570.0] strokeWidth: 2.0 strokeColor: [1 1.0] fillColor: [1 1.0] dashes: ( F ) props: ( F ) fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T F [380.5,570.0] (Line ) [357.3178,576.2116] (Line ) [357.3178,563.7884] (Line ) fwd: T pList: ( ) Text T "newEdge" xerox/pressfonts/Helvetica [14.0 0.0 382.8142 0.0 14.0 602.0][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [394.0,570.0] (Line ) [409.0,594.0] fwd: T pList: ( ) Text T "newVertex" xerox/pressfonts/Helvetica [14.0 0.0 335.3335 0.0 14.0 524.0][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [380.5,570.0] (Line ) [377.0,543.0] fwd: T pList: ( ) Text T "oldEdge" xerox/pressfonts/Helvetica [14.0 0.0 313.0 0.0 14.0 602.0253][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [340.0,597.0] (Line ) [347.0,570.0] fwd: T pList: ( ) JJ;Interpress/Xerox/3.0 fjkj=xjZ xjMc6Dk6Dcۺ!e[=[6Dcxj6Dcۺ!e[=[6Dckxjvc1PgP JMPMc JMOPgOP J1OPvc Jkxj'\G4]1kxj#_zG4O1kxj6Dc6DPP_P JT'^PT'^c JT'^OPP_OP J6DOP6Dc JkxjcP=tP J/P/c J/OP=tOP JOPc JkxjE\GqPUkxjEzGqPvUkxjT'^ckxj4 ;\GmyAJ-13u|~DAD1hk^_ckcoKe[=[cxjcoKe[=[ckxj4 ;zGmy}{J-1J~u|q DAD{'hk_^_ckJ4 ;\GOWIJRqe>JxjJ4 ;\GOWIJRqe>Jkz`{q^_cUX)h9jgz`{qxjz`{q^_cUX)h9jgz`{qkxj szG#}{J5FJ~< Pq Dl{'Nlm_Ca_ckxj s\G#AJ5F3< P~Dl1NlmCa_ck{ szGNe|9IRChi>{xj{ szGNe|9IRChi>{k:6)9qCa_cTig:6)9qxj:6)9qCa_cTig:6)9qkxj+SzG\=}{JȧJ~vePq DwR{'ߛK_!0ckxj+S\G\=AJȧ3veP~DwR1ߛK!0ckdB+SzG=)|9I!hi>dBxjdB+SzG=)|9I!hi>dBk9q!0cnLi`Cg9qxj9q!0cnLi`Cg9qkxj<_cP_d_ck,Gp><_c&;.V5"O,Gp>xj,Gp><_c&;.V5"O,Gp>kxjd_cP_-<_ck_Yjm>d_c,IF _Yjm>xj_Yjm>d_c,IF _Yjm>kxjcJ_4]1]1kG S]1W^4aGG SxjG S]1W^4aGG SkxjSX/Fg$lNFg$c1LckoSVD&c1LchiXtCY%\oSVD&xjoSVD&c1LchiXtCY%\oSVD&kxjcJ_4O1O1kG ySO1W;^4apGG ySxjG ySO1W;^4apGG ySkxjSX/8q$lN8q$c1LckoSVAA&c1LchiHtCY\oSVAA&xjoSVAA&c1LchiHtCY\oSVAA&kxjl_cpO0see%<wLSlGgAU/`S__kxjcO0u%uz_ T wLS_JAU/ _kcAA&l_cHLC\cAA&xjcAA&l_cHLC\cAA&k_v _5$)hLM;8u)_vxj_v _5$)hLM;8u)_vkxjl_cpY!0see.<&SlGgdE/`S_kxjcY!0u.uz_ T &S_JdE/ kcD&l_cXLC%\cD&xjcD&l_cXLC%\cD&kAQ 5$)LM;X)AQxjAQ 5$)LM;X)AQkxjxerox pressfonts Helvetica-mrrm'WD Pkxjxerox pressfonts Helvetica-mrr[1kxjxerox pressfonts Helvetica-mrrO2kxjxerox pressfonts Helvetica-mrrɠ5a*kxjxerox pressfonts Helvetica-mrr 5b*kxjxerox pressfonts Helvetica-mrr>6a*kxjxerox pressfonts Helvetica-mrr "O6b*kxjxerox pressfonts Helvetica-mrr"O7kxjxerox pressfonts Helvetica-mrr A=8kxjxerox pressfonts Helvetica-mrr !O9*kxjxerox pressfonts Helvetica-mrrvO10kxjxerox pressfonts Helvetica-mrr 11kxjxerox pressfonts Helvetica-mrrpwO12kxjxerox pressfonts Helvetica-mrr{ 13kxjxerox pressfonts Helvetica-mrrm'W Pkxjxerox pressfonts Helvetica-mrrJ1CPkxjxerox pressfonts Helvetica-mrrҠobject edge ring: 3kxjxerox pressfonts Helvetica-mrrobject vertex ring: 4kxjkG zwShGkxjkG$zwSYGkkkg Interpress:0.0 mm xmin 0.0 mm ymin 140.6992 mm xmax 84.54365 mm ymax 87.36588 mm bigger topLeading 87.36588 mm bigger topIndent 1.411111 mm bigger bottomLeading 0.5 0.3 0.95 backgroundColor the topLeading 6 pt .sub backgroundAscent 3 pt backgroundDescent 4 pt outlineBoxThickness 1 pt outlineBoxBearoffiGargoyle file for scene: stuffed from Gargoyle at February 27, 1990 10:25:08 pm PST Produced by version 8906.16 Scripts: Slope: [F 150.0] [F 135.0] [F 120.0] [T 110.0] [T 90.0] [T 70.0] [F 60.0] [F 45.0] [F 30.0] [F 0.0] Angle: [F 90.0] [F 60.0] [F 45.0] [F 30.0] [F 0.0] [F -30.0] [F -45.0] [F -60.0] [F -90.0] Radius: [F 5.555556e-2 1/18] [F 0.1111111 1/9] [F 0.125 1/8] [F 0.25 1/4] [F 0.3333333 1/3] [F 0.5 1/2] [T 0.6666667 2/3] [F 0.75 3/4] [F 0.85 0.85] [F 1.0 1] [T 1.08 1.08] [F 1.3 1.3] [F 1.6 1.6] [F 2.0 2] [F 4.0 4] LineDistance: [F 0.0 0] [F 5.555556e-2 1/18] [F 0.1111111 1/9] [F 0.5 1/2] [F 1.0 1] Midpoints: F Heuristics: F ShowAlignments: T ScaleUnit: 72.0 DisplayStyle: print Gravity: T GravityExtent: 0.1736111 GravityType: pointsPreferred DefaultFont: xerox/xc1-2-2/helvetica [r1: 0.0 s: [10.0 10.0] r2: 0.0] 1.0 1.0 Defaults: [1 0.5] [1 1.0] 2.0 round round Dashed: F Shadows: []F Anchor: F Palette: F Entities: [62]: Cluster frozen: F Children: [2] Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [142.9309,451.0] (Line ) [205.9558,451.0] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [205.9558,451.0] (Line ) [194.6367,454.033] (Line ) [194.6367,447.967] (Line ) fwd: T pList: ( ) Circle [11.61255 0.0 131.3184 0.0 11.61255 451.0] strokeWidth: 1.0 strokeColor: [1 1.0] fillColor: [] dashes: ( F ) props: ( F ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [123.1071,459.2113] (Line ) [93.13462,489.1838] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [123.1071,442.7887] (Line ) [93.13463,412.8162] fwd: T pList: ( ) Circle [11.61255 0.0 217.5684 0.0 11.61255 451.0] strokeWidth: 1.0 strokeColor: [1 1.0] fillColor: [] dashes: ( F ) props: ( F ) fwd: T pList: ( ) Circle [11.61255 0.0 404.3184 0.0 11.61255 451.0] strokeWidth: 3.0 strokeColor: [1 1.0] fillColor: [] dashes: ( F ) props: ( F ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [412.5297,459.2113] (Line ) [465.4124,512.094] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [412.5297,442.7887] (Line ) [465.4124,389.906] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 3.0 c: T [1 1.0] d: T F [229.181,451.0] (Line ) [392.7059,451.0] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [225.7797,459.2113] (CubicSpline Type: Natural 1 [243.0242,476.4558] ) [253.5684,451.0] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 3.0 c: T [1 1.0] d: T F [392.7059,451.0] (Line ) [381.3867,454.033] (Line ) [381.3867,447.967] (Line ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [225.7797,442.7887] (CubicSpline Type: Natural 1 [243.0242,425.5442] ) [253.5684,451.0] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [230.2353,470.0497] (Line ) [225.7797,459.2113] (Line ) [235.0575,466.3698] (Arc [232.6464,468.2098] ) fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [254.6992,439.3363] (Line ) [253.5684,451.0] (Line ) [248.7158,440.3335] (Arc [251.7075,439.8349] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [209.3571,442.7887] (CubicSpline Type: Natural 1 [192.1125,425.5442] ) [181.5684,451.0] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [209.3571,459.2113] (CubicSpline Type: Natural 1 [192.1125,476.4558] ) [181.5684,451.0] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [204.9015,431.9503] (Line ) [209.3571,442.7887] (Line ) [200.0792,435.6302] (Arc [202.4904,433.7902] ) fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [180.4376,462.6637] (Line ) [181.5684,451.0] (Line ) [186.421,461.6665] (Arc [183.4293,462.1651] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [396.1071,442.7887] (CubicSpline Type: Natural 1 [378.8626,425.5442] ) [368.3184,451.0] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [396.1071,459.2113] (CubicSpline Type: Natural 1 [378.8626,476.4558] ) [368.3184,451.0] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [391.6515,431.9503] (Line ) [396.1071,442.7887] (Line ) [386.8292,435.6302] (Arc [389.2403,433.7902] ) fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [367.1876,462.6637] (Line ) [368.3184,451.0] (Line ) [373.171,461.6665] (Arc [370.1792,462.1651] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [163.5684,451.0] (Arc [217.5684,505.0] ) [271.5684,451.0] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [161.6761,462.5646] (Line ) [163.5684,451.0] (Line ) [167.7119,461.9614] (Arc [164.694,462.263] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [271.5684,451.0] (Arc [217.5684,397.0] ) [163.5684,451.0] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [273.4607,439.4354] (Line ) [271.5684,451.0] (Line ) [267.4249,440.0386] (Arc [270.4428,439.737] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [350.3184,451.0] (Arc [366.1346,489.1838] ) [442.5022,489.1838] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [431.5721,493.4097] (Line ) [442.5022,489.1838] (Line ) [435.1494,498.3085] (Arc [433.3608,495.859] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [453.9573,500.6389] (Arc [354.6795,500.6389] ) [334.1184,451.0] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [331.3838,462.395] (Line ) [334.1184,451.0] (Line ) [337.4476,462.2356] (Arc [334.4157,462.3153] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [350.3184,451.0] (Arc [366.1346,412.8162] ) [442.5022,412.8162] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [431.5721,408.5903] (Line ) [442.5022,412.8162] (Line ) [435.1494,403.6915] (Arc [433.3608,406.1409] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [453.9573,401.3611] (Arc [354.6795,401.3611] ) [334.1184,451.0] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [331.3838,439.605] (Line ) [334.1184,451.0] (Line ) [337.4476,439.7644] (Arc [334.4157,439.6847] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [292.5684,451.0] (CubicSpline Type: Natural 1 [284.3184,382.0] ) [259.5684,343.75] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [308.3184,451.0] (CubicSpline Type: Natural 1 [316.5684,382.0] ) [341.3184,343.75] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [289.8338,439.605] (Line ) [292.5684,451.0] (Line ) [295.8976,439.7644] (Arc [292.8657,439.6847] ) fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [336.5004,354.4322] (Line ) [341.3184,343.75] (Line ) [331.8048,350.5921] (Arc [334.1526,352.5122] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [292.5684,451.0] (CubicSpline Type: Natural 1 [284.3184,520.0] ) [259.5684,558.25] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [308.3184,451.0] (CubicSpline Type: Natural 1 [316.5684,520.0] ) [341.3184,558.25] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [289.8338,462.395] (Line ) [292.5684,451.0] (Line ) [295.8976,462.2356] (Arc [292.8657,462.3153] ) fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [336.5004,547.5678] (Line ) [341.3184,558.25] (Line ) [331.8048,551.4079] (Arc [334.1526,549.4879] ) fwd: T pList: ( ) Text T "P" xerox/pressfonts/Helvetica [14.0 0.0 321.184 0.0 14.0 556.6154][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "1" xerox/pressfonts/Helvetica [14.0 0.0 318.0 0.0 14.0 438.4351][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "2" xerox/pressfonts/Helvetica [14.0 0.0 400.0625 0.0 14.0 446.0252][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "5a*" xerox/pressfonts/Helvetica [14.0 0.0 267.1875 0.0 14.0 553.0][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "5b*" xerox/pressfonts/Helvetica [14.0 0.0 263.9688 0.0 14.0 335.0][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "6a*" xerox/pressfonts/Helvetica [14.0 0.0 232.1875 0.0 14.0 414.0][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "6b*" xerox/pressfonts/Helvetica [14.0 0.0 183.9688 0.0 14.0 480.0252][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "7" xerox/pressfonts/Helvetica [14.0 0.0 235.0625 0.0 14.0 480.0252][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "8" xerox/pressfonts/Helvetica [14.0 0.0 196.0625 0.0 14.0 413.0][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "9*" xerox/pressfonts/Helvetica [14.0 0.0 388.125 0.0 14.0 473.0252][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "10" xerox/pressfonts/Helvetica [14.0 0.0 386.257 0.0 14.0 385.0252][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "11" xerox/pressfonts/Helvetica [14.0 0.0 387.125 0.0 14.0 508.0][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "12" xerox/pressfonts/Helvetica [14.0 0.0 208.0 0.0 14.0 507.0252][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "13" xerox/pressfonts/Helvetica [14.0 0.0 209.125 0.0 14.0 383.6154][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "P" xerox/pressfonts/Helvetica [14.0 0.0 321.184 0.0 14.0 334.6154][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "P" xerox/pressfonts/Helvetica [14.0 0.0 391.408 0.0 14.0 419.0][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "object edge ring: 3" xerox/pressfonts/Helvetica [14.0 0.0 76.5 0.0 14.0 562.0][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "object vertex ring: 4" xerox/pressfonts/Helvetica [14.0 0.0 69.07999 0.0 14.0 542.0][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T F [387.9014,405.8948] (Line ) [377.7229,377.9295] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T F [387.9014,496.1052] (Line ) [377.7229,524.0705] fwd: T pList: ( ) 33JJ/J$J 6J!J/1JJ&JZZ/J?1JBX>X) JXe>) e> JmHe>mH) JmH>) > Jkxjxj }XE)kXE> 2> 2) J 2e>XEe> JHe>H) JH>XE> JkXE)SQ4N4XE)xjXE)SQ4N4XE)kxjxerox pressfonts Helvetica-mrr"W aFacekxjxerox pressfonts Helvetica-mrrG~ObFacekxjxerox pressfonts Helvetica-mrrwOaVkxjxerox pressfonts Helvetica-mrri(x ObVkxj[Q)[Q-kxjQ)Q-kxjxj })k>~>>~>) J~>e>e> J>e>>) J>>> Jkxjxerox pressfonts Helvetica-mrrtw aFacekxjxerox pressfonts Helvetica-mrri~ObFacekxjxerox pressfonts Helvetica-mrrwOaVkkkg Interpress:0.0 mm xmin 0.0 mm ymin 134.3774 mm xmax 19.76072 mm ymax 22.58295 mm bigger topLeading 22.58295 mm bigger topIndent 1.411111 mm bigger bottomLeading 0.5 0.3 0.95 backgroundColor the topLeading 6 pt .sub backgroundAscent 3 pt backgroundDescent 4 pt outlineBoxThickness 1 pt outlineBoxBearoffGargoyle file for scene: stuffed from ///Users/Glassner.pa/Mesa/fig1.gargoyle at February 25, 1990 9:57:34 pm PST Produced by version 8906.16 Scripts: Slope: [T 165.0] [F 150.0] [F 135.0] [F 120.0] [F 90.0] [F 63.87642] [F 60.0] [F 45.0] [F 30.0] [T 15.0] [T 0.0] Angle: [F 90.0] [F 60.0] [F 45.0] [F 30.0] [F 0.0] [F -30.0] [F -45.0] [F -60.0] [F -90.0] Radius: [F 5.555556e-2 1/18] [F 0.1111111 1/9] [F 0.125 1/8] [F 0.25 1/4] [T 0.3333333 1/3] [F 0.5 1/2] [F 0.6666667 2/3] [F 0.75 3/4] [F 1.0 1] [F 1.5 1.5] [F 2.0 2] [F 4.0 4] LineDistance: [F 0.0 0] [F 5.555556e-2 1/18] [F 0.1111111 1/9] [F 0.5 1/2] [F 1.0 1] Midpoints: T Heuristics: F ShowAlignments: T ScaleUnit: 72.0 DisplayStyle: print Gravity: T GravityExtent: 4.340278e-2 GravityType: pointsPreferred DefaultFont: xerox/xc1-2-2/helvetica [r1: 0.0 s: [10.0 10.0] r2: 0.0] 1.0 1.0 Defaults: [1 0.5] [1 1.0] 2.0 round round Dashed: F Shadows: []F Anchor: T [80.82309,393.0] Palette: F Entities: [16]: Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T F [80.82309,393.0] (Line ) [173.8231,393.0] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [2] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T F [57.44038,379.5] (Line ) [80.82309,393.0] (Line ) [57.44038,406.5] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [2] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T F [197.2058,379.5] (Line ) [173.8231,393.0] (Line ) [197.2058,406.5] fwd: T pList: ( ) Circle [0.0 -5.00313 80.82309 5.00313 0.0 393.0] strokeWidth: 2.0 strokeColor: [1 1.0] fillColor: [1 1.0] dashes: ( F ) props: ( F ) fwd: T pList: ( ) Circle [0.0 -5.00313 173.8231 5.00313 0.0 393.0] strokeWidth: 2.0 strokeColor: [1 1.0] fillColor: [1 1.0] dashes: ( F ) props: ( F ) fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T F [173.8231,393.0] (Line ) [150.6409,399.2117] (Line ) [150.6409,386.7883] (Line ) fwd: T pList: ( ) Text T "aFace" xerox/pressfonts/Helvetica [14.0 0.0 100.092 0.0 14.0 366.6154][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "bFace" xerox/pressfonts/Helvetica [14.0 0.0 99.87326 0.0 14.0 410.0252][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "aV" xerox/pressfonts/Helvetica [14.0 0.0 51.4705 0.0 14.0 388.0252][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "bV" xerox/pressfonts/Helvetica [14.0 0.0 188.2517 0.0 14.0 389.0252][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [2] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T F [289.6173,379.5] (Line ) [313.0,393.0] (Line ) [289.6173,406.5] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [2] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T F [429.3827,379.5] (Line ) [313.0,393.0] (Line ) [429.3827,406.5] fwd: T pList: ( ) Circle [0.0 -5.00313 313.0 5.00313 0.0 393.0] strokeWidth: 2.0 strokeColor: [1 1.0] fillColor: [1 1.0] dashes: ( F ) props: ( F ) fwd: T pList: ( ) Text T "aFace" xerox/pressfonts/Helvetica [14.0 0.0 332.2689 0.0 14.0 366.6154][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "bFace" xerox/pressfonts/Helvetica [14.0 0.0 332.0502 0.0 14.0 410.0252][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "aV" xerox/pressfonts/Helvetica [14.0 0.0 283.6474 0.0 14.0 388.0252][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) 33JJJ5JJ  I?JJvGargoyle file for scene: stuffed from Gargoyle at March 8, 1990 9:04:42 pm PST Produced by version 8906.16 Scripts: Slope: [F 150.0] [F 135.0] [F 120.0] [F 90.0] [F 60.0] [F 45.0] [F 30.0] [T 0.0] Angle: [F 90.0] [F 60.0] [F 45.0] [F 30.0] [F 0.0] [F -30.0] [F -45.0] [F -60.0] [F -90.0] Radius: [F 5.555556e-2 1/18] [F 0.1111111 1/9] [F 0.125 1/8] [F 0.25 1/4] [F 0.3333333 1/3] [F 0.5 1/2] [F 0.6666667 2/3] [F 0.75 3/4] [F 1.0 1] [F 2.0 2] [F 4.0 4] LineDistance: [F 0.0 0] [F 5.555556e-2 1/18] [F 0.1111111 1/9] [F 0.5 1/2] [F 1.0 1] Midpoints: F Heuristics: F ShowAlignments: T ScaleUnit: 72.0 DisplayStyle: print Gravity: T GravityExtent: 0.3472222 GravityType: pointsPreferred DefaultFont: xerox/xc1-2-2/helvetica [r1: 0.0 s: [10.0 10.0] r2: 0.0] 1.0 1.0 Defaults: [1 0.5] [1 1.0] 2.0 round round Dashed: F Shadows: []F Anchor: F Palette: F Entities: [74]: Circle [11.61255 0.0 404.3184 0.0 11.61255 451.0] strokeWidth: 1.0 strokeColor: [1 1.0] fillColor: [] dashes: ( F ) props: ( F ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [412.5297,459.2113] (Line ) [485.7771,532.4588] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [412.5297,442.7887] (Line ) [485.7771,369.5413] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 3.0 c: T [1 1.0] d: T F [208.1809,451.0] (Line ) [392.7059,451.0] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 3.0 c: T [1 1.0] d: T F [392.7059,451.0] (Line ) [381.3867,454.033] (Line ) [381.3867,447.967] (Line ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [396.1071,459.2113] (CubicSpline Type: Natural 1 [378.8626,476.4558] ) [368.3184,451.0] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [367.1876,462.6637] (Line ) [368.3184,451.0] (Line ) [373.171,461.6665] (Arc [370.1792,462.1651] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [453.9573,500.6389] (Arc [354.6795,500.6389] ) [334.1184,451.0] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [331.3838,462.395] (Line ) [334.1184,451.0] (Line ) [337.4476,462.2356] (Arc [334.4157,462.3153] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [453.9573,401.3611] (Arc [354.6795,401.3611] ) [334.1184,451.0] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [331.3838,439.605] (Line ) [334.1184,451.0] (Line ) [337.4476,439.7644] (Arc [334.4157,439.6847] ) fwd: T pList: ( ) Text T "object edge ring: 8" xerox/pressfonts/Helvetica [14.0 0.0 303.0 0.0 14.0 241.6154][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Circle [-11.61255 0.0 196.5684 0.0 11.61255 451.0] strokeWidth: 1.0 strokeColor: [1 1.0] fillColor: [] dashes: ( F ) props: ( F ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [188.3571,459.2113] (Line ) [115.1097,532.4588] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [188.3571,442.7887] (Line ) [115.1097,369.5413] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [204.7797,459.2113] (CubicSpline Type: Natural 1 [222.0242,476.4558] ) [232.5684,451.0] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [233.6992,462.6637] (Line ) [232.5684,451.0] (Line ) [227.7158,461.6665] (Arc [230.7076,462.1651] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [146.9295,500.6389] (Arc [246.2073,500.6389] ) [266.7684,451.0] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [269.503,462.395] (Line ) [266.7684,451.0] (Line ) [263.4392,462.2356] (Arc [266.4711,462.3153] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [146.9295,401.3611] (Arc [246.2073,401.3611] ) [266.7684,451.0] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [269.503,439.605] (Line ) [266.7684,451.0] (Line ) [263.4392,439.7644] (Arc [266.4711,439.6847] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [259.5684,265.99] (Line ) [341.3184,265.99] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T T [4.0 8.0] 0.0 0.0 [259.5684,265.99] (CubicSpline Type: BSpline 2 [181.8084,265.99] [89.65385,344.0854] ) [115.1097,369.5413] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T T [4.0 8.0] 0.0 0.0 [341.3184,265.99] (CubicSpline Type: BSpline 2 [419.0784,265.99] [511.233,344.0854] ) [485.7771,369.5413] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [259.5684,636.01] (Line ) [341.3184,636.01] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T T [4.0 8.0] 0.0 0.0 [259.5684,636.01] (CubicSpline Type: BSpline 2 [181.8084,636.01] [89.65385,557.9146] ) [115.1097,532.4588] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T T [4.0 8.0] 0.0 0.0 [341.3184,636.01] (CubicSpline Type: BSpline 2 [419.0784,636.01] [511.233,557.9146] ) [485.7771,532.4588] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [300.4434,265.99] (Line ) [300.4434,324.0] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [297.4104,312.6808] (Line ) [300.4434,324.0] (Line ) [303.4763,312.6808] (Arc [300.4434,312.6808] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [300.4434,636.01] (Line ) [300.4434,578.0] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [297.4104,589.3192] (Line ) [300.4434,578.0] (Line ) [303.4763,589.3192] (Arc [300.4434,589.3192] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [134.2843,513.2843] (Line ) [175.3036,554.3036] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [169.4443,544.155] (Line ) [175.3036,554.3036] (Line ) [165.1551,548.4443] (Arc [167.2997,546.2997] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [131.2842,385.7158] (Line ) [172.3035,344.6965] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [166.4442,354.8451] (Line ) [172.3035,344.6965] (Line ) [162.155,350.5558] (Arc [164.2996,352.7004] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [469.6026,516.2842] (Line ) [428.5833,557.3036] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [434.4425,547.1549] (Line ) [428.5832,557.3036] (Line ) [438.7317,551.4441] (Arc [436.5871,549.2996] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [469.6026,385.7158] (Line ) [428.5833,344.6965] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [434.4425,354.845] (Line ) [428.5832,344.6965] (Line ) [438.7317,350.5558] (Arc [436.5871,352.7004] ) fwd: T pList: ( ) Text T "2" xerox/pressfonts/Helvetica [14.0 0.0 393.0 0.0 14.0 466.0252][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "1" xerox/pressfonts/Helvetica [14.0 0.0 199.0 0.0 14.0 467.4351][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "3" xerox/pressfonts/Helvetica [14.0 0.0 179.125 0.0 14.0 546.0][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "6" xerox/pressfonts/Helvetica [14.0 0.0 388.125 0.0 14.0 385.0252][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "6" xerox/pressfonts/Helvetica [14.0 0.0 385.25 0.0 14.0 507.4351][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "object face ring: 7" xerox/pressfonts/Helvetica [14.0 0.0 170.0625 0.0 14.0 241.6154][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [280.0,578.0] (Line ) [280.0,636.01] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [276.967,624.6908] (Line ) [280.0,636.01] (Line ) [283.0329,624.6908] (Arc [280.0,624.6908] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [165.8036,563.8036] (Line ) [124.7843,522.7843] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [130.6436,532.9329] (Line ) [124.7843,522.7843] (Line ) [134.9328,528.6436] (Arc [132.7882,530.7882] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [163.3035,335.6965] (Line ) [122.2842,376.7158] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [128.1435,366.5672] (Line ) [122.2842,376.7158] (Line ) [132.4328,370.8565] (Arc [130.2881,368.7119] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [438.1399,335.1399] (Line ) [479.1592,376.1592] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [473.2999,366.0106] (Line ) [479.1592,376.1592] (Line ) [469.0106,370.2999] (Arc [471.1553,368.1553] ) fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [436.6399,565.3603] (Line ) [477.6591,524.3409] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [471.7998,534.4894] (Line ) [477.6591,524.3409] (Line ) [467.5106,530.2] (Arc [469.6552,532.3448] ) fwd: T pList: ( ) Text T "5" xerox/pressfonts/Helvetica [14.0 0.0 198.25 0.0 14.0 507.0252][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [285.0,324.0] (Line ) [285.0,265.99] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (fence) [2] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [281.967,277.3092] (Line ) [285.0,265.99] (Line ) [288.0329,277.3092] (Arc [285.0,277.3092] ) fwd: T pList: ( ) Text T "5" xerox/pressfonts/Helvetica [14.0 0.0 197.125 0.0 14.0 384.6154][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "P" xerox/pressfonts/Helvetica [14.0 0.0 179.408 0.0 14.0 337.0252][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "P" xerox/pressfonts/Helvetica [14.0 0.0 307.408 0.0 14.0 289.6154][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "P" xerox/pressfonts/Helvetica [14.0 0.0 414.408 0.0 14.0 342.6154][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "va" xerox/pressfonts/Helvetica [14.0 0.0 165.5625 0.0 14.0 446.0][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "vb" xerox/pressfonts/Helvetica [14.0 0.0 422.125 0.0 14.0 447.0][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "4" xerox/pressfonts/Helvetica [14.0 0.0 265.0625 0.0 14.0 600.0][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "3" xerox/pressfonts/Helvetica [14.0 0.0 305.0 0.0 14.0 598.6154][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "3" xerox/pressfonts/Helvetica [14.0 0.0 414.0625 0.0 14.0 552.0][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "4" xerox/pressfonts/Helvetica [14.0 0.0 170.0625 0.0 14.0 568.0][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "4" xerox/pressfonts/Helvetica [14.0 0.0 424.0625 0.0 14.0 567.0][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "4" xerox/pressfonts/Helvetica [14.0 0.0 427.0625 0.0 14.0 326.0][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "4" xerox/pressfonts/Helvetica [14.0 0.0 271.0625 0.0 14.0 290.0][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "4" xerox/pressfonts/Helvetica [14.0 0.0 165.0625 0.0 14.0 325.0][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "7" xerox/pressfonts/Helvetica [14.0 0.0 271.0625 0.0 14.0 540.0][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) Text T "8" xerox/pressfonts/Helvetica [14.0 0.0 298.0625 0.0 14.0 459.0][] F 1.0 props: ( F ) ls: 1.2 pList: ( ) 143.7433 mm bigger topLeading 143.7433 mm bigger topIndent 1.411111 mm bigger bottomLeading 0.5 0.3 0.95 backgroundColor the topLeading 6 pt .sub backgroundAscent 3 pt backgroundDescent 4 pt outlineBoxThickness 1 pt outlineBoxBearoff:0.0 mm xmin 0.0 mm ymin 139.8309 mm xmax 140.9211 mm ymax  InterpressDInterpress/Xerox/3.0 fjkj=xj})xjcP=tP J/P/c J/OP=tOP JOPc JkxjE\G)UkxjEzG)XmkxjLq^ckcoKe[=[cxjcoKe[=[ckxj+S\GxDOAJ)6Kz3~DwR%ߛKv!0ckn!0cnLi`Cgnxjn!0cnLi`CgnkxjSX/Fg$lNFg$c1LckoSVNQc1LchiXtCY%\oSVNQxjoSVNQc1LchiXtCY%\oSVNQkxjSX/8q$lN8q$c1LckoSVQc1LchiHtCY\oSVQxjoSVQc1LchiHtCY\oSVQkxjxerox pressfonts Helvetica-mrr E object edge ring: 8kxjUcicUciPH_P J1!DP1!Dc J1!DOPH_OP JUciOPUcic Jkxj M\G$RUkxj MzG$RXmkxj/2;\GcyAJ)16k|~D? G%`kvVN_ckpI{nVN_cT_i_jgpI{nxjpI{nVN_cT_i_jgpI{nkxjYFg$NRFg$b_ckNQb_cnkXlAh%\NQxjNQb_cnkXlAh%\NQkxjY8q$NR8q$b_ckQb_cnkHlAh\QxjQb_cnkHlAh\Qkxj`S_gd Ɏkxj`S_gd`S_gd`S_gdgdS[gdAQgd0Hz4y.5{E8&iZͤ,siUbL}JmM$RzU$RzU$RzUkxj gd gd gdmTOgd؝gdegdnOC0g;4y.DE83Eͤ"kiu=L}a3mM)zU)zU)zUkxj`S_c Ɏkxj`S_c`S_c`S_ccS[cAQcHzm.5{8&iZ[,sUb"}JwC$RU$RU$RUkxj c c cmTOc؝cecnOCg;m.D83E["ku="}a3wC)U)U)Ukxj|gjgd䏘k9h/|gj9h/|gj9h/9h/xj9h/|gj9h/|gj9h/9h/kxj|gjc⏘kl2/|gjl2/|gjl2/l2/xjl2/|gjl2/|gjl2/l2/kxj5fz_&Y8yA8k{I:&Y8yA8%k:H ճG"3{I:xj{I:&Y8yA8%k:H ճG"3{I:kxj0_X%8Kg8k#GbjG%8Kg8~rۗF#GbjGxj#GbjG%8Kg8~rۗF#GbjGkxjIyX y8kg=G y8FD):9Ns.'rg=Gxjg=G y8FD):9Ns.'rg=GkxjIX Kg8kg=bjG Kg8FD)rۗNs.Fg=bjGxjg=bjG Kg8FD)rۗNs.Fg=bjGkxjxerox pressfonts Helvetica-mrr)H(2kxjxerox pressfonts Helvetica-mrrg21kxjxerox pressfonts Helvetica-mrr 3kxjxerox pressfonts Helvetica-mrr !w6kxjxerox pressfonts Helvetica-mrr6kxjxerox pressfonts Helvetica-mrr  E object face ring: 7kxjckbt[67cCq=6767bt[67xjbt[67cCq=6767bt[67kxj$E8{U83h&3k3e6/3h&3>wW,U=U3e6/xj3e6/3h&3>wW,U=U3e6/kxj#8Io8-a_Xko_C-a_X"CC ߗ;T;o_Cxjo_C-a_X"CC ߗ;T;o_CkxjU2Au2R[,@,k} e^R[,@,7^w j:Si:} e^xj} e^R[,@,7^w j:Si:} e^kxj*,YR,Z,k 7b!/R,Z,U/ [54dBxjdB+SzG=)|9I$i>dBkn!0cnLi`Cgnxjn!0cnLi`CgnkxjcJ_4]1`]1k^u=`]1W^4aG^u=xj^u=`]1W^4aG^u=kxjSX/Fg$lNFg$c1LckoSVNQc1LchiXtCY%\oSVNQxjoSVNQc1LchiXtCY%\oSVNQkxjcJ_4O1`O1k^a\=`O1W;^4apG^a\=xj^a\=`O1W;^4apG^a\=kxjSX/8q$lN8q$c1LckoSVQc1LchiHtCY\oSVQxjoSVQc1LchiHtCY\oSVQkxjl_cpO0see%<{hlGgAU/`S__kxjcO0u%uz_ T {h_JAU/_kcQl_cHLC\cQxjcQl_cHLC\cQkvp%Q _5$)hLM;8u)vp%Qxjvp%Q _5$)hLM;8u)vp%Qkxjl_cpY!0see.<&SlGgdE/`S_kxjcY!0u.uz_ T &S_JdE/kcNQl_cXLC%\cNQxjcNQl_cXLC%\cNQkvAQ 5$)LM;X)vAQxjvAQ 5$)LM;X)vAQkxjxerox pressfonts Helvetica-mrr[1kxjxerox pressfonts Helvetica-mrr{iwobject edge ring: 2kxjkG zwShGkxjkG$zwSYGkxjUcicUciPH_P J1!DP1!Dc J1!DOPH_OP JUciOPUcic Jkxj M\G$RUkxj MzG$RXmkxj/2;zGcy}{J)1{k|q D? Gc`kbtVN_ckxj/2;\GcyAJ)16k|~D? G%`kvVN_ck /2;zGHW|9ICRi> xj /2;zGHW|9ICRi> kpI{nVN_cT_i_jgpI{nxjpI{nVN_cT_i_jgpI{nkxj\_cgq]1 ]1k:Yu= ]1@c^dG:Yu=xj:Yu= ]1@c^dG:Yu=kxjYFg$NRFg$b_ckNQb_cnkXlAh%\NQxjNQb_cnkXlAh%\NQkxj\_cgqO1 O1k:Ya\= O1@c;^dpG:Ya\=xj:Ya\= O1@c;^dpG:Ya\=kxjY8q$NR8q$b_ckQb_cnkHlAh\QxjQb_cnkHlAh\Qkxj8D 5-=hGkxj8D$5-=YGkxj`S_gd Ɏkxj`S_gd`S_gd`S_gdgdS[gdAQgd0Hz4y.5{E8&iZͤ,siUbL}JmM$RzU$RzU$RzUkxj gd gd gdmTOgd؝gdegdnOC0g;4y.DE83Eͤ"kiu=L}a3mM)zU)zU)zUkxj`S_c Ɏkxj`S_c`S_c`S_ccS[cAQcHzm.5{8&iZ[,sUb"}JwC$RU$RU$RUkxj c c cmTOc؝cecnOCg;m.D83E["ku="}a3wC)U)U)Ukxj|gjgd䏘k9h/|gj9h/|gj9h/9h/xj9h/|gj9h/|gj9h/9h/kxj|gjc⏘kl2/|gjl2/|gjl2/l2/xjl2/|gjl2/|gjl2/l2/kxj5fz_&Y8yA8k{I:&Y8yA8%k:H ճG"3{I:xj{I:&Y8yA8%k:H ճG"3{I:kxj0_X%8Kg8k#GbjG%8Kg8~rۗF#GbjGxj#GbjG%8Kg8~rۗF#GbjGkxjIyX y8kg=G y8FD):9Ns.'rg=Gxjg=G y8FD):9Ns.'rg=GkxjIX Kg8kg=bjG Kg8FD)rۗNs.Fg=bjGxjg=bjG Kg8FD)rۗNs.Fg=bjGkxjxerox pressfonts Helvetica-mrr A(5kxjxerox pressfonts Helvetica-mrr*F6kxjxerox pressfonts Helvetica-mrr)H(7*kxjxerox pressfonts Helvetica-mrrg28*kxjxerox pressfonts Helvetica-mrr-#蠢10kxjxerox pressfonts Helvetica-mrr 12kxjxerox pressfonts Helvetica-mrrࠢ13kxjxerox pressfonts Helvetica-mrr!O14kxjxerox pressfonts Helvetica-mrr 15kxjxerox pressfonts Helvetica-mrr !vO16kxjxerox pressfonts Helvetica-mrrl17kxjxerox pressfonts Helvetica-mrr- iwobject face ring: 4kxjxerox pressfonts Helvetica-mrrG&E jkxjxerox pressfonts Helvetica-mrrMwE kkxjxerox pressfonts Helvetica-mrr$kOE rkxjxerox pressfonts Helvetica-mrr TE skxjckbt[67cCq=6767bt[67xjbt[67cCq=6767bt[67kxj$E8{U83h&3k3e6/3h&3>wW,U=U3e6/xj3e6/3h&3>wW,U=U3e6/kxj#8Io8-a_Xko_C-a_X"CC ߗ;T;o_Cxjo_C-a_X"CC ߗ;T;o_CkxjU2Au2R[,@,k} e^R[,@,7^w j:Si:} e^xj} e^R[,@,7^w j:Si:} e^kxj*cR,Z,k 7b!/R,Z,U/ [54>JEJJ4J7J4J:J?JJ $dJJ J#JJJJJJJJ #J55JJJ!KJJ JJJJJJ J JJJGJJ#JJJJJJ J JJJGJJ JJJJJJ J JJJ*JCJJ5J 1J JJ&JCJJ5J 1J JJJ&JCJJ5J 1J JJJJJJJ