Tourner% = FALSE Deform% = FALSE Mode% = 0 OPENW #1,0,0,100,100,0 TITLEW #1,"Grille molle GRIMOU" FULLW #1 b% = 100 Nx% = 10 Ny% = 10 SNx% = SUCC(Nx%) SNy% = SUCC(Ny%) DIM px(SNx%,SNy%) DIM py(SNx%,SNy%) DIM vx(SNx%,SNy%) DIM vy(SNx%,SNy%) DIM lx1%(SNx%,SNy%,1) DIM ly1%(SNx%,SNy%,1) DIM lx2%(SNx%,SNy%,1) DIM ly2%(SNx%,SNy%,1) scrx% = _X scry% = _Y scrx2% = scrx% / 2 scry2% = scry% / 2 s1 = (scrx% - (b% * 2)) / (Nx% + 2) s2 = (scry% - (b% * 2)) / (Ny% + 2) IF s1 < s2 s = s1 ELSE s = s2 ENDIF ox = scrx2% - SNx% * s / 2 oy = scry2% - SNy% * s / 2 FOR y% = 0 TO SNy% FOR x% = 0 TO SNx% px(x%,y%) = ox + x% * s py(x%,y%) = oy + y% * s NEXT x% NEXT y% CLS 0 'px(Nx% / 2,Ny% / 2) = 5 'py(Nx% / 2,Ny% / 2) = 5 cx% = 2,cy% = 2 DO ' CLS f$ = INKEY$ f$ = UCASE$(f$) IF f$ = "D" Deform% = NOT(Deform%) ELSE IF f$ = "T" Tourner% = NOT(Tourner%) vrot = -0.01 pvrot = 0 ELSE IF f$ = "M" CLS 0 Mode% = 1 - Mode% ENDIF PEEKEVENT IF MENU(1) = 4 CLOSEW #1 EDIT SYSTEM ENDIF MOUSE mx%,my%,mk% INC cx% IF cx% = SNx% cx% = 1 INC cy% IF cy% = SNy% cy% = 1 IF mk% = 1 IF sxsyon% = FALSE sxsyon% = TRUE sx% = 0,sy% = 0 hmin = (px(sx%,sy%) - mx%) ^ 2 + (py(sx%,sy%) - my%) ^ 2 FOR y% = 0 TO SNy% FOR x% = 0 TO SNx% h = (px(x%,y%) - mx%) ^ 2 + (py(x%,y%) - my%) ^ 2 IF h <= hmin sx% = x%,sy% = y%,hmin = h ENDIF NEXT x% NEXT y% ENDIF vx(sx%,sy%) = 0'vx(sx%,sy%) / 2 vy(sx%,sy%) = 0'vy(sx%,sy%) / 2 px(sx%,sy%) = mx% py(sx%,sy%) = my% ELSE sxsyon% = FALSE ENDIF ENDIF ENDIF ti% = MOD(SUCC(ti%),Nx% + Ny% + 3) IF Deform% = TRUE IF TIMER - vda > 1000 dada = (RND - 0.5) * 2 * PI da = da + (dada - da) / 100 vda = TIMER ENDIF da = da + 0.0001 IF ti% <= Nx% x% = ti% px(x%,0) = px(x%,0) + SIN(da + ti%) / 10 py(x%,0) = py(x%,0) + COS(da + ti%) / 10 px(x%,SNy%) = px(x%,SNy%) + SIN(da + ti%) / 10 py(x%,SNy%) = py(x%,SNy%) + COS(da + ti%) / 10 ELSE y% = PRED(ti% - Nx%) IF y% <= Ny% AND y% >= 1 px(0,y%) = px(0,y%) + SIN(da + ti%) / 10 py(0,y%) = py(0,y%) + COS(da + ti%) / 10 ENDIF px(SNx%,y%) = px(SNx%,y%) + SIN(da + ti%) / 10 py(SNx%,y%) = py(SNx%,y%) + COS(da + ti%) / 10 ENDIF ENDIF IF Tourner% = TRUE IF ti% = 0 pvrot = pvrot + 0.00002 pvrot2 = pvrot2 + pvrot vrot = SIN(pvrot2) / 100 ENDIF IF ti% <= Nx% x% = ti% a = vrot + @angle(scrx2%,scry2%,px(x%,0),py(x%,0)) px(x%,0) = scrx2% + SIN(a) * h py(x%,0) = scry2% + COS(a) * h a = vrot + @angle(scrx2%,scry2%,px(x%,SNy%),py(x%,SNy%)) px(x%,SNy%) = scrx2% + SIN(a) * h py(x%,SNy%) = scry2% + COS(a) * h ELSE y% = PRED(ti% - Nx%) IF y% <= Ny% AND y% >= 1 a = vrot + @angle(scrx2%,scry2%,px(0,y%),py(0,y%)) px(0,y%) = scrx2% + SIN(a) * h py(0,y%) = scry2% + COS(a) * h ENDIF a = vrot + @angle(scrx2%,scry2%,px(SNx%,y%),py(SNx%,y%)) px(SNx%,y%) = scrx2% + SIN(a) * h py(SNx%,y%) = scry2% + COS(a) * h ENDIF ENDIF Calc cx%,cy% ' PAUSE 1 IF mk% = 2 r = scry% / 2.5 FOR x% = 0 TO SNx% lx = px(x%,0) - scrx2% ly = py(x%,0) - scry2% h = SQR(lx ^ 2 + ly ^ 2) lx = lx / h,ly = ly / h px(x%,0) = scrx2% - lx * r py(x%,0) = scry2% - ly * r lx = px(x%,SNy%) - scrx2% ly = py(x%,SNy%) - scry2% h = SQR(lx ^ 2 + ly ^ 2) lx = lx / h,ly = ly / h px(x%,SNy%) = scrx2% - lx * r py(x%,SNy%) = scry2% - ly * r NEXT x% FOR y% = 1 TO Ny% lx = px(0,y%) - scrx2% ly = py(0,y%) - scry2% h = SQR(lx ^ 2 + ly ^ 2) lx = lx / h,ly = ly / h px(0,y%) = scrx2% - lx * r py(0,y%) = scry2% - ly * r lx = px(SNx%,y%) - scrx2% ly = py(SNx%,y%) - scry2% h = SQR(lx ^ 2 + ly ^ 2) lx = lx / h,ly = ly / h px(SNx%,y%) = scrx2% - lx * r py(SNx%,y%) = scry2% - ly * r NEXT y% DO MOUSE mx%,my%,mk% EXIT IF mk% = 0 LOOP ENDIF ' k% = MOD(SUCC(k%),3) ' IF k% = 0 Afl ' ENDIF LOOP CLOSEW #1 PROCEDURE Calc(x%,y%) xx = (px(PRED(x%),y%) + px(SUCC(x%),y%) + px(x%,PRED(y%)) + px(x%,SUCC(y%))) / 4 yy = (py(PRED(x%),y%) + py(SUCC(x%),y%) + py(x%,PRED(y%)) + py(x%,SUCC(y%))) / 4 vx(x%,y%) = vx(x%,y%) + ((xx - px(x%,y%)) - vx(x%,y%)) / 125 vy(x%,y%) = vy(x%,y%) + ((yy - py(x%,y%)) - vy(x%,y%)) / 125 px(x%,y%) = px(x%,y%) + vx(x%,y%) '(xx - px(x%,y%)) / 5 py(x%,y%) = py(x%,y%) + vy(x%,y%) '(yy - py(x%,y%)) / 5 RETURN PROCEDURE afnod(x%,y%) IF x% > 0 THEN LINE px(x%,y%),py(x%,y%),px(x% - 1,y%),py(x% - 1,y%) IF x% <= Nx% THEN LINE px(x%,y%),py(x%,y%),px(x% + 1,y%),py(x% + 1,y%) IF y% > 0 THEN LINE px(x%,y%),py(x%,y%),px(x%,y% - 1),py(x%,y% - 1) IF y% <= Ny% THEN LINE px(x%,y%),py(x%,y%),px(x%,y% + 1),py(x%,y% + 1) ' PLOT px(x%,y%),py(x%,y%) RETURN PROCEDURE aff LOCAL x%,y% FOR y% = 1 TO PRED(Ny%) FOR x% = 1 TO PRED(Nx%) LINE px(x%,y%),py(x%,y%),px(SUCC(x%),y%),py(SUCC(x%),y%) LINE px(x%,y%),py(x%,y%),px(x%,SUCC(y%)),py(x%,SUCC(y%)) NEXT x% LINE px(Nx%,y%),py(Nx%,y%),px(Nx%,SUCC(y%)),py(Nx%,SUCC(y%)) NEXT y% FOR x% = 1 TO PRED(Nx%) LINE px(x%,Ny%),py(x%,Ny%),px(SUCC(x%),Ny%),py(SUCC(x%),Ny%) NEXT x% RETURN FUNCTION angle(x1,y1,x2,y2) LOCAL lx,ly,v,a,xx,yy lx = x2 - x1 ly = y2 - y1 h = SQR(lx ^ 2 + ly ^ 2) IF h > 0 lx = lx / h ENDIF IF y2 > y1 a = ASIN(lx) ELSE a = PI - ASIN(lx) ENDIF RETURN a ENDFUNC PROCEDURE Afl LOCAL x%,y% x% = Aflx%,y% = afly% IF Mode% = 0 IF x% <= Nx% RGBCOLOR 0 LINE lx1%(x%,y%,0),ly1%(x%,y%,0),lx2%(x%,y%,0),ly2%(x%,y%,0) lx1%(x%,y%,0) = px(x%,y%) ly1%(x%,y%,0) = py(x%,y%) lx2%(x%,y%,0) = px(SUCC(x%),y%) ly2%(x%,y%,0) = py(SUCC(x%),y%) IF y% = 0 OR y% = SNy% RGBCOLOR 9795110 ELSE RGBCOLOR 16777215 ENDIF LINE lx1%(x%,y%,0),ly1%(x%,y%,0),lx2%(x%,y%,0),ly2%(x%,y%,0) ENDIF IF y% <= Ny% RGBCOLOR 0 LINE lx1%(x%,y%,1),ly1%(x%,y%,1),lx2%(x%,y%,1),ly2%(x%,y%,1) lx1%(x%,y%,1) = px(x%,y%) ly1%(x%,y%,1) = py(x%,y%) lx2%(x%,y%,1) = px(x%,SUCC(y%)) ly2%(x%,y%,1) = py(x%,SUCC(y%)) IF x% = 0 OR x% = SNx% RGBCOLOR 9795110 ELSE RGBCOLOR 16777215 ENDIF LINE lx1%(x%,y%,1),ly1%(x%,y%,1),lx2%(x%,y%,1),ly2%(x%,y%,1) ENDIF ELSE RGBCOLOR 0 PLOT lx1%(x%,y%,0),ly1%(x%,y%,0) lx1%(x%,y%,0) = px(x%,y%) ly1%(x%,y%,0) = py(x%,y%) RGBCOLOR RGB(127 + SIN(vx(x%,y%)) * 127,127 + COS(vy(x%,y%)) * 127,ABS(vx(x%,y%) + vy(x%,y%)) * 10) PLOT lx1%(x%,y%,0),ly1%(x%,y%,0) ENDIF INC Aflx% IF Aflx% > SNx% CLR Aflx% INC afly% IF afly% > SNy% CLR afly% ENDIF ENDIF RETURN