[2] | 1 | ;------------------------------------------------------------ |
---|
| 2 | ;------------------------------------------------------------ |
---|
| 3 | ;------------------------------------------------------------ |
---|
| 4 | ;+ |
---|
| 5 | ; NAME:tracecote |
---|
| 6 | ; |
---|
| 7 | ; PURPOSE: dessine les cotes ds plt |
---|
| 8 | ; |
---|
| 9 | ; CATEGORY: pour faire un joli dessin |
---|
| 10 | ; |
---|
| 11 | ; CALLING SEQUENCE:tracecote,mask |
---|
| 12 | ; |
---|
| 13 | ; INPUTS:mask le tableau mask sur la zone consideree pour le dessin |
---|
| 14 | ; |
---|
| 15 | ; KEYWORD PARAMETERS: |
---|
| 16 | ; |
---|
| 17 | ; CONT_THICK: l''epaisseur du trait pour tracer les |
---|
| 18 | ; continents. par defaut c''est 1. |
---|
| 19 | ; |
---|
| 20 | ; XSEUIL: pour eliminer les segments de cote qui sont trop |
---|
| 21 | ; grand (qui relient des points qui peuvent etre tres proches |
---|
| 22 | ; sur la sphere mais tres eloignes sur le dessin) on supprime |
---|
| 23 | ; tous les egments dot la taille depasse: |
---|
| 24 | ; taille de la fenetre suivant X/ xseuil. |
---|
| 25 | ; Par defaut xseuil est egale a 5. masi peut etre trop grand si |
---|
| 26 | ; on fait un fort zoom ou trout petit pour certaines |
---|
| 27 | ; projections... le specifier alors a l''aide de ce mot cle! |
---|
| 28 | ; |
---|
| 29 | ; YSEUIL: cf. xseuil |
---|
| 30 | ; |
---|
| 31 | ; OUTPUTS: rien |
---|
| 32 | ; |
---|
| 33 | ; COMMON BLOCKS:common.pro |
---|
| 34 | ; |
---|
| 35 | ; SIDE EFFECTS: |
---|
| 36 | ; |
---|
| 37 | ; RESTRICTIONS: |
---|
| 38 | ; |
---|
| 39 | ; EXAMPLE: |
---|
| 40 | ; |
---|
| 41 | ; MODIFICATION HISTORY:Sebastien Masson (smasson@lodyc.jussieu.fr) |
---|
| 42 | ; 30/9/1999 |
---|
| 43 | ;- |
---|
| 44 | ;------------------------------------------------------------ |
---|
| 45 | ;------------------------------------------------------------ |
---|
| 46 | ;------------------------------------------------------------ |
---|
| 47 | ; PRO tracecote, CONT_THICK = cont_thick, YSEUIL = yseuil, XSEUIL = xseuil, _extra = ex |
---|
| 48 | PRO tracecote, _extra = ex |
---|
| 49 | @common |
---|
| 50 | tempsun = systime(1) ; pour key_performance |
---|
| 51 | if n_elements(key_gridtype) EQ 0 then key_gridtype = 'c' |
---|
| 52 | ; |
---|
| 53 | ; on agrandi un peu le cadre definit par les premier..., dernier... de |
---|
| 54 | ; facon a bien recuperer les bords de cote qui sont en bordure du |
---|
| 55 | ; domaine a tracer |
---|
| 56 | ; |
---|
| 57 | tempdeux = systime(1) ; pour key_performance =2 |
---|
| 58 | premierx = 0 > (min([premierxt, premierxu])-1) |
---|
| 59 | dernierx = (max([dernierxt, dernierxu])+1) < (jpi-1) |
---|
| 60 | premiery = 0 > (min([premieryt, premieryv])-1) |
---|
| 61 | derniery = (max([dernieryt, dernieryv])+1) < (jpj-1) |
---|
| 62 | nx = dernierx-premierx+1 |
---|
| 63 | ny = derniery-premiery+1 |
---|
| 64 | ; quel niveau vertical choisir ? |
---|
| 65 | IF strupcase(vargrid) eq 'W' THEN BEGIN |
---|
| 66 | nz = nzw & premierz = premierzw & dernierz = dernierzw |
---|
| 67 | ENDIF ELSE BEGIN |
---|
| 68 | nz = nzt & premierz = premierzt & dernierz = dernierzt |
---|
| 69 | ENDELSE |
---|
| 70 | if nz eq jpk then nivz = niveau-1 ELSE nivz = nz-1 |
---|
| 71 | ; attribution du masque et des coordonnes delimitant les limites de la |
---|
| 72 | ; terre (coordonnees f) |
---|
| 73 | mask = tmask[premierx:dernierx, premiery:derniery, niveau-1] |
---|
| 74 | xf = glamf[premierx:dernierx, premiery:derniery] |
---|
| 75 | yf = gphif[premierx:dernierx, premiery:derniery] ; |
---|
| 76 | IF testvar(var = key_performance) EQ 2 THEN $ |
---|
| 77 | print, 'temps tracecote: determiner mask xf yf', systime(1)-tempdeux |
---|
| 78 | ; |
---|
| 79 | if key_gridtype EQ 'e' then onemore = xf[0, 0] gT xf[0, 1] |
---|
| 80 | ; on passe en coordonnee normaliser pour pouvoir s'affranchir du type |
---|
| 81 | ; de projection choisie et du suport surlequel on fait le dessin |
---|
| 82 | ; (ecran ou postscript) |
---|
| 83 | z = convert_coord(xf(*),yf(*),/data,/to_normal) |
---|
| 84 | xf = reform(z[0, *], nx, ny) |
---|
| 85 | yf = reform(z[1, *], nx, ny) |
---|
| 86 | tempvar = SIZE(TEMPORARY(z)) |
---|
| 87 | ; |
---|
| 88 | ; attention, suivant la projection certains points x ou y peuvent |
---|
| 89 | ; devenir NaN (cf. points deriere la terre ds une projection |
---|
| 90 | ; orthographique) |
---|
| 91 | ; |
---|
| 92 | ; on met les points a eliminer a une tres gande valeur comme ca il ne |
---|
| 93 | ; passerons pas le test avec distanceseuil (cf. plus bas) |
---|
| 94 | ; |
---|
| 95 | if (!map.projection LE 7 AND !map.projection NE 0) $ |
---|
| 96 | OR !map.projection EQ 14 OR !map.projection EQ 15 OR !map.projection EQ 18 then begin |
---|
| 97 | ind = where(finite(xf*yf) EQ 0) |
---|
| 98 | IF ind[0] NE -1 THEN BEGIN |
---|
| 99 | xf[ind] = 1e5 |
---|
| 100 | yf[ind] = 1e5 |
---|
| 101 | ENDIF |
---|
| 102 | ENDIF |
---|
| 103 | ind = where(xf LT !p.position[0] OR xf GT !p.position[2]) |
---|
| 104 | IF ind[0] NE -1 THEN xf[ind] = 1e5 |
---|
| 105 | ind = where(yf LT !p.position[1] OR yf GT !p.position[3]) |
---|
| 106 | IF ind[0] NE -1 THEN yf[ind] = 1e5 |
---|
| 107 | tempvar = SIZE(TEMPORARY(ind)) ; on efface ind |
---|
| 108 | ; |
---|
| 109 | ; pour eviter d'avoir des traits de cotes qui travessent tout l''ecran |
---|
| 110 | ; (qui peuvent etre tres proches sur la sphere mais tres eloignes sur |
---|
| 111 | ; le dessin suivant la projection) on va selectionner uniquements les |
---|
| 112 | ; segments de trait de cote qui ne sont pas trop grand, cad qui ne |
---|
| 113 | ; depassent pas la taille de la fenetre/seuil et pour lesquel le |
---|
| 114 | ; maskque change de valeur entre les extremites du segment. |
---|
| 115 | ; |
---|
| 116 | ; on trace les segments verticaux: |
---|
| 117 | ; |
---|
| 118 | ; if NOT keyword_set(xseuil) then xseuil = 5. |
---|
| 119 | ; distanceseuil = (!p.position[2]-!p.position[0])/xseuil |
---|
| 120 | ; ; liste: liste des points i pourlesquels on va tracer un segment entre |
---|
| 121 | ; ; le point i,j-1 et i,j |
---|
| 122 | ; tempdeux = systime(1) ; pour key_performance =2 |
---|
| 123 | ; liste = where(mask+shift(mask, -1, 0) EQ 1 $ |
---|
| 124 | ; AND (xf-shift(xf, 0, 1))^2+(yf-shift(yf, 0, 1))^2 LE distanceseuil) |
---|
| 125 | ; IF liste[0] NE -1 THEN BEGIN |
---|
| 126 | ; ; on recupere lx et ly qui sont les indices ds un tableau 2d des |
---|
| 127 | ; ; points donnes par liste |
---|
| 128 | ; ly = liste/nx & lx = temporary(liste)-nx*ly |
---|
| 129 | ; indice = where(ly NE 0) ; on ne prend pas les points concernant |
---|
| 130 | ; if indice[0] NE -1 then begin |
---|
| 131 | ; ; la premiere ligne car ds ce cas le pt j-1 n''est pas definit |
---|
| 132 | ; lx = lx[indice] & ly = ly[temporary(indice)] |
---|
| 133 | ; ; boucle sur les points concernes et trace du segment |
---|
| 134 | ; ; rq: on utilise plost au lieu de plot car plots est bcp plus rapide. |
---|
| 135 | ; IF testvar(var = key_performance) EQ 2 THEN $ |
---|
| 136 | ; print, 'temps tracecote: determiner liste des points concernes par un trait vertical', systime(1)-tempdeux |
---|
| 137 | ; tempdeux = systime(1) ; pour key_performance =2 |
---|
| 138 | ; for pt = 0, n_elements(lx)-1 do BEGIN |
---|
| 139 | ; i = lx[pt] & j = ly[pt] |
---|
| 140 | ; plots, [xf[i, j-1], xf[i, j]], [yf[i, j-1], yf[i, j]] $ |
---|
| 141 | ; , color=c_cote,thick=cont_thick, /normal, _extra = ex |
---|
| 142 | ; endfor |
---|
| 143 | ; IF testvar(var = key_performance) EQ 2 THEN $ |
---|
| 144 | ; print, 'temps tracecote: trace des traits verticaux', systime(1)-tempdeux |
---|
| 145 | ; endif |
---|
| 146 | ; ENDIF |
---|
| 147 | ; ; |
---|
| 148 | ; ; pour le trace des segments horizontaux, c''est la meme chose sauf |
---|
| 149 | ; ; qu'il faut faire attention si on est periodique: |
---|
| 150 | ; ; |
---|
| 151 | ; ; si on est periodique on duplique la premiere colonne et on la met a |
---|
| 152 | ; ; la fin. (ceci est fait non pas pour le shift qui est par defaut |
---|
| 153 | ; ; periodique mais pour le plots |
---|
| 154 | ; tempdeux = systime(1) ; pour key_performance =2 |
---|
| 155 | ; if keyword_set(key_periodique) AND nx EQ jpi then begin |
---|
| 156 | ; mask = [mask, mask[0, *]] |
---|
| 157 | ; xf = [xf, xf[0, *]] |
---|
| 158 | ; yf = [yf, yf[0, *]] |
---|
| 159 | ; nx = nx+1 |
---|
| 160 | ; ENDIF |
---|
| 161 | ; if NOT keyword_set(yseuil) then yseuil = 5. |
---|
| 162 | ; distanceseuil = (!p.position[3]-!p.position[1])/yseuil |
---|
| 163 | ; liste = where(mask+shift(mask, 0, -1) EQ 1 $ |
---|
| 164 | ; AND (xf-shift(xf, 1, 0))^2+(yf-shift(yf, 1, 0))^2 LE distanceseuil) |
---|
| 165 | ; IF liste[0] NE -1 THEN BEGIN |
---|
| 166 | ; ly = liste/nx & lx = temporary(liste)-nx*ly |
---|
| 167 | ; indice = where(ly NE ny-1 AND lx NE 0) |
---|
| 168 | ; if indice[0] NE -1 then begin |
---|
| 169 | ; ; on ne prend pas les points de la |
---|
| 170 | ; ; premiere colonne et de la derniere ligne (car on l''a rajoute artificiellement!)) |
---|
| 171 | ; lx = lx[indice] & ly = ly[temporary(indice)] |
---|
| 172 | ; IF testvar(var = key_performance) EQ 2 THEN $ |
---|
| 173 | ; print, 'temps tracecote: determiner liste des points concernes par un trait horizontal', systime(1)-tempdeux |
---|
| 174 | ; tempdeux = systime(1) ; pour key_performance =2 |
---|
| 175 | ; for pt = 0, n_elements(lx)-1 do BEGIN |
---|
| 176 | ; i = lx[pt] & j = ly[pt] |
---|
| 177 | ; plots, [xf[i-1, j], xf[i, j]], [yf[i-1, j], yf[i, j]] $ |
---|
| 178 | ; , color=c_cote,thick=cont_thick, /normal, _extra = ex |
---|
| 179 | ; endfor |
---|
| 180 | ; IF testvar(var = key_performance) EQ 2 THEN $ |
---|
| 181 | ; print, 'temps tracecote: trace des traits horizontaux', systime(1)-tempdeux |
---|
| 182 | ; endif |
---|
| 183 | ; endif |
---|
| 184 | if n_elements(key_gridtype) EQ 0 then key_gridtype = 'c' |
---|
| 185 | case key_gridtype of |
---|
| 186 | 'c':drawcoast_c, mask, xf, yf, nx, ny, _extra = ex |
---|
| 187 | 'e':drawcoast_e, mask, xf, yf, nx, ny, onemore = onemore, _extra = ex |
---|
| 188 | endcase |
---|
| 189 | if keyword_set(key_performance) THEN print, 'temps tracecote', systime(1)-tempsun |
---|
| 190 | return |
---|
| 191 | end |
---|