' Material simulation, simulates shockwaves propagation in gas. ' made by Svjatoslav Agejenko ' in 2003 ' homepage: svjatoslav.eu ' email: svjatoslav@svjatoslav.eu DECLARE SUB saveit () DECLARE SUB playit () DECLARE SUB frmget () DECLARE SUB frmsav () DECLARE SUB spot (x!, y!, p!) DECLARE SUB lin (x1!, y1!, x2!, y2!) DECLARE SUB disp () DECLARE SUB start () DIM SHARED wal wal = 9980 DIM SHARED press(1 TO 100, 1 TO 100) DIM SHARED spdx(1 TO 100, 1 TO 100) DIM SHARED spdy(1 TO 100, 1 TO 100) DIM SHARED spdxp(1 TO 100, 1 TO 100) DIM SHARED spdyp(1 TO 100, 1 TO 100) DIM SHARED nam$, frm DIM SHARED linb AS STRING * 100 frm = 0 SCREEN 13 PAINT (1, 1), 1 OPEN "tst.an0" FOR BINARY AS #1 start 1 'disp FOR y = 2 TO 99 FOR x = 2 TO 99 IF press(x, y) = wal THEN spdx(x - 1, y) = 0: spdy(x, y - 1) = 0: spdx(x, y) = 0: spdy(x, y) = 0: GOTO 3 spdy(x, y) = spdy(x, y) - (press(x, y) / 500) ' gravitation IF press(x + 1, y) = wal THEN spdx(x, y) = 0: GOTO 2 spdx(x, y) = (press(x + 1, y) - press(x, y)) / 20 + spdx(x, y) 2 IF press(x, y + 1) = wal THEN spdy(x, y) = 0: GOTO 3 spdy(x, y) = (press(x, y + 1) - press(x, y)) / 20 + spdy(x, y) 3 NEXT x NEXT y 4 b = 0 FOR y = 2 TO 99 FOR x = 2 TO 99 a = press(x, y) + spdx(x, y) + spdy(x, y) - spdx(x - 1, y) - spdy(x, y - 1) IF a = 0 OR ((a < 0) AND (a > -.0001)) THEN IF spdx(x, y) < 0 THEN spdx(x, y) = 0 IF spdy(x, y) < 0 THEN spdy(x, y) = 0 IF spdx(x - 1, y) > 0 THEN spdx(x - 1, y) = 0 IF spdy(x, y - 1) > 0 THEN spdy(x, y - 1) = 0 END IF IF a < 0 THEN IF spdx(x, y) < 0 THEN spdx(x, y) = spdx(x, y) / 1.5 IF spdy(x, y) < 0 THEN spdy(x, y) = spdy(x, y) / 1.5 IF spdx(x - 1, y) > 0 THEN spdx(x - 1, y) = spdx(x - 1, y) / 1.5 IF spdy(x, y - 1) > 0 THEN spdy(x, y - 1) = spdy(x, y - 1) / 1.5 b = 1 LOCATE 20, 1 PRINT a END IF NEXT x NEXT y IF b = 1 THEN GOTO 4 FOR y = 2 TO 99 FOR x = 2 TO 99 IF spdx(x, y) > 0 THEN spdxp(x - 1, y) = ((press(x, y) * spdx(x - 1, y)) + (spdx(x, y) * spdx(x, y))) / (press(x, y) + spdx(x, y)) - spdx(x - 1, y) IF spdy(x, y) > 0 THEN spdyp(x, y - 1) = ((press(x, y) * spdy(x, y - 1)) + (spdy(x, y) * spdy(x, y))) / (press(x, y) + spdy(x, y)) - spdy(x, y - 1) IF spdx(x - 1, y) < 0 THEN spdxp(x, y) = ((press(x, y) * spdx(x, y)) - (spdx(x - 1, y) * spdx(x - 1, y))) / (press(x, y) - spdx(x - 1, y)) - spdx(x, y) IF spdy(x, y - 1) < 0 THEN spdyp(x, y) = ((press(x, y) * spdy(x, y)) - (spdy(x, y - 1) * spdy(x, y - 1))) / (press(x, y) - spdy(x, y - 1)) - spdy(x, y) NEXT x NEXT y FOR y = 2 TO 99 FOR x = 2 TO 99 press(x + 1, y) = press(x + 1, y) - spdx(x, y) press(x, y + 1) = press(x, y + 1) - spdy(x, y) press(x, y) = press(x, y) + spdx(x, y) press(x, y) = press(x, y) + spdy(x, y) NEXT x NEXT y FOR y = 2 TO 99 FOR x = 2 TO 99 spdx(x, y) = spdx(x, y) + spdxp(x, y) spdxp(x, y) = 0 spdy(x, y) = spdy(x, y) + spdyp(x, y) spdyp(x, y) = 0 NEXT x NEXT y FOR y = 1 TO 100 FOR x = 1 TO 100 PSET (x, y), press(x, y) + 16 NEXT x NEXT y saveit GOTO 1 CLOSE #1 SUB disp FOR y = 47 TO 53 FOR x = 47 TO 53 LOCATE y - 46, (x - 46) * 4 PRINT press(x, y) NEXT x NEXT y a$ = INPUT$(1) END SUB SUB lin (x1, y1, x2, y2) m = ABS(x1 - x2) m1 = ABS(y1 - y2) IF m1 > m THEN m = m1 x3 = x2 - x1 y3 = y2 - y1 FOR a = 0 TO m x5 = x3 * a / m + x1 y5 = y3 * a / m + y1 press(x5, y5) = wal NEXT a END SUB SUB saveit FOR y = 1 TO 100 a$ = "" FOR x = 1 TO 100 a$ = a$ + CHR$(POINT(x, y)) NEXT x linb = a$ PUT #1, , linb NEXT y END SUB SUB spot (x, y, p) press(x, y) = p press(x + 1, y) = p press(x, y + 1) = p press(x + 1, y + 1) = p END SUB SUB start frm = 0 FOR a = 1 TO 100 FOR b = 1 TO 100 press(a, b) = 3 spdx(a, b) = 0 spdy(a, b) = 0 spdxp(a, b) = 0 spdyp(a, b) = 0 NEXT b NEXT a FOR y = 30 TO 60 FOR x = 10 TO 50 spot x, y, 30 NEXT x NEXT y lin 2, 2, 2, 99 lin 99, 2, 99, 99 lin 2, 99, 99, 99 lin 2, 2, 99, 2 FOR x = 5 TO 40 STEP 5 lin x, 80, x + 50, 80 - x NEXT x END SUB