
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
function round1,var
  ;; by JP.L & M.B at LAS : 02/11/94
  ;;Arrondit la variable a la valeur la plus proche
;-------------------------------------------------------------------------------
if (var ge (fix(var) + 0.5)) then begin $
  result=fix(var)+1
endif else begin $
  result=fix(var)
endelse
return,result
end
;...............................................................................
Pro PCURSOR,IMA,TAB_NAME
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; NAME:
;       PCURSOR.PRO
; PURPOSE:
;       Plot cursor position on display and
;       put the pixels coordinates selected with the
;       cursor in a table that can be readed.
; CATEGORY:
;       array manipulation
; CALLING SEQUENCE:
;       PCURSOR,IMA,TAB_NAME
; INPUTS: 
;    		IMA	    : IMAGE INPUT
; KEYWORD PARAMETERS:
;                                   None
; OUTPUTS:
;  		TAB_NAME    : table des  coordonnees des points selectionnes		
;	
; COMMON BLOCKS:
;       None.
; SIDE EFFECTS:
;       None
; RESTRICTIONS:
;
; PROCEDURE:
;       Straightforward.
; MODIFICATION HISTORY:
;       Written by JP.L & M.B  v.1.0       : LAS  01/27/94
;-------------------------------------------------------------------------------
;!ERR=1 FOR LBM;=2 FOR MBM;=4 FOR RBM (LEFT,MIDDLE,RIGHT BOTTOM OF MOUSE)
;
TAB0 = MAKE_ARRAY(2,100)
I=-1
J=0
!ERR=0
PRINT ,'!!PLOTTER AVEC UN CLICK SUR RIGHT BUTTON '
PRINT,'!!pour sortir: un click dans le coin inferieur gauche'
WHILE ((!ERR NE 2) AND (I LE 99)) DO BEGIN $
I=I+1
!ERR=1
;PRINT ,!ERR
RDPIX,IMA
;PRINT ,!ERR
CURSOR, X, Y, /DEVICE, /NOWAIT
;CURSOR, X, Y, /DEVICE, /DOWN
;PRINT ,!ERR
IF (X LT 5 ) AND (Y LT 5)  THEN GOTO,STOP 
XYOUTS, X, Y,'L', /DEVICE, /NOCLIP ,CHARSIZE=1.,ALIGNMENT=0.0, COLOR=255
Y=Y-6
XYOUTS, X, Y,'T', /DEVICE, /NOCLIP ,CHARSIZE=1.,ALIGNMENT=0.3, COLOR=255
Y=Y+6
TAB0(0,I)=X
TAB0(1,I)=Y
;PRINT,I,' ', X,'  ',Y
WAIT,1
ENDWHILE

STOP:
NB_POINT=I+1
IF (X LT 5 ) AND (Y LT 5)  THEN NB_POINT=NB_POINT-1

;PRINT, 'TABLE'
;FOR J=0,NB_POINT - 1 DO BEGIN 
;PRINT,J+1,' ', TAB0(0,J),'  ',TAB0(1,J)
;ENDFOR

;
;Mise a disposition d'une table comportant les " nb_point" de coordonnees
TAB_NAME=MAKE_ARRAY(2,NB_POINT)
TAB_NAME(*,0:NB_POINT - 1)=TAB0(*,0:NB_POINT - 1)
return
end
;...............................................................................
Pro circcntr,IMA, TAB_NAME,XMOY,YMOY,R
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; NAME:
;       CIRCCNTR.PRO
; PURPOSE:
;       Estimation du centre d'un arc de cercle,et de son rayon R.
;	passant par les points plottes 
; CATEGORY:
;       array manipulation
; CALLING SEQUENCE:
;       CIRCCNTR,TAB,X,Y,R
; INPUTS: 		
;       tab_name                table with plotting values	
; KEYWORD PARAMETERS:
;                                   None
; OUTPUTS:
;       XMOY,YMOY		coordonnees du centre du cercle
;	R			rayon du cercle
;
;
; COMMON BLOCKS:
;       None.
; SIDE EFFECTS:
;       None
; RESTRICTIONS:
;
; PROCEDURE:
;       Straightforward.
; MODIFICATION HISTORY:
;
; WRITTEN BY J.P. LE CANN  LAS  31 /1/ 1994
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

