REM Surface DECLARE SUB FindWindow () DECLARE SUB FindEyeCoordinates () DECLARE SUB FindScreenCoordinates () DECLARE SUB FindLimits () DECLARE FUNCTION Fun! (x AS SINGLE, y AS SINGLE) CONST x1 = 0, y1 = 0, x2 = 639, y2 = 199 COMMON SHARED xMin AS SINGLE, xMax AS SINGLE, yMin AS SINGLE, yMax AS SINGLE COMMON SHARED x AS SINGLE, y AS SINGLE, dx AS SINGLE, dy AS SINGLE, Ax AS SINGLE, Ay AS SINGLE, Bx AS SINGLE, By AS SINGLE COMMON SHARED dxMin AS SINGLE, dxMax AS SINGLE, dyMin AS SINGLE, dyMax AS SINGLE COMMON SHARED xOld AS INTEGER, yOld AS INTEGER, xNew AS INTEGER, yNew AS INTEGER COMMON SHARED Rad AS INTEGER, D AS INTEGER COMMON SHARED sinT AS SINGLE, cosT AS SINGLE, sinP AS SINGLE, cosP AS SINGLE CONST Big = 9.999999E+10, Margin = .1 xCount% = 20 yCount% = 20 xMin = -5 xMax = 5 yMin = -5 yMax = 5 Rad = 30 Theta# = -.5 Phi# = .6 D = 10 SCREEN 8: COLOR 2, 7 LINE (0, 0)-(638, 199), , B sinT = SIN(Theta#) cosT = COS(Theta#) sinP = SIN(Phi#) cosP = COS(Phi#) xStep# = (xMax - xMin) / xCount% yStep# = (yMax - yMin) / yCount% dxMin = Big dxMax = -Big dyMin = Big dyMax = -Big FOR Show = 0 TO -1 STEP -1 FOR i% = 0 TO xCount% x = xMin + i% * xStep# y = yMin CALL FindEyeCoordinates IF Show THEN CALL FindScreenCoordinates xOld = xNew yOld = yNew PSET (xOld, yOld) ELSE CALL FindLimits END IF FOR j% = 0 TO yCount% y = yMin + j% * yStep# CALL FindEyeCoordinates IF Show THEN CALL FindScreenCoordinates LINE (xOld, yOld)-(xNew, yNew) xOld = xNew yOld = yNew ELSE CALL FindLimits END IF NEXT j% NEXT i% FOR i% = 0 TO yCount% y = yMin + i% * yStep# x = xMin CALL FindEyeCoordinates IF Show THEN CALL FindScreenCoordinates xOld = xNew yOld = yNew PSET (xOld, yOld) ELSE CALL FindLimits END IF FOR j% = 0 TO xCount% x = xMin + j% * xStep# CALL FindEyeCoordinates IF Show THEN CALL FindScreenCoordinates LINE (xOld, yOld)-(xNew, yNew) xOld = xNew yOld = yNew ELSE CALL FindLimits END IF NEXT j% NEXT i% IF NOT Show THEN CALL FindWindow NEXT Show WHILE INKEY$ = "": WEND SCREEN 0: WIDTH 80, 25 END SUB FindEyeCoordinates z# = Fun(x, y) xx = -x * sinT + y * cosT yy = -x * cosT * cosP - y * sinT * cosP + z# * sinP zz = -x * cosT * sinP - y * sinT * sinP - z# * cosP + Rad dx = D * xx / zz dy = D * yy / zz END SUB SUB FindLimits IF dx > dxMax THEN dxMax = dx IF dx < dxMin THEN dxMin = dx IF dy > dyMax THEN dyMax = dy IF dy < dyMin THEN dyMin = dy END SUB SUB FindScreenCoordinates xNew = FIX(Ax + Bx * dx) yNew = y2 - FIX(Ay + By * dy) END SUB SUB FindWindow xSize = dxMax - dxMin ySize = dyMax - dyMin dxMin = dxMin - Margin * xSize dxMax = dxMax + Margin * xSize dyMin = dyMin - Margin * ySize dyMax = dyMax + Margin * ySize Bx = (x2 - x1) / (dxMax - dxMin) By = (y2 - y1) / (dyMax - dyMin) Ax = x1 - dxMin * Bx Ay = y1 - dyMin * By END SUB FUNCTION Fun (x AS SINGLE, y AS SINGLE) Fun = COS(SQR(x * x + y * y)) END FUNCTION