source: trunk/SRC/ToBeReviewed/TRIANGULATION/ciseauxtri.pro @ 134

Last change on this file since 134 was 134, checked in by navarro, 18 years ago

change *.pro file properties (del eof-style, del executable, set keywords Id

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 8.1 KB
Line 
1;------------------------------------------------------------
2;------------------------------------------------------------
3;------------------------------------------------------------
4;+
5; NAME:
6;
7; PURPOSE:vire les tableaux qui ne doivent pas etre dessines grace a 2
8; tests:
9;     1) les coins du tableau doivent etre ds la fenetre
10;     2) les clongeurs des cotes des triangfles exprimes en
11;     coordonnees normalisesne doivent pas depasser une certaine
12;     longueur seuil.
13;
14; CATEGORY:
15;
16; CALLING SEQUENCE:
17;
18; INPUTS:
19;
20; KEYWORD PARAMETERS:
21;
22; OUTPUTS:
23;
24; COMMON BLOCKS:
25;       common.pro
26;
27; SIDE EFFECTS:
28;
29; RESTRICTIONS:
30;
31; EXAMPLE:
32;
33; MODIFICATION HISTORY: Sebastien Masson (smasson@lodyc.jussieu.fr)
34;                       20/2/99
35;-
36;------------------------------------------------------------
37;------------------------------------------------------------
38;------------------------------------------------------------
39FUNCTION ciseauxtri, triang, glam, gphi, TOUT = tout, _EXTRA = ex
40;---------------------------------------------------------
41;
42  compile_opt idl2, strictarrsubs
43;
44@cm_4mesh
45  IF NOT keyword_set(key_forgetold) THEN BEGIN
46@updatenew
47  ENDIF
48;---------------------------------------------------------
49  IF NOT keyword_set(key_periodic) AND NOT keyword_set(key_irregular) $
50    AND NOT (!map.projection LE 7 AND !map.projection NE 0) $
51    AND NOT (!map.projection EQ 14 OR !map.projection EQ 15 $
52             OR !map.projection EQ 18) THEN return, triang
53;
54   tempsun = systime(1)         ; pour key_performance
55;
56   taille = size(glam)
57   nx = taille[1]
58   ny = taille[2]
59
60   tempdeux = systime(1)        ; pour key_performance =2
61   z = convert_coord(glam[*],gphi[*],/data,/to_normal)
62   x = z[0, *]
63   y = z[1, *]
64   tempvar = SIZE(TEMPORARY(z)) ; delete z
65   IF testvar(var = key_performance) EQ 2 THEN $
66    print, 'temps ciseauxtri: convert_coord data to_normal', systime(1)-tempdeux
67;
68; attention, suivant la projection certains points x ou y peuvent
69; devenir NaN (cf. points deriere la terre ds une projection
70; orthographique) il faut dans ce cas enlever tous les triangles qui
71; contiennent un de ces points
72;
73   if (!map.projection LE 7 AND !map.projection NE 0) $
74    OR !map.projection EQ 14 OR !map.projection EQ 15 OR !map.projection EQ 18 then begin
75      tempdeux = systime(1)     ; pour key_performance =2
76;
77      test = (x*y)[triang]
78      test = finite(temporary(test), /nan)
79      test = total(temporary(test), 1)
80      ind = where(temporary(test) EQ 0)
81;
82      if ind[0] NE -1 then triang = triang[*, temporary(ind)] ELSE return,  -1
83      trichanged = 1b
84      IF testvar(var = key_performance) EQ 2 THEN $
85       print, 'temps ciseauxtri: recherche points a NAN', systime(1)-tempdeux
86   endif
87;
88   seuil = 5 < (min([nx, ny])-2)
89;
90; maintenant on vire les triangles dont un des cotes a une taille
91; superieure a 1/seuil du domaine reserve au dessin.
92;
93
94   if keyword_set(key_periodic)  then begin
95      tempdeux = systime(1)     ; pour key_performance =2
96;
97      xtri = x[triang]
98      xtri = xtri-shift(xtri, 1, 0)
99      testx = abs(temporary(xtri)) GT ((!p.position[2]-!p.position[0])/seuil)
100      testx = total(temporary(testx), 1)
101;
102      ytri = y[triang]
103      ytri = ytri-shift(ytri, 1, 0)
104      testy = abs(temporary(ytri)) GT ((!p.position[3]-!p.position[1])/seuil)
105      testy = total(temporary(testy), 1)
106;
107      test = temporary(testx)+temporary(testy)
108      ind=where(temporary(test) EQ 0)
109;
110      IF testvar(var = key_performance) EQ 2 THEN $
111       print, 'temps ciseauxtri: trouver les triangles trop grands', systime(1)-tempdeux
112;
113      tempdeux = systime(1)     ; pour key_performance =2
114      if ind[0] NE -1 then triang = triang[*, temporary(ind)] ELSE return,  -1
115      trichanged = 1b
116      IF testvar(var = key_performance) EQ 2 THEN $
117       print, 'temps ciseauxtri: virer les triangles trop grands', systime(1)-tempdeux
118   endif
119;
120; on supprime les triangles qui sont un peu trop hors du cadre
121; valable qd /TOUT est active
122;
123    if keyword_set(key_irregular) then begin
124
125       tempdeux = systime(1)     ; pour key_performance =2
126       xtri = x[triang]
127       test1 = xtri GE !p.position[0]
128       test2 = xtri LE !p.position[2]
129       undefine, xtri
130       testx = temporary(test1)*temporary(test2)
131       testx = total(temporary(testx), 1)
132;
133       ytri = y[triang]
134       test1 = ytri GE !p.position[1]
135       test2 = ytri LE !p.position[3]
136       undefine, ytri
137       testy = temporary(test1)*temporary(test2)
138       testy = total(temporary(testy), 1)
139;
140       test = temporary(testx)*temporary(testy);
141;
142       ind=where(temporary(test) NE 0)
143;
144       if ind[0] NE -1 then triang = triang[*, temporary(ind)] ELSE return,  -1
145       trichanged = 1b
146       IF testvar(var = key_performance) EQ 2 THEN $
147        print, 'temps ciseauxtri: virer les triangles hors du cadre', systime(1)-tempdeux
148    ENDIF
149;
150;        dernier tri
151;
152   if keyword_set(trichanged) then BEGIN
153;
154; il faut verifier que les triangles que l''on garde ne
155; forment pas une triangulation dans laquelle 2 triangles ont un
156; sommet en commun sans avoir de cote de commun.
157;
158; on constitue la liste des rectangles que l''on souhaite garder (on
159; garde un rectangle des qu''il y a un triangle dedans)
160;
161; dans definetri, on a construit les triangles tels que le premier et
162; le dernier sommets soient ceux de la diagonale du rectangle definit
163; par le maillage.
164; pour retouver de quel rectangle provient un triangle, on cherche le
165; min de l''indice suivant x et suivant y de chaque triangle. Apres on
166; repasse cette indissage suivant x et y en indicage suivant nx*ny
167;
168      tempdeux = systime(1)     ; pour key_performance =2
169; indices en y des rectangles
170      indytriang = (triang[0, *]/nx) < (triang[2, *]/nx)
171; indices en x des rectangles
172      indxtriang0 = triang[0, *]-nx*(triang[0, *]/nx)
173      indxtriang2 = triang[2, *]-nx*(triang[2, *]/nx)
174      indxmin = indxtriang0 < indxtriang2
175; attention dans le cas ou la grille est periodique et ou on a tous
176; les points suivant x, les triangles qui assurent la periodicite en x
177; ont des indices suivant x qui sont 0 et nx-1. Ils appatienent au
178; rectangles de la colonne nx-1 et non de la colonne 0
179      if keyword_set(key_periodic) AND nx EQ jpi then BEGIN
180      indxmax = indxtriang0 > indxtriang2
181      indxtriang = indxmin + (nx-1)*(indxmin EQ 0 AND indxmax EQ (nx-1))
182      ENDIF ELSE indxtriang = indxmin
183      listrect = nx*indytriang+indxtriang
184      IF testvar(var = key_performance) EQ 2 THEN $
185       print, 'temps ciseauxtri: liste des rectangles', systime(1)-tempdeux
186;
187; maintenant qu''on a cette liste on va s''assuter que l''on a pas de
188; triangles qui n''ont qu''on sommet en commun.
189;
190      test = bytarr(nx, ny)
191      test[listrect] = 1
192      dejavire = 1b-test
193;
194      tempdeux = systime(1)     ; pour key_performance =2
195      vire1 = 0
196      vire2 = 0
197      while (vire1[0] NE -1 OR vire2[0] NE -1) ne 0 do begin
198         vire1 = where( (test*shift(test, -1, -1) $
199                         *(1-shift(test, 0, -1))*(1-shift(test, -1, 0))) EQ 1)
200         if vire1[0] NE -1 THEN test[vire1] = 0 ; on vire le rectangle
201         vire2 = where( ((1-test)*(1-shift(test, -1, -1)) $
202                         *shift(test, 0, -1)*shift(test, -1, 0)) EQ 1)
203; on vire le rectangle du dessus (meme indice x mais egale a 1)
204         if vire2[0] NE -1 THEN test[vire2+nx] = 0
205      ENDWHILE
206;stop
207      test = test+temporary(dejavire)
208;
209      avirer = where(temporary(test) EQ 0)
210      IF testvar(var = key_performance) EQ 2 THEN $
211       print, 'temps ciseauxtri: determinationdes rectangles a virer', systime(1)-tempdeux
212;
213      if avirer[0] NE -1 then begin
214      tempdeux = systime(1)     ; pour key_performance =2
215      indnx = n_elements(listrect)
216      indny = n_elements(avirer)
217      ind = listrect[*]#replicate(1l, indny)
218      ind = ind EQ replicate(1, indnx)#avirer[*]
219      if indny GT 1 then ind = total(ind, 2)
220      ind = where(ind EQ 0)
221      if ind[0] NE -1 then triang = triang[*, ind] ELSE return,  -1
222      endif
223      IF testvar(var = key_performance) EQ 2 THEN $
224       print, 'temps ciseauxtri: derniere retouche de la triangulation', systime(1)-tempdeux
225   endif
226;   
227;
228   if keyword_set(key_performance) THEN print, 'temps ciseauxtri', systime(1)-tempsun
229;
230   return,  triang
231end
Note: See TracBrowser for help on using the repository browser.