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

Last change on this file since 72 was 29, checked in by pinsard, 18 years ago

upgrade of TRIANGULATION according to cerbere.lodyc.jussieu.fr: /usr/home/smasson/SAXO_RD/ : files

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