program reflective_walls_skip_d_inner_sub4
      real*8 x,y
      real x_inner(5),y_inner(5)
      real bar_x(5),bar_y(5)
      real bar_xold(5),bar_yold(5)

      write(*,*)'Vx?'
      read(*,*)vx
      write(*,*)'Vy?'
      read(*,*)vy

      i_dummy=pgopen('/xwin')
      xmin=-10
      xmax=10
      ymin=-10
      ymax=10
      r=0.2
      wdth=(1+0.1)*r
      call pgenv(xmin-wdth,xmax+wdth,ymin-wdth,ymax+wdth,1,-1)
      call pgsfs(2)

      xc=(x_min+x_max)/2;thickness=2.0
      yc=(y_min+y_max)/2;hight=4.0
      x_inner_min=xc-0.5*thickness;x_inner_max=xc+0.5*thickness
      y_inner_min=yc-0.5*hight;y_inner_max=yc+0.5*hight 

      x_inner(1)=x_inner_min+wdth;y_inner(1)=y_inner_max-wdth
      x_inner(2)=x_inner_max-wdth;y_inner(2)=y_inner_max-wdth
      x_inner(3)=x_inner_max-wdth;y_inner(3)=y_inner_min+wdth
      x_inner(4)=x_inner_min+wdth;y_inner(4)=y_inner_min+wdth
      x_inner(5)=x_inner(1);y_inner(5)=y_inner(1)

      x=1
      y=1
      xold=real(x)
      yold=real(y)
      dt=0.00001

      n_sig_read = 10

      n_draw = 100

      do i=1,1000000000

        if(x>xmax) vx=(-1)*vx
        if(x<xmin) vx=(-1)*vx
        if(y>ymax) vy=(-1)*vy
        if(y<ymin) vy=(-1)*vy
 
        if( mod(i,n_sig_read)==0 )then
          open(unit=10,file='signal.txt',status='old')
            read(10,*)sig
          close(10)
          xl=x_inner_min;xr=x_inner_max
          call draw_bouncer_bar(sig,xl,xr,wdth,bar_x,bar_y,bar_xold,
     &         bar_yold,y_inner_min,y_inner_max)
        end if


        call check_bounce(sig,x,y,vx,vy,x_inner_min,x_inner_max,
     &y_inner_min,y_inner_max)

        x=x+vx*dt
        y=y+vy*dt

        if(mod(i,n_draw)==0)then
          call pgbbuf
          call pgsci(0)
          call pgcirc(xold,yold,r)
          call pgsci(1)
          call pgcirc(real(x),real(y),r)
          call pgebuf
          xold=real(x)
          yold=real(y)
        end if

      end do
      call pgclos
      end


      subroutine check_bounce(sig,x,y,vx,vy,x_inner_min,x_inner_max,
     &y_inner_min,y_inner_max)
      real*8 x,y
      y_top=2*sig-10+y_inner_max;y_bot=2*sig-10+y_inner_min
      if( (y>y_bot) .and. (y<y_top) ) then
        if( (x>x_inner_min) .and. (x<x_inner_min+0.1) ) then
          vx=(-1)*vx
          goto 200
        endif
        if( (x<x_inner_max) .and. (x>x_inner_man-0.1) ) then
          vx=(-1)*vx
          goto 200
        endif
      end if
      if( (x>x_inner_min) .and. (x<x_inner_max) ) then
        if( (y>y_bot) .and. (y<y_bot+0.1) ) then
          vy=(-1)*vy
          goto 200
        endif
        if( (y<y_top) .and. (y>y_top-0.1) ) then
          vy=(-1)*vy
          goto 200
        endif
      end if
 200  continue
      end


      subroutine draw_bouncer_bar(sig,xl,xr,wdth,bar_x,bar_y,
     &bar_xold,bar_yold,y_inner_min,y_inner_max)
      real bar_x(5),bar_y(5)
      real bar_xold(5),bar_yold(5)
      y_top=2*sig-10+y_inner_max;y_bot=2*sig-10+y_inner_min
      bar_x(1)=xl+wdth;bar_y(1)=y_top-wdth
      bar_x(2)=xr-wdth;bar_y(2)=y_top-wdth
      bar_x(3)=xr-wdth;bar_y(3)=y_bot+wdth
      bar_x(4)=xl+wdth;bar_y(4)=y_bot+wdth
      bar_x(5)=bar_x(1);bar_y(5)=bar_y(1)

      call pgbbuf
      call pgsci(0)
      call pgline(5,bar_xold,bar_yold)
      call pgsci(1)
      call pgline(5,bar_x,bar_y)
      call pgebuf

      do i=1,5
        bar_xold(i)=bar_x(i);bar_yold(i)=bar_y(i)
      end do
      end