program linear_motion_wall_room 1001 write(*,*)'x?' read(*,*)x write(*,*)'y?' read(*,*)y write(*,*)'Vx?' read(*,*)vx write(*,*)'Vy?' read(*,*)vy xold=x yold=y w_left=5.0 w_right=7.5 w_top=7.0 w_bottom=3.0 x_min=0.0 x_max=10.0 y_min=0.0 y_max=10.0 r=0.1 if(pgopen('/xwin')<=0)stop call pgenv(x_min,x_max,y_min,y_max,1,-1) call draw_wall(w_left,w_right,w_top,w_bottom) room=r+0.02 call extra_room(room,1.0,x_min,x_max,y_min,y_max) call extra_room(room,-1.0,w_left,w_right,w_bottom,w_top) dt=0.00001 1003 do i=1,10000000 x = x + vx*dt y = y + vy*dt c call pbc(x,y,x_min,x_max,y_min,y_max) call box(x,y,vx,vy,x_min,x_max,y_min,y_max) call wall(x,y,xold,yold,vx,vy,w_left,w_right &,w_top,w_bottom) call pgbbuf call pgsci(0) call pgcirc(xold,yold,r) call pgsci(1) call pgcirc(x,y,r) call pgebuf xold=x yold=y end do 1002 write(*,*)'Again?(1=yes,0=no,2=continue)' read(*,*)j if(j==0)stop if(j==1)goto 1001 if(j==2)goto 1003 goto 1002 end subroutine box(x,y,vx,vy,x_min,x_max,y_min,y_max) c if(x>x_max)vx=(-1)*vx c if(xx_max))vx=(-1)*vx c if(yy_max)vy=(-1)*vy if((yy_max))vy=(-1)*vy end subroutine pbc(x,y,x_min,x_max,y_min,y_max) if(xx_max) x = x - (x_max-x_min) if(yy_max) y = y - (y_max-y_min) end subroutine wall(x,y,xo,yo,vx,vy,wl,wr,wt,wb) if((ywb))then if((xowl))vx=(-1)*vx if((xo>wr).and.(xwl))then if((yowb))vy=(-1)*vy if((yo>wt).and.(y