source: trunk/TRIANGULATION/tracecote.pro @ 2

Last change on this file since 2 was 2, checked in by opalod, 22 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 8.0 KB
Line 
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
48PRO 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
191end
Note: See TracBrowser for help on using the repository browser.