I=0
J=0
!ERR=0
YCNTR=0.
XCNTR=0.
R=0.
SUMX=0.
SUMY=0.
SUMXX=0.
SUMYY=0.
SUMXY=0.
SUMXXX=0.
SUMYYY=0.
SUMXYY=0.
SUMXXY=0.
NTOT=0.

NB_POINT=(SIZE(TAB_NAME))(2)
PRINT,'NB_POINT= ',NB_POINT
if NB_POINT LT 3  then begin
print,'nbre de points inferieur a 3!!'
goto,fin
endif
	FOR J=0,NB_POINT - 1 DO BEGIN
	X=TAB_NAME(0,J)
	Y=TAB_NAME(1,J)

;SOMMATION
;
	XX=X*X
	XY=X*Y
	YY=Y*Y
	XXX=XX*X
	YYY=YY*Y
	XYY=X*YY
	XXY=XX*Y
;
	NTOT=NTOT+1
	SUMX=SUMX+X
	SUMY=SUMY+Y
	SUMXX=SUMXX+XX
	SUMYY=SUMYY+YY
	SUMXY=SUMXY+XY
	SUMXXX=SUMXXX+XXX
	SUMYYY=SUMYYY+YYY
	SUMXYY=SUMXYY+XYY
	SUMXXY=SUMXXY+XXY
;PRINT,'ntot= ',NTOT,'X= ',X,' Y= ',Y,' SUMXX= ',SUMXX,' SUMX= ',SUMX
	ENDFOR
;
	A1=2*(SUMX*SUMX-NTOT*SUMXX)
	A2=2*(SUMX*SUMY-NTOT*SUMXY)
	B1=A2
	B2=2*(SUMY*SUMY-NTOT*SUMYY)
	C1=SUMXX*SUMX-NTOT*SUMXXX+SUMX*SUMYY-NTOT*SUMXYY
	C2=SUMXX*SUMY-NTOT*SUMYYY+SUMY*SUMYY-NTOT*SUMXXY
;
	DEN=A1*B2-A2*B1
	XNUM=C1*B2-C2*B1
	YNUM=A1*C2-A2*C1
;
;	PRINT,'DEN= ',DEN,' XNUM= ',XNUM,' YNUM= ',YNUM
;FAIRE UN TEST POUR DEN DIFFERENT DE 0
	XMOY=XNUM/DEN
	YMOY=YNUM/DEN
;
;VALEUR DU CARRE DU RAYON
;	RCARRE=(D1+D2)/NTOT
;AVEC
	D1=SUMXX-2*SUMX*XMOY+NTOT*XMOY*XMOY
	PRINT,'X_CENTRE = ',XMOY,'  Y_CENTRE = ',YMOY
	D2=SUMYY-2*SUMY*YMOY+NTOT*YMOY*YMOY
;	PRINT,'D1= ',D1,' D2= ',D2
	RCARRE=(D1+D2)/NTOT
;
; ICI VERIFIER SI RCARRE >0
	R=SQRT(RCARRE)
;
;	PRINT,'RAYON= ',R

;
;
;FIN
fin:print,'RAYON= ',R



RETURN
END


;...............................................................................
Pro pcircle,IMA,XMOY,YMOY,R,IMAB
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; NAME:
;       PCIRCLE.PRO
; PURPOSE:
;       Trace un  cercle de centre et de  rayon donnes dans une image donnee
; CATEGORY:
;       TRACE
; CALLING SEQUENCE:
;       pcircle,IMA,XMOY,YMOY,R,IMACERCLE
; INPUTS: 
;	IMA	    : Image 
;       XMOY,YMOY   : coordonnees du centre
;        R          : rayon du cercle         
;   
; KEYWORD PARAMETERS:
;                                   None
; OUTPUTS:
;       IMAB	    : IMAGE AVEC LE TRACE DU CERCLE
; COMMON BLOCKS:
;       None.
; SIDE EFFECTS:
;       None
; RESTRICTIONS:
;		ACTUELLEMENT POUR IMAGE 512X512
; PROCEDURE:
;       Straightforward.
; MODIFICATION HISTORY:
;
; WRITTEN BY J.P. LE CANN  LAS  31 /1/ 1994
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
IMAB=MAKE_ARRAY(512,512)
IMAB=IMA
XCNTR=ROUND1(XMOY)
YCNTR=ROUND1(YMOY)
RADIUS=ROUND1(R)

