program zadacha197; {Гершенович Игорь} Uses Crt, Graph, Gersh; const n1 = 1; {показатель преломления воздуха} n2 = 1.33; {показатель преломления воды} X0 : Integer = 100; {начальная координата X} Y0 : Integer = 100; {начальная координата Y} a : Real = 30; {начальный угол} pause : Integer = 400; var x, y, yb : Integer; x1, y1, dx, dy : Real; procedure Env; var i, x, y : Integer; begin SetColor (15); Rectangle (0,0,GetMaxX,GetMaxY); SetColor (11); Line (0, yb, GetMaxX, yb); Randomize; for i:=1 to 100 do PutPixel (Random(GetMaxX),Random(yb),7); SetColor (3); for i:=1 to 50 do begin x:=Random(GetMaxX); y:=Random(yb)+yb; Line (x,y,x+5,y); end; end; {Env} procedure Border; var dl, dl2, s1, s2: Real; begin dl2:=dx*dx+dy*dy; dl:=Sqrt(dl2); s1:=dx/dl; if dy>0 then s2:=s1*n1/n2 else s2:=s1*n2/n1; if Abs(s2)>=1.0 then dy:=-dy else begin dx:=dl*s2; dy:=Sqrt(dl2-dx*dx)*dy/Abs(dy) end; end; {Border} procedure adge; begin if (x=GetMaxX) or (x=0) then dx:=-dx; if (y=GetMaxY) or (y=0) then dy:=-dy; end; {adge} procedure control; var ch : char; begin repeat Ch:= Readkey until Ch<>#0; case Ord (Ch) of 43 : if pause>1 then dec(pause,100); 45 : inc(pause,100); 27 : halt; end; end; {control} BEGIN GraphBegin(''); yb:=GetMaxY div 2; Env; x1:=X0; y1:=Y0; a:=a*Pi/180; dx:=cos(a); dy:=sin(a); repeat PutPixel (x,y,14); Delay (pause); PutPixel (x,y,15); x1:=x1+dx; y1:=y1+dy; x:=Round(x1); y:=Round(y1); MoveTo (x,y); if (y>=yb) and (y0yb) then Border; if GetPixel(x,y)=15 then adge; if KeyPressed then control; Y0:=y; until ReadKey=#27; END.