PRO drawcoast_c, mask, xf, yf, nx, ny, COAST_COLOR = coast_color, COAST_THICK = coast_thick, YSEUIL = yseuil, XSEUIL = xseuil, _extra = ex ;--------------------------------------------------------- ; compile_opt idl2, strictarrsubs ; @cm_4mesh IF NOT keyword_set(key_forgetold) THEN BEGIN @updatenew @updatekwd ENDIF ;--------------------------------------------------------- tempsun = systime(1) ; pour key_performance ;--------------------------------------------------------- ; ; on trace les segments verticaux: ; if NOT keyword_set(yseuil) then yseuil = 5. < (min([nx, ny])-2) distanceseuil = (!p.position[3]-!p.position[1])/yseuil ; liste: liste des points i pourlesquels on va tracer un segment entre ; le point i,j-1 et i,j tempdeux = systime(1) ; pour key_performance =2 liste = where((mask+shift(mask, -1, 0)) EQ 1 $ AND ((xf-shift(xf, 0, 1))^2+(yf-shift(yf, 0, 1))^2) LE distanceseuil^2) IF liste[0] NE -1 THEN BEGIN ; on recupere lx et ly qui sont les indices ds un tableau 2d des ; points donnes par liste ly = liste/nx & lx = temporary(liste)-nx*ly indice = where(ly NE 0) ; on ne prend pas les points concernant if indice[0] NE -1 then begin ; la premiere ligne car ds ce cas le pt j-1 n''est pas definit lx = lx[indice] & ly = ly[temporary(indice)] ; boucle sur les points concernes et trace du segment ; rq: on utilise plost au lieu de plot car plots est bcp plus rapide. IF testvar(var = key_performance) EQ 2 THEN $ print, 'temps tracecote: determiner liste des points concernes par un trait vertical', systime(1)-tempdeux tempdeux = systime(1) ; pour key_performance =2 for pt = 0L, n_elements(lx)-1 do BEGIN i = lx[pt] & j = ly[pt] plots, [xf[i, j-1], xf[i, j]], [yf[i, j-1], yf[i, j]] $ , color = coast_color, thick = coast_thick, /normal, _extra = ex endfor IF testvar(var = key_performance) EQ 2 THEN $ print, 'temps tracecote: trace des traits verticaux', systime(1)-tempdeux endif ENDIF ; ; pour le trace des segments horizontaux, c''est la meme chose sauf ; qu'il faut faire attention si on est periodique: ; ; si on est periodique on duplique la premiere colonne et on la met a ; la fin. (ceci est fait non pas pour le shift qui est par defaut ; periodique mais pour le plots tempdeux = systime(1) ; pour key_performance =2 if keyword_set(key_periodic) AND nx EQ jpi then begin mask = [mask, mask[0, *]] xf = [xf, xf[0, *]] yf = [yf, yf[0, *]] nx = nx+1 ENDIF if NOT keyword_set(xseuil) then xseuil = 5. < (min([nx, ny])-2) distanceseuil = (!p.position[2]-!p.position[0])/xseuil liste = where((mask+shift(mask, 0, -1)) EQ 1 $ AND ((xf-shift(xf, 1, 0))^2+(yf-shift(yf, 1, 0))^2) LE distanceseuil^2) IF liste[0] NE -1 THEN BEGIN ly = liste/nx & lx = temporary(liste)-nx*ly indice = where(ly NE ny-1 AND lx NE 0) if indice[0] NE -1 then begin ; on ne prend pas les points de la ; premiere colonne et de la derniere ligne (car on l''a rajoute artificiellement!)) lx = lx[indice] & ly = ly[temporary(indice)] IF testvar(var = key_performance) EQ 2 THEN $ print, 'temps tracecote: determiner liste des points concernes par un trait horizontal', systime(1)-tempdeux tempdeux = systime(1) ; pour key_performance =2 for pt = 0L, n_elements(lx)-1 do BEGIN i = lx[pt] & j = ly[pt] plots, [xf[i-1, j], xf[i, j]], [yf[i-1, j], yf[i, j]] $ , color = coast_color, thick = coast_thick, /normal, _extra = ex endfor IF testvar(var = key_performance) EQ 2 THEN $ print, 'temps tracecote: trace des traits horizontaux', systime(1)-tempdeux endif endif ;--------------------------------------------------------- if keyword_set(key_performance) THEN print, 'temps drawcoast_c', systime(1)-tempsun return end