PRO TRV_DIST, t, xm, ym, d, points, seuil
;+
; Cette procedure determine les distances entre le centre et la
; frontiere valmax/seuil dans 8 directions privilegiees (kpi/4)
; APPEL:
; tab: tableau a deux dimensions contenant l'image
; xm, ym: indices du maximum du tableau
; d: tableau des 8 distances a calculer
; seuil: critere de recherche des 8 distances
;-

	critere=t(xm, ym)/seuil
	result=SIZE(t)
	limitx=result(1)-1
	limity=result(2)-1
	indx = 0 & indy = 0
	
;  Pour les 8 directions, la procedure est la suivante:
;  localisation des deux points encadrant la valeur critere
;  interpolation lineaire entre ces points et calcule de la distance

;  determination de d(0) theta = 0 y=ym constant
	x2=xm+1
	y2=ym
	WHILE ( ( x2 LT limitx) AND (t(x2,y2) GT critere) AND  (t(x2,y2) LT t(x2-1, y2)) ) DO x2=x2+1
	x1=x2-1 & y1=y2
	
	; si pas de remontees, ni au bord
	IF ( x2 LT limitx) AND (t(x2,y2) LT t(x2-1, y2)) THEN BEGIN 
		x1=x2-1 & y1=y2
		indx =((critere-t(x1,y1))/(t(x2,y2)-t(x1,y1))) + x1
		d(0)=SQRT((indx-xm)^2)
		IF d(0) LT 3.0 THEN d(0) = -1.0
	ENDIF ELSE d(0) = -1.0
	points(0,0) = x2 & points(0,1) = y2
;	PRINT,'index point0 ',x2,t(x2,y2),t(x1,y1)
;	PRINT,'index miH0',indx
;	PRINT,'valeur d(0)',d(0)
	
;	determination de d(1) theta = pi/4
	x2=xm+1
	y2=ym+1
	WHILE ( (x2 LT limitx) AND (y2 LT limity) AND (t(x2,y2) GT critere) AND (t(x2,y2) LT t(x2-1,y2-1)) ) DO BEGIN
		x2=x2+1
		y2=y2+1
	ENDWHILE
	x1=x2-1 & y1=y2-1
	IF (x2 LT limitx) AND (y2 LT limity) AND (t(x2,y2) LT t(x2-1,y2-1)) THEN BEGIN 
		x1=x2-1 & y1=y2-1
		indx=((critere-t(x1,y1))/(t(x2,y2)-t(x1,y1))) + x1
		indy=((critere-t(x1,y1))/(t(x2,y2)-t(x1,y1))) + y1
		d(1)=sqrt(((indx-xm)^2)+((indy-ym)^2))
		IF d(1) LT 3.0 THEN d(1) = -1.0
	ENDIF ELSE d(1) = -1.0
	points(1,0) = x2 & points(1,1) = y2
;	PRINT,'index point1 ',x2,y2,t(x2,y2),t(x1, y1)
;	PRINT,'index miH1',indx,indy
;	PRINT,'valeur d(1)',d(1)
	
;	determination de d(2) theta = pi/2 x=xm constant
	x2=xm
	y2=ym+1
	WHILE ( ( y2 LT limity) AND (t(x2,y2) GT critere) AND (t(x2,y2) LT t(x2, y2-1)) ) DO y2=y2+1
	x1=x2 & y1=y2-1
	; si pas de remontees, ni au bord
	IF ( y2 LT limitx) AND (t(x2,y2) LT t(x2, y2-1)) THEN BEGIN 
		x1=x2 & y1=y2-1
		indx =((critere-t(x1,y1))/(t(x2,y2)-t(x1,y1))) + y1
		d(2)=SQRT((indx-ym)^2)
		IF d(2) LT 3.0 THEN d(2) = -1.0
	ENDIF ELSE d(2) = -1.0
	points(2,0) = x2 & points(2,1) = y2
;	PRINT,'index point2 ',y2,t(x2,y2),t(x1,y1)
;	PRINT,'index miH2',indx
;	PRINT,'valeur d(2)',d(2)

;	partie determination de d(3) theta = 3pi/4
	x2=xm-1
	y2=ym+1
	WHILE ( (x2 GT 0) AND (y2 LT limity) AND (t(x2,y2) GT critere) AND (t(x2,y2) LT t(x2+1,y2-1)) ) DO BEGIN
		x2=x2-1
		y2=y2+1
	ENDWHILE
	x1=x2+1 & y1=y2-1
	IF (x2 GT 0) AND (y2 LT limity) AND (t(x2,y2) LT t(x2+1,y2-1)) THEN BEGIN 
		x1=x2+1 & y1=y2-1
		indx=x1 - ((critere-t(x1,y1))/(t(x2,y2)-t(x1,y1)))
		indy=((critere-t(x1,y1))/(t(x2,y2)-t(x1,y1))) + y1
		d(3)=sqrt(((indx-xm)^2)+((indy-ym)^2))
		IF d(3) LT 3.0 THEN d(3) = -1.0
	ENDIF ELSE d(3) = -1.0
	points(3,0) = x2 & points(3,1) = y2
;	PRINT,'index point3 ',x2,y2,t(x2,y2),t(x1, y1)
;	PRINT,'index miH3',indx,indy
;	PRINT,'valeur d(3)',d(3)

