code 32075; real procedure TRICUB(XI,YI,XJ,YJ,XK,YK,G,RE,AE); value XI,YI,XJ,YJ,XK,YK,RE,AE; real XI,YI,XJ,YJ,XK,YK,RE,AE; real procedure G; begin real SURF,SURFMIN,XZ,YZ,GI,GJ,GK; real procedure INT(AX1,AY1,AF1,AX2,AY2,AF2,AX3,AY3,AF3, BX1,BY1,BF1,BX2,BY2,BF2,BX3,BY3,BF3, PX,PY,PF); value BX1,BY1,BF1,BX2,BY2,BF2,BX3,BY3,BF3,PX,PY,PF; real BX1,BY1,BF1,BX2,BY2,BF2,BX3,BY3,BF3,PX,PY,PF, AX1,AY1,AF1,AX2,AY2,AF2,AX3,AY3,AF3; begin real E,I3,I4,I5,A,B,C,SX1,SY1,SX2,SY2,SX3,SY3, CX1,CY1,CF1,CX2,CY2,CF2,CX3,CY3,CF3, DX1,DY1,DF1,DX2,DY2,DF2,DX3,DY3,DF3; A:= AF1 + AF2 + AF3; B:= BF1 + BF2 + BF3; I3:= 3 * A + 27 * PF + 8 * B; E:= ABS(I3) * RE + AE; if SURF < SURFMIN or ABS(5 * A + 45 * PF - I3) < E then INT:= I3 * SURF else begin CX1:= AX1 + PX; CY1:= AY1 + PY; CF1:= G(CX1,CY1); CX2:= AX2 + PX; CY2:= AY2 + PY; CF2:= G(CX2,CY2); CX3:= AX3 + PX; CY3:= AY3 + PY; CF3:= G(CX3,CY3); C:= CF1 + CF2 + CF3; I4:= A + 9 * PF + 4 * B + 12 * C; if ABS(I3 - I4) < E then INT:= I4 * SURF else begin SX1:= .5 * BX1; SY1:= .5 * BY1; DX1:= AX1 + SX1; DY1:= AY1 + SY1; DF1:= G(DX1,DY1); SX2:= .5 * BX2; SY2:= .5 * BY2; DX2:= AX2 + SX2; DY2:= AY2 + SY2; DF2:= G(DX2,DY2); SX3:= .5 * BX3; SY3:= .5 * BY3; DX3:= AX3 + SX3; DY3:= AY3 + SY3; DF3:= G(DX3,DY3); I5:= (51 * A + 2187 * PF + 276 * B + 972 * C - 768 * (DF1 + DF2 + DF3))/63; if ABS(I4 - I5) < E then INT:= I5 * SURF else begin SURF:= .25 * SURF; INT:= INT(SX1,SY1,BF1,SX2,SY2,BF2,SX3,SY3,BF3, DX1,DY1,DF1,DX2,DY2,DF2,DX3,DY3,DF3, PX,PY,PF) + INT(AX1,AY1,AF1,SX3,SY3,BF3,SX2,SY2,BF2,DX1,DY1,DF1, AX1 + SX2,AY1 + SY2,G(AX1 + SX2,AY1 + SY2), AX1 + SX3,AY1 + SY3,G(AX1 + SX3,AY1 + SY3), .5 * CX1,.5 * CY1,CF1) + INT(AX2,AY2,AF2,SX3,SY3,BF3,SX1,SY1,BF1,DX2,DY2,DF2, AX2 + SX1,AY2 + SY1,G(AX2 + SX1,AY2 + SY1), AX2 + SX3,AY2 + SY3,G(AX2 + SX3,AY2 + SY3), .5 * CX2,.5 * CY2,CF2) + INT(AX3,AY3,AF3,SX1,SY1,BF1,SX2,SY2,BF2,DX3,DY3,DF3, AX3 + SX2,AY3 + SY2,G(AX3 + SX2,AY3 + SY2), AX3 + SX1,AY3 + SY1,G(AX3 + SX1,AY3 + SY1), .5 * CX3,.5 * CY3,CF3); SURF:= 4 * SURF end end end end INT; SURF:= 0.5 * ABS(XJ * YK - XK * YJ + XI * YJ - XJ * YI + XK * YI - XI * YK); SURFMIN:= SURF*RE; RE:= 30*RE; AE:= 30*AE/SURF; XZ:= (XI + XJ + XK)/3; YZ:= (YI + YJ + YK)/3; GI:= G(XI,YI); GJ:= G(XJ,YJ); GK:= G(XK,YK); XI:= XI*.5; YI:= YI*.5; XJ:= XJ*.5; YJ:= YJ*.5; XK:= XK*.5; YK:= YK*.5; TRICUB:= INT(XI,YI,GI,XJ,YJ,GJ,XK,YK,GK, XJ+XK,YJ+YK,G(XJ+XK,YJ+YK), XK+XI,YK+YI,G(XK+XI,YK+YI), XI+XJ,YI+YJ,G(XI+XJ,YI+YJ), .5 * XZ,.5 * YZ,G(XZ,YZ))/60 end TRICUB; eop