MVLib - Short Writeup - Version 4.0
Example Number 43 - Bob Nerini
The fortran code is available here and the complete script running the code is available here.
Previous Example List of Examples Next Example
MVLib Home Page
	implicit none 	
	real d,a0,b0,xs,ys,alpha,beta,betas,cvdeg2rad,lplane
	real ay,by,x1,y1,x2,y2,a1,b1,a2,b2,cvrad2deg
	integer i ; character stitle*64
	logical zoom ; data zoom /.false./
	call mvsetflags('Palette di colori',7.0)
	call mvsetflags('Logo',2.0)
	d=700.					! Distanza sorgente 
	alpha=60 ; alpha=cvdeg2rad(alpha)	! Angolo sorgente al centro
	xs=d*cos(alpha) ; ys=d*sin(alpha)	! Coordinate sorgente
	a0=0 ; b0=tan(alpha)			! Parametri linea centrale
	beta= 2   ; 				! Angolo piano riflessione
	lplane=45.0				! Larghezza del piano
	if (zoom) then
	   call plottaframe(-20.0,20.0,-5.0,35.0)
	   write(stitle,'(a,i2,a)')'Zoom view - Plane angle =',nint(beta),' deg'
	else
	   call plottaframe(-100.0,650.0,-50.0,700.0)
	   write(stitle,'(a,i2,a)') 'Plane angle=',nint(beta),' deg'
	endif
	beta=cvdeg2rad(beta) 
	call gslwsc(2.0)
	call gsplci(6)
	call linea(0.0,0.0,xs,ys)
	call gsplci(7)
	do i=-45,45,10
	   call linearparam(float(i),0.0,xs,ys,a1,b1)
	   x1=float(i) ; x2=xs ; call linea(x1,a1+b1*x1,x2,a1+b1*x2)
	enddo
	call linearparam( 5.0,0.0,xs,ys,a2,b2)
	call gsplci(9) ; call gslwsc(5.0)
	ay=0 ; by=tan(beta)
	x1=-lplane ; x2=lplane ; call linea(x1,ay+by*x1,x2,ay+by*x2)
	call displayexample('example43','Bob Nerini Light path',stitle)
	call intersection(a2,b2,ay,by,x1,y1)
	call angleestimation(a2,b2,x1,betas)
	write(6,'(10x,a,f10.7)') '     True angle: ',cvrad2deg(beta)
	write(6,'(10x,a,f10.7)') 'Estimated angle: ',cvrad2deg(betas)
	end

	subroutine angleestimation(a,b,x,beta)	
	implicit none
	real a,b,x,beta,y
	y=a+b*x
	beta=atan(y/x) 
	return
	end

	subroutine intersection(a1,b1,a2,b2,x,y)
	implicit none
	real a1,b1,a2,b2,x,y
	x=-(a1-a2)/(b1-b2)
	y=a1+b1*x
	return
	end

	subroutine linearparam(x1,y1,x2,y2,a,b)
	implicit none
	real x1,y1,x2,y2,a,b
	b=(y1-y2)/(x1-x2)
	a=y1-b*x1
	return
	end

	real function cvrad2deg(alpha)
	cvrad2deg=45.*alpha/atan(1.)
	return
	end

	real function cvdeg2rad(alpha)
	cvdeg2rad=4.*atan(1.)*alpha/180.
	return
	end