;	determination de d(4) theta = pi y=ym constant
	x2=xm-1
	y2=ym
	WHILE ( (x2 GT 0) AND (t(x2,y2) GT critere) AND (t(x2,y2) LT t(x2+1, y2)) ) DO x2=x2-1
	x1=x2+1 & y1=y2
	; si pas de remontees, ni au bord
	IF ( x2 GT 0) AND (t(x2,y2) LT t(x2+1, y2)) THEN BEGIN 
		x1=x2+1 & y1=y2
		indx = x1 - ((critere-t(x1,y1))/(t(x2,y2)-t(x1,y1)))
		d(4)=SQRT((indx-xm)^2)
		IF d(4) LT 3.0 THEN d(4) = -1.0
	ENDIF ELSE d(4) = -1.0
	points(4,0) = x2 & points(4,1) = y2
;	PRINT,'index point4 ',x2,t(x2,y2),t(x1,y1)
;	PRINT,'index miH4',indx
;	PRINT,'valeur d(4)',d(4)

;	determination de d(5) theta = 5pi/4
	x2=xm-1
	y2=ym-1
	WHILE ( (x2 GT 0) AND (y2 GT 0) AND (t(x2,y2) GT critere) AND (t(x2,y2) LT t(x2+1,y2+1)) ) DO BEGIN
		x2=x2-1
		y2=y2-1
	ENDWHILE
	x1=x2+1 & y1=y2+1
	IF (x2 GT 0) AND (y2 GT 0) AND (t(x2,y2) LT t(x2+1,y2+1)) THEN BEGIN 
		x1=x2+1 & y1=y2+1
		indx=x1 - ((critere-t(x1,y1))/(t(x2,y2)-t(x1,y1)))
		indy=y1 - ((critere-t(x1,y1))/(t(x2,y2)-t(x1,y1)))
		d(5)=sqrt(((indx-xm)^2)+((indy-ym)^2))
		IF d(5) LT 3.0 THEN d(5) = -1.0
	ENDIF ELSE d(5) = -1.0
	points(5,0) = x2 & points(5,1) = y2
;	PRINT,'index point5 ',x2,y2,t(x2,y2),t(x1, y1)
;	PRINT,'index miH5',indx,indy
;	PRINT,'valeur d(5)',d(5)

;	determination de d(6) theta = 3pi/2 x=xm constant
	x2=xm
	y2=ym-1
	WHILE ( (y2 GT 0) AND (t(x2,y2) GT critere) AND (t(x2,y2) LT t(x2, y2+1)) ) DO y2=y2-1
	x1=x2 & y1=y2+1
	; si pas de remontees, ni au bord
	IF ( y2 GT 0) AND (t(x2,y2) LT t(x2, y2+1)) THEN BEGIN 
		x1=x2 & y1=y2+1
		indx = y1 - ((critere-t(x1,y1))/(t(x2,y2)-t(x1,y1)))
		d(6)=SQRT((indx-ym)^2)
		IF d(6) LT 3.0 THEN d(6) = -1.0
	ENDIF ELSE d(6) = -1.0
	points(6,0) = x2 & points(6,1) = y2
;	PRINT,'index point6 ',x2,t(x2,y2),t(x1,y1)
;	PRINT,'index miH6',indx
;	PRINT,'valeur d(6)',d(6)

;	determination de d(7) theta = 7pi/4
	x2=xm+1
	y2=ym-1
	WHILE ( (x2 LT limitx) AND (y2 GT 0) AND (t(x2,y2) GT critere) AND (t(x2,y2) LT t(x2-1,y2+1)) ) DO BEGIN
		x2=x2+1
		y2=y2-1
	ENDWHILE
	x1=x2-1 & y1=y2+1
	IF (x2 LT limitx) AND (y2 GT 0) AND (t(x2,y2) LT t(x2-1,y2+1)) THEN BEGIN 
		x1=x2-1 & y1=y2+1
		indx=((critere-t(x1,y1))/(t(x2,y2)-t(x1,y1))) + x1
		indy=y1 - ((critere-t(x1,y1))/(t(x2,y2)-t(x1,y1)))
		d(7)=sqrt(((indx-xm)^2)+((indy-ym)^2))
		IF d(7) LT 3.0 THEN d(7) = -1.0
	ENDIF ELSE d(7) = -1.0
	points(7,0) = x2 & points(7,1) = y2
;	PRINT,'index point7 ',x2,y2,t(x2,y2),t(x1, y1)
;	PRINT,'index miH7',indx,indy
;	PRINT,'valeur d(7)',d(7)

; Calcul de la moyenne
	moydist = 0.0 & fact = 0
	FOR i=0,7 DO BEGIN
		IF d(i) NE -1.0 THEN BEGIN
			moydist = moydist + d(i)
			fact = fact + 1
		ENDIF
	ENDFOR
	IF fact NE 0 THEN moydist = moydist/fact
	
;	PRINT, 'Moyenne distance', moydist

	; Levee des distances indeterminees
	FOR i=0,7 DO BEGIN
		IF d(i) EQ -1.0 THEN BEGIN
		;	d(i) = moydist
			IF i LT 4 THEN j=i+4 ELSE j=i-4
			IF d(j) EQ -1.0 THEN d(i) = moydist ELSE d(i)=d(j)
		ENDIF
	ENDFOR

;	PRINT, d

END
