DIRECTORY G3dBasic, G3dTriangle, Rope; ImplicitCubeTet: CEDAR DEFINITIONS ~ BEGIN Triple: TYPE ~ G3dBasic.Triple; IntTriple: TYPE ~ G3dTriangle.IntTriple; IntTriples: TYPE ~ G3dTriangle.IntTriples; Segments: TYPE ~ G3dTriangle.Segments; Triangle: TYPE ~ G3dTriangle.Triangle; Triangles: TYPE ~ G3dTriangle.Triangles; ROPE: TYPE ~ Rope.ROPE; CornerState: TYPE ~ {unset, positive, negative}; Corner: TYPE ~ RECORD [ id: IntTriple, pos: Triple, value: REAL ¬ 0, state: CornerState, on: BOOL ¬ FALSE]; TwoCorners: TYPE ~ RECORD [a, b: REF Corner]; ThreeCorners: TYPE ~ RECORD [a, b, c: REF Corner]; ThreeEdges: TYPE ~ RECORD [a, b, c: TetEdge]; Cube: TYPE ~ RECORD [ id: IntTriple, -- corresponds with cube.lbn.id lbn, lbf, ltn, ltf: REF Corner, rbn, rbf, rtn, rtf: REF Corner, l, r, b, t, n, f, diag: REAL]; CubeProc: TYPE ~ PROC [cube: REF Cube, inCube: REF Triangles] -- incube intersect cube RETURNS [continue: BOOL ¬ TRUE]; TetFace: TYPE ~ {abc, abd, acd, bcd}; TetEdge: TYPE ~ {ab, ac, ad, bc, bd, cd}; TetProc: TYPE ~ PROC [tet: REF Tetrahedron] RETURNS [continue: BOOL ¬ TRUE]; Tetrahedron: TYPE ~ RECORD [ a, b, c, d: REF Corner ¬ NIL, -- b, c, d to appear cw viewed from a cube: REF Cube ¬ NIL, -- the "parent" cube triangles: ARRAY TetFace OF REF Triangle, which: INT -- relation to cube, should be IN [0..5) ]; TetIntersection: TYPE ~ RECORD [point: Triple, inside: BOOL, face: TetFace]; TetIntersections: TYPE ~ RECORD [length:INT¬0,s:SEQUENCE maxLength:INT OF TetIntersection]; TetIntersectProc: TYPE ~ PROC [nEdges: INT, e1, e2, e3, e4: TetEdge]; EventType: TYPE ~ {entry, exit, inside, graze}; Event: TYPE ~ RECORD [p: Triple, type: EventType, face: TetFace, seg: INT]; Events: TYPE ~ RECORD [length: INT ¬ 0, s: SEQUENCE maxLength: INT OF Event]; MidCorner: PROC [c1, c2: REF Corner] RETURNS [Triple]; InterpCorners: PROC [t: REAL, c1, c2: REF Corner] RETURNS [Triple]; BoundaryIntersectTet: PROC [ tet: REF Tetrahedron, segments: REF Segments, insideToo: BOOL ¬ TRUE, scratch: REF TetIntersections ¬ NIL] RETURNS [REF TetIntersections]; GetEvents: PROC [ tet: REF Tetrahedron, segments: REF Segments, epsilon: REAL, insideToo: BOOL, scratch: REF Events ¬ NIL] RETURNS [REF Events]; TetCenter: PROC [tet: REF Tetrahedron] RETURNS [Triple]; ObtainTetIntersections: PROC RETURNS [REF TetIntersections]; ReleaseTetIntersections: PROC [scratch: REF TetIntersections]; IntersectWithSurface: PROC [tet: REF Tetrahedron, action: TetIntersectProc]; FaceName: PROC [f: TetFace] RETURNS [ROPE]; EdgeName: PROC [e: TetEdge] RETURNS [ROPE]; CornerName: PROC [c: REF Corner, tet: REF Tetrahedron] RETURNS [ROPE]; EventName: PROC [e: Event] RETURNS [ROPE]; MakeTetrahedron: PROC [a, b, c, d: REF Corner, which: INT, scratch: REF Tetrahedron ¬ NIL] RETURNS [REF Tetrahedron]; TriangleInTetrahedron: PROC [t: REF Triangle, tet: REF Tetrahedron] RETURNS [BOOL]; TrianglesInTetrahedron: PROC [ candidates: REF Triangles, tet: REF Tetrahedron, scratch: REF Triangles ¬ NIL] RETURNS [REF Triangles]; InsideTetrahedron: PROC [t: REF Tetrahedron, p: Triple] RETURNS [BOOL]; EdgesFromFace: PROC [f: TetFace] RETURNS [ThreeEdges]; CornersFromFace: PROC [f: TetFace, t: REF Tetrahedron] RETURNS [ThreeCorners]; CornersFromEdge: PROC [e: TetEdge, t: REF Tetrahedron] RETURNS [TwoCorners]; MidEdge: PROC [tet: REF Tetrahedron, e: TetEdge] RETURNS [Triple]; LRFaces: PROC [e: TetEdge] RETURNS [l, r: TetFace]; LFace: PROC [e: TetEdge] RETURNS [f: TetFace]; RFace: PROC [e: TetEdge] RETURNS [f: TetFace]; Decompose: PROC [c: REF Cube, action: TetProc, scratch: REF Tetrahedron ¬ NIL]; GetTetN: PROC [c: REF Cube, which: INT, scratch: REF Tetrahedron ¬ NIL] RETURNS [REF Tetrahedron]; IDFromPoint: PROC [p: Triple, size: REAL, offset: Triple ¬ []] RETURNS [IntTriple]; PointFromID: PROC [id: IntTriple, size: REAL] RETURNS [p: Triple]; SetCube: PROC [ id: IntTriple, lbn, lbf, ltn, ltf, rbn, rbf, rtn, rtf: REF Corner, offset: Triple ¬ [], scratch: REF Cube ¬ NIL] RETURNS [REF Cube]; MakeCube: PROC [id: IntTriple, size: REAL, offset: Triple ¬ [], scratch: REF Cube ¬ NIL] RETURNS [REF Cube]; TriangleInCube: PROC [t: REF Triangle, c: REF Cube] RETURNS [BOOL]; TrianglesInCube: PROC [ candidates: REF Triangles, cube: REF Cube, scratch: REF Triangles ¬ NIL] RETURNS [REF Triangles]; END. œ ImplicitCubeTet.mesa Copyright c 1992 by Xerox Corporation. All rights reserved. Bloomenthal, February 27, 1993 12:16 pm PST Types Corners Return the midpoint between the two corners. Return interpolated point between the corners (t=0 => a, t=1 => b). Tetrahedra Return intersections of segments with tet and intervening (internal to tet) points, in order. Return the events that occur when segments is intersected with tet. Return the center of the tetrahedron. Obtain a sequence from a scratch pool. Return the scratch sequence to the scratch ool. Call action according to the polarities of tet. Return the name of the face. Return the name of the edge. Return the name of the corner. Return the name of the event type. Construct a tetrahedron from the four points; which should be IN [0..5). Check if triangle penetrates the tetrahedron; t presumed to intersect cube containing tet. Return those candidate triangles that intersect the tetrahedron. Test if the point is inside the tetrahedron. Return the three edges constituting the given face. Return the three corners constituting the given face of the tetrahedron. Return the two corners constituting the given edge of the tetrahedron. Return the point midway along the given edge of the given tetrahedron. Return the left and right face of the given directed edge. Return the left face of the given directed edge. Return the right face of the given directed edge. Cubes Decompose the cube into five tetrahedra, calling proc for each. Return the specified tetrahedron of the decomposed cube; which should be IN [0..5). Return the cube center ID given the cube center and size. Return the lattice point given its integer coordinates and grid size. Return a cube given its id and eight corners. Create a cube given its id and size; reuse scratch if non-NIL. Check if the given triangle penetrates the cube. Return those candidate triangles that intersect the cube. ΚΩ•NewlineDelimiter ™™Jšœ Οmœ1™J™/J™—š €œžœ‘žœ ‘œ‘œ˜LJ™/J™—š€œžœžœžœ˜+J™J˜—š€œžœžœžœ˜+J™J–0.0 1.0 1.0 textColor˜—š € œžœžœžœžœžœ˜FJ™J–0.0 1.0 1.0 textColor˜—š€ œžœ žœžœ˜*J™"J™—š €œžœžœžœ žœžœ˜ZJšžœžœ˜Jšœ>‘œ™HJ™—š €œžœžœžœžœžœ˜SJ™[J™—š€œžœ˜Jšœ žœ ˜Jšœžœ ˜Jšœ žœ žœ˜Jšžœžœ ˜J™@J˜—š €œžœžœžœžœ˜GJ™,J™—š€ œžœžœ˜6J™3J™—š€œžœžœžœ˜NJ™HJ™—š€œžœžœžœ˜LJ™FJ™—š€œžœžœžœ ˜BJ™FJ˜—š€œžœžœ˜3J™:J™—š€œžœžœ˜.J™0J™—š€œžœžœ˜.J™1——–0.6666667 1.0 1.0 textColorš ™š € œžœžœ!žœžœ˜OJ™?J™—š €œžœžœžœ žœžœ˜GJšžœžœ˜JšœI‘œ™SJ˜—š€ œžœžœžœ ˜SJ™9J˜—š€ œžœžœžœ ˜BJ™EJ™—š€œžœ˜J˜Jšœ(žœ˜3J˜Jšœ žœžœ˜Jšžœžœ˜J™-J˜—š €œžœžœ žœžœ˜XJšžœžœ˜Jšœ:‘œ™>J™—š €œžœžœžœžœžœ˜CJ™0J˜—š€œžœ˜Jšœ žœ ˜Jšœžœ˜Jšœ žœ žœ˜Jšžœžœ ˜J™9——J™Jšžœ˜J˜—…—0!₯