;	IF RADIUS GT 255  THEN BEGIN
;		 	  PRINT,' R= ',R	
;	          	  PRINT ,' RADIUS IS GREATER THAN 255!!'
;			  GOTO,FIN
;	ENDIF

RAY=FLOAT(R)
; ENCADREMENT DU 1/4 DE CERCLE
XSTART=XCNTR-RADIUS
YSTART=YCNTR-RADIUS
	IF XSTART < 0 THEN XSTART=0
	IF YSTART < 0 THEN YSTART=0

XFIN=XCNTR
YFIN=YCNTR

Y=0
FOR Y=YSTART+1,YFIN -1 DO BEGIN
YC=FLOAT(YCNTR-Y)
YCOTE=YCNTR-Y
XC=SQRT(RAY*RAY-YC*YC)
X1=XCNTR - ROUND1(XC)
X2=XCNTR + ROUND1(XC)
	
	IF X1 LT 0     THEN X1=0
	IF X2 GT 511   THEN X2= 511
	
YSYM=Y+2*YCOTE
	IF YSYM GT 511 THEN YSYM=511

IMAB(X1,Y)=16000.
IMAB(X2,Y)=16000.
IMAB(X1,YSYM)=16000.
IMAB(X2,YSYM)=16000.
ENDFOR
PRINT ,'EN Y'

X=0
FOR X=XSTART+1,XFIN-1 DO BEGIN
XC=FLOAT(XCNTR-X)
XCOTE=XCNTR-X
YC=SQRT(RAY*RAY-XC*XC)
Y1=YCNTR - ROUND1(YC)
Y2=YCNTR + ROUND1(YC)

;PRINT,'Y1= ',Y1,' Y2= ',Y2

	IF Y1 LT 0      THEN Y1=0
        IF Y2 GT 511    THEN Y2= 511

XSYM=X+2*XCOTE
		IF XSYM GT 511 THEN XSYM=511


IMAB(X,Y1)=16000.
IMAB(X,Y2)=16000.
IMAB(XSYM,Y1)=16000.
IMAB(XSYM,Y2)=16000.
ENDFOR

YB1=YCNTR-RADIUS
		IF YB1 LT   0 THEN YB1=0
YB2=YCNTR+RADIUS
		IF YB2 GT 511 THEN YB2=511
XB1=XCNTR-RADIUS
		IF XB1 LT   0 THEN XB1=0
XB2=XCNTR+RADIUS
		IF XB2 GT 511 THEN XB2=511


IMAB(XCNTR,YB1)=16000.
IMAB(XCNTR,YB2)=16000.
IMAB(XB1,YCNTR)=16000.
IMAB(XB2,YCNTR)=16000.
IMAB(XCNTR,YCNTR)=16000.        ;CENTRE
                
; VISUALISATION
TVSCL,BYTSCL(IMAB,MIN=MIN(IMAB),MAX=16000)
PRINT ,'FIN DU TRACE DU CERCLE'

FIN:
RETURN
END
;...............................................................................
Pro SIMCIRCLE,IMA,TAB_NAME,XMOY,YMOY,R,IMAB
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; NAME:
;       SIMCIRCLE.PRO
; PURPOSE:
;       en partant  d'un ensemble de  points plottes dans une image donnee 
;       trace un  cercle et en donne le centre et le  rayon
; CATEGORY:
;       TRACE
; CALLING SEQUENCE:
;       SIMCIRCLE,IMA,[TAB,XC,YC,R,IMACERCLE]
; INPUTS:
;       IMA         : Image EN ENTREE
;
; KEYWORD PARAMETERS:
;                                   None
; OUTPUTS:
;       XMOY,YMOY   : coordonnees du centre
;        R          : rayon du cercle
;	IMAB	    : image avec le cercle
;
; COMMON BLOCKS:
;       None.
; SIDE EFFECTS:
;       None
; RESTRICTIONS:
;               ACTUELLEMENT POUR IMAGE 512X512
; PROCEDURE:
;       Straightforward.
; MODIFICATION HISTORY:
;
; WRITTEN BY J.P. LE CANN  LAS  31 /1/ 1994
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

PCURSOR,IMA,TAB_NAME
CIRCCNTR,IMA,TAB_NAME,XMOY,YMOY,R
PCIRCLE,IMA,XMOY,YMOY,R,IMAB
RETURN
END
