DIRECTORY Sequences, CoveringSets, Triangles; TrianglesImpl: CEDAR PROGRAM IMPORTS EXPORTS Triangles = BEGIN OPEN SEQ: Sequences, CS: CoveringSets, Triangles; CountTriangles: PUBLIC PROC [in: CS.CoveringSet] RETURNS [number: CARDINAL] ~ { K, i, j: NAT; M, I, J: CARDINAL _ 0; inData: CS.CoveringSetData; pointsData, columnDataThis, columnDataNext: SEQ.SequenceData; IF in = NIL THEN RETURN[0]; inData _ NARROW[in.data]; IF inData = NIL THEN RETURN[0]; pointsData _ NARROW[inData.dataPoints.data]; IF pointsData.lengthPlus1-1 = 1 THEN RETURN[0]; number _ 0; K _ 0; WHILE K < pointsData.lengthPlus1-1 DO K _ K + 1; IF K = pointsData.lengthPlus1-1 THEN EXIT; columnDataThis _ NARROW[pointsData[K].data]; columnDataNext _ NARROW[pointsData[K+1].data]; I _ columnDataThis.lengthPlus1-1; J _ columnDataNext.lengthPlus1-1; IF I < 2 AND J < 2 THEN { M _ M + I; LOOP; }; IF I = 0 OR J = 0 THEN { M _ M + I; LOOP; }; i _ 1; j _ 1; WHILE i < I AND j < J DO number _ number + 2; i _ i+1; j _ j+1; ENDLOOP; WHILE i < I DO number _ number + 1; i _ i+1; ENDLOOP; WHILE j < J DO number _ number + 1; j _ j+1; ENDLOOP; M _ M + I; ENDLOOP; }; GenerateTriangles: PUBLIC PROC [in: CS.CoveringSet] RETURNS [out: TriangleSeq] ~ { K, i, j: NAT; M, I, J: CARDINAL _ 0; inData: CS.CoveringSetData; pointsData, columnDataThis, columnDataNext: SEQ.SequenceData; numTriangles: CARDINAL _ CountTriangles[in]; number: CARDINAL _ 0; IF numTriangles = 0 THEN RETURN[NIL]; inData _ NARROW[in.data]; out _ NEW[TriangleSeqRec[numTriangles]]; pointsData _ NARROW[inData.dataPoints.data]; K _ 0; WHILE K < pointsData.lengthPlus1-1 DO K _ K + 1; IF K = pointsData.lengthPlus1-1 THEN EXIT; columnDataThis _ NARROW[pointsData[K].data]; columnDataNext _ NARROW[pointsData[K+1].data]; I _ columnDataThis.lengthPlus1-1; J _ columnDataNext.lengthPlus1-1; IF I < 2 AND J < 2 THEN { M _ M + I; LOOP; }; IF I = 0 OR J = 0 THEN { M _ M + I; LOOP; }; i _ 1; j _ 1; WHILE i < I AND j < J DO number _ number + 1; out[number].firstVertex _ M+i; out[number].secondVertex _ M+i+1; out[number].thirdVertex _ M+I+j; i _ i+1; number _ number + 1; out[number].firstVertex _ M+I+j; out[number].secondVertex _ M+i; out[number].thirdVertex _ M+I+j+1; j _ j+1; ENDLOOP; WHILE i < I DO number _ number + 1; out[number].firstVertex _ M+i; out[number].secondVertex _ M+i+1; out[number].thirdVertex _ M+I+j; i _ i+1; ENDLOOP; WHILE j < J DO number _ number + 1; out[number].firstVertex _ M+I+j; out[number].secondVertex _ M+i; out[number].thirdVertex _ M+I+j+1; j _ j+1; ENDLOOP; M _ M + I; ENDLOOP; }; END. pTrianglesImpl.mesa Last Edited by: Arnon, July 19, 1985 2:54:46 pm PDT Covering Sets and Triangulations Κσ˜Jšœ™J™3J™šΟk ˜ J˜ J˜ Jšœ ˜ —J˜head2šΟn œœ˜Jšœ˜Jšœ ˜J˜—Jšœœœ œ˜7head™ codeš žœœœœ œ˜OMšœ œ˜ Mšœžœœ˜Jšœ˜Jšœ,œ˜=Mšœœœœ˜Jšœ œ ˜Jšœ œœœ˜Jšœ œ˜,Mšœœœ˜/Mšœ ˜ M˜šœ˜%M˜ Mšœœœ˜*Jšœœ˜,Jšœœ˜.Jšœ!˜!Jšœ!˜!šœœœ˜Jšœ ˜ Jšœ˜J˜—šœœœ˜Jšœ ˜ Jšœ˜J˜—J˜šœœ˜J˜J˜J˜Jšœ˜—šœ˜J˜J˜Jšœ˜—šœ˜J˜J˜Jšœ˜—J˜ Jšœ˜—J˜J˜—šžœœœœ˜RMšœ œ˜ Mšœžœœ˜Jšœ˜Jšœ,œ˜=Mšœœ˜,Mšœœ˜Mš œœœœœ˜%Jšœ œ ˜Mšœœ˜(Jšœ œ˜,M˜šœ˜%M˜ Mšœœœ˜*Jšœœ˜,Jšœœ˜.Jšœ!˜!Jšœ!˜!šœœœ˜Jšœ ˜ Jšœ˜J˜—šœœœ˜Jšœ ˜ Jšœ˜J˜—J˜šœœ˜J˜J˜J˜!J˜ J˜J˜J˜ J˜J˜"J˜Jšœ˜—šœ˜J˜J˜J˜!J˜ J˜Jšœ˜—šœ˜J˜J˜ J˜J˜"J˜Jšœ˜—J˜ Jšœ˜—J˜M™——J˜J˜Jšœ˜J˜—…— c