Changeset 150 for trunk/SRC/ToBeReviewed/TRIANGULATION/triangule_c.pro
- Timestamp:
- 08/09/06 12:12:54 (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SRC/ToBeReviewed/TRIANGULATION/triangule_c.pro
r134 r150 3 3 ;------------------------------------------------------------ 4 4 ;+ 5 ; NAME:triangule_c 6 ; 7 ; PURPOSE:construit le tableau de triangulation. 8 ; 9 ; L''idee est de 10 ; construire une liste de triangles qui relient les points entre 11 ; eux. Ceci est fait automatiquement avec la fonction TRIANGULATE. 12 ; ICI: 13 ; on tient compte du fait que les points sont disposes sur une grille 14 ; (reguliere ou pas, mais pas destructuree, cad que les points sont 15 ; ecrits suivant une matrice rectangulaire). Un moyen tres simple de 16 ; faire des triangles entre tous les points est alors: 17 ; 18 ; pour chaque point (i,j) de la matrice -sauf ceux de la derniere 19 ; ligne et de la derniere colonne- on on appelle le rectangle 20 ; (i,j) le rectangle forme par les 4 points (i,j), (i+1,j), 21 ; (i,j+1), (i+1,j+1). Pour tracer tous les triangles, il suffit de 22 ; tracer les 2 triangles contenus ds les rectangles (i,j) 23 ; 24 ; au passage on remarque que chaque rectangle (i,j) possede 2 diagonales (si 25 ; si faites un dessin c''est vrai), il y a donc 2 choix possibles pour 26 ; chaque rectangles qd on veut le couper en 2 triangles... 5 ; 6 ; @file_comments 7 ; Construct the triangulation array. 8 ; 9 ; The idea is: construct a list of triangle which link points between them. 10 ; This is automatically done by the function TRIANGULATE 11 ; Here: 12 ; we consider the fact that points are disposed on a grid (regular or not, 13 ; but not unstructured, that is to say that points are written following a 14 ; rectangular matrix). A easy way to do triangles between all points is then: 15 ; 16 ; for each point (i,j) of the matrix -exept those of the last line and of 17 ; the last column- we call rectangle (i,j) the rectangle made of the four 18 ; points (i,j), (i+1,j), (i,j+1), (i+1,j+1). To trace all triangle, we just 19 ; have to trace the 2 triangles contained in rectangles (i,j) 20 ; 21 ; We notice that each rectangle (i,j) have 2 diagonals (it is true... Make a 22 ; drawing to make sure!!), so there are two possible choice for each rectangle 23 ; we want to cut in 2 triangles... 27 24 ; 28 ; C''est grace a ce choix que l''on va pouvoir tracer les cotes avec 29 ; des angles droits. A chaque angle de cote remarquable par 30 ; l''existance d''un unique point terre ou d''un unique point mer sur 31 ; les 4 cotes d''un rectangle (i,j), il faut couper le rectangle 32 ; suivant la diagonale qui qui passe par le point singulier. 25 ; It is thanks to this choice that we will be able to trace coast with right 26 ; angles. At each angle of coast remarkable by the existence of an unique land 27 ; point or of an unique ocean point on one of the four summit of a rectangle (i,j), 28 ; we have to cut the rectangle following the diagonal passing by this point. 33 29 ; 34 ; CATEGORY:pour faire de beaux graphiques masques 35 ; 36 ; CALLING SEQUENCE:res=triangule([mask]) 37 ; 38 ; INPUTS:optionnel:mask c''est le tableau 2d qui sevira a masquer le 39 ; champ que l''on tracera apres avec CONTOUR, 30 ; @categories 31 ; graphic 32 ; 33 ; @param MASKENTREE {in}{optional} 34 ; It is a 2d array which will serve to mask the field we will trace after with CONTOUR, 40 35 ; ...TRIANGULATION=triangule(mask) 41 ; si cet argument n''est pas specifie, la function utilise tmask. 42 ; 43 ; KEYWORD PARAMETERS: 44 ; 45 ; /BASIC: specifie que le masque est sur une grille basice 46 ; (utiliser pour la triangulation ds les coupes verticales et 47 ; des hovmoellers) 48 ; 49 ; /KEEP_CONT: to keep the triangulation even on the continents 50 ; 51 ; COINMONTE=tableau, pour obtenir le tableau de "coins de terre 52 ; montant" a traiter avec completecointerre.pro ds la variable 53 ; tableau plutot que de la faire passer par la variable globale 54 ; twin_corners_up. 55 ; 56 ; COINDESCEND=tableau cf COINMONTE 57 ; 58 ; OUTPUTS: 59 ; res: tableau 2d (3,nbre de triangles). 60 ; chaque ligne de res represente les indices des points 61 ; constituants les sommets d''un triangle. 62 ; cf. comment on trace les triangles ds dessinetri.pro 63 ; 64 ; COMMON BLOCKS: 65 ; common.pro different.pro definetri.pro 66 ; 67 ; SIDE EFFECTS: 68 ; 69 ; RESTRICTIONS:les donnees dont un veut ensuite faire le contour 70 ; doivent etre disposees dans une matrice. Par contre dans la matrice, 71 ; la disposition des points peut ne pas etre irreguliere. Si les 72 ; donnees sont disposees completement de facon irreguliere, utiliser 73 ; TRIANGULE. 74 ; 75 ; EXAMPLE: 76 ; 77 ; MODIFICATION HISTORY: Sebastien Masson (smasson@lodyc.jussieu.fr) 36 ; If this argument is not specified, the function use tmask 37 ; 38 ; @keyword BASIC 39 ; Specify that the mask is on a basic grid (use the triangulation for vertical cuts and hovmoellers) 40 ; 41 ; @keyword KEEP_CONT 42 ; To keep the triangulation even on the continents 43 ; 44 ; @keyword COINMONTE 45 ; It is an array. To obtain the array of "ascending land corner" to be treated with 46 ; completecointerre.pro in the variable array instead of make it pass by the global 47 ; variable twin_corners_up. 48 ; 49 ; @keyword COINDESCEND 50 ; It is an array. See COINMONTE 51 ; 52 ; @returns 53 ; res: tableau 2d (3,nbre de triangles). 54 ; Each line of res represent indexes of points constituing summits of a triangle. 55 ; See how we trace triangles in definetri.pro 56 ; 57 ; @uses 58 ; common.pro 59 ; different.pro 60 ; definetri.pro 61 ; 62 ; @restrictions 63 ; Datas whose we want to do the contour must be disposed in a matrix. 64 ; On the other hand, in the matrix, the points's arrangement can not be 65 ; irregular. If it is, use TRIANGULE. 66 ; 67 ; @history 68 ; Sebastien Masson (smasson@lodyc.jussieu.fr) 78 69 ; 26/4/1999 70 ; 71 ; @version 72 ; $Id$ 73 ; 74 ; @todo 75 ; seb L.267->268 je ne pense pas que ce soit ce que tu voulais dire mais 76 ; c'est la traduction de ce qu'il y avait écrit. Correction si besoin. 79 77 ;- 80 78 ;------------------------------------------------------------ … … 83 81 FUNCTION triangule_c, maskentree, COINMONTE = coinmonte, COINDESCEND = coindescend, BASIC = basic, KEEP_CONT = keep_cont 84 82 ; 85 86 ; 87 tempsun = systime(1) ; pour key_performance83 compile_opt idl2, strictarrsubs 84 ; 85 tempsun = systime(1) ; For key_performance 88 86 ;--------------------------------------------------------- 89 87 @cm_4mesh 90 88 IF NOT keyword_set(key_forgetold) THEN BEGIN 91 89 @updatenew 92 93 ;------------------------------------------------------------ 94 ; le masque est donne ou il faut prendre tmask?95 ;------------------------------------------------------------ 96 ; 97 98 99 100 101 ; 102 103 ;------------------------------------------------------------ 104 105 106 107 108 109 ;------------------------------------------------------------ 110 ; on va trouver la liste des rectangles (i,j) (reperes par leur coin111 ; en bas a gauche) qu''il faut couper suivant une diagonale descendante112 ; on appellera cette liste: pts_downward90 ENDIF 91 ;------------------------------------------------------------ 92 ; Is the mask given or do we have to take tmask? 93 ;------------------------------------------------------------ 94 ; 95 msk = maskentree 96 taille = size(msk) 97 nx = taille[1] 98 ny = taille[2] 99 ; 100 IF n_elements(keep_cont) EQ 0 THEN keep_cont = 1-key_irregular 101 ;------------------------------------------------------------ 102 if keyword_set(key_periodic)*(nx EQ jpi) $ 103 AND NOT keyword_set(basic) then BEGIN 104 msk = [msk, msk[0, *]] 105 nx = nx+1 106 ENDIF 107 ;------------------------------------------------------------ 108 ; We will find the list of rectangles (i,j)(located by their left 109 ; bottom corner) we have to cut folowing a descendant diagonal. 110 ; We will call this list : pts_downward 113 111 ; 114 115 116 ; on construit le test qui permet de trouver un tel triangle:112 pts_downward = 0 113 114 ; We construct the test which allow to find this triangle : 117 115 ; 118 116 ; … … 124 122 ; msk---------------------shift(msk, -1, 0) 125 123 ; 126 sum1 = msk+shift(msk, -1, 0)+shift(msk, -1, -1) ;pts qui entourrent le pt en haut a gauche 127 sum2 = msk+shift(msk, 0, -1)+shift(msk, -1, -1) ;pts qui entourrent le pt en bas a droite 128 129 130 tempdeux = systime(1) ; pour key_performance =2 131 ; pt terre en haut a gauche entoure de pts mer 132 liste = where( (4-sum1)*(1-shift(msk, 0, -1)) EQ 1 ) 133 if liste[0] NE -1 THEN pts_downward = [pts_downward,liste ] 134 ; pt mer en haut a gauche entoure de pts terre 135 liste = where( (1-sum1)*shift(msk, 0, -1) EQ 1) 136 if liste[0] NE -1 THEN pts_downward = [pts_downward,liste ] 137 ; pt terre en bas a droite entoure de pts mer 138 liste = where( (4-sum2)*(1-shift(msk, -1, 0)) EQ 1) 139 if liste[0] NE -1 THEN pts_downward = [pts_downward,liste ] 140 ; pt mer en bas a droite entoure de pts terre 141 liste = where( (1-sum2)*shift(msk, -1, 0) EQ 1) 142 if liste[0] NE -1 THEN pts_downward = [pts_downward,liste ] 143 undefine, liste 144 ; 145 IF testvar(var = key_performance) EQ 2 THEN $ 146 print, 'temps triangule: trouver pts_downward', systime(1)-tempdeux 147 ; 148 if (NOT keyword_set(basic)) OR keyword_set(coinmonte) OR keyword_set(coindescend) then begin 149 tempdeux = systime(1) ; pour key_performance =2 150 ;2 points terre en diagonale montante avec 2 points mer sur la diagonale descendante 151 coinmont = where( (1-msk)*(1-shift(msk, -1, -1)) $ 152 *(shift(msk, 0, -1)*shift(msk, -1, 0) EQ 1) ) 153 if coinmont[0] NE -1 THEN pts_downward = [pts_downward, coinmont] 154 ; 155 IF testvar(var = key_performance) EQ 2 THEN $ 156 print, 'temps triangule: trouver coinmont', systime(1)-tempdeux 157 tempdeux = systime(1) ; pour key_performance =2 158 ; 159 ;2 points terre en diagonale descendante avec 2 points mer sur la diagonale montante 160 coindesc = where( ((1-shift(msk, 0, -1))*(1-shift(msk, -1, 0)) $ 161 *msk*shift(msk, -1, -1) EQ 1) ) 162 ; 163 IF testvar(var = key_performance) EQ 2 THEN $ 164 print, 'temps triangule: trouver coindesc', systime(1)-tempdeux 165 ; 166 ENDIF 167 ; 168 if n_elements(pts_downward) EQ 1 then BEGIN 169 tempdeux = systime(1) ; pour key_performance =2 170 ; 171 triang = definetri(nx, ny) 172 ; 173 IF testvar(var = key_performance) EQ 2 THEN $ 174 print, 'temps triangule: definetri', systime(1)-tempdeux 175 coinmont = -1 176 coindesc = -1 177 ENDIF ELSE BEGIN 178 tempdeux = systime(1) ; pour key_performance =2 179 pts_downward = pts_downward[1:n_elements(pts_downward)-1] 180 pts_downward = pts_downward[uniq(pts_downward, sort(pts_downward))] 181 ; aucun rectangle ne peut avoir comme coin en bas a gauche un element 182 ; de la derniere colonne ou de la derniere ligne. 183 ; il faut donc enlever ces points si ils ont ete selectionnes dans 184 ; pts_downward. 185 derniere_colonne = (lindgen(ny)+1)*nx-1 186 derniere_ligne = lindgen(nx)+(ny-1)*nx 187 pts_downward =different(pts_downward,derniere_colonne ) 188 pts_downward =different(pts_downward,derniere_ligne ) 189 if (NOT keyword_set(basic)) OR keyword_set(coinmonte) OR keyword_set(coindescend) then begin 190 if coinmont[0] NE -1 then begin 124 sum1 = msk+shift(msk, -1, 0)+shift(msk, -1, -1) ;points which surround the left top point. 125 sum2 = msk+shift(msk, 0, -1)+shift(msk, -1, -1) ;points which surround the right bottom point. 126 127 128 tempdeux = systime(1) ; For key_performance =2 129 ; The left top land point surrounded by ocean points 130 liste = where( (4-sum1)*(1-shift(msk, 0, -1)) EQ 1 ) 131 if liste[0] NE -1 THEN pts_downward = [pts_downward,liste ] 132 ; The left top ocean point surrounded by land points 133 liste = where( (1-sum1)*shift(msk, 0, -1) EQ 1) 134 if liste[0] NE -1 THEN pts_downward = [pts_downward,liste ] 135 ; The right bottom land point surrounded by ocean points 136 liste = where( (4-sum2)*(1-shift(msk, -1, 0)) EQ 1) 137 if liste[0] NE -1 THEN pts_downward = [pts_downward,liste ] 138 ; The right bottom ocean point surrounded by land points 139 liste = where( (1-sum2)*shift(msk, -1, 0) EQ 1) 140 if liste[0] NE -1 THEN pts_downward = [pts_downward,liste ] 141 undefine, liste 142 ; 143 IF testvar(var = key_performance) EQ 2 THEN $ 144 print, 'temps triangule: trouver pts_downward', systime(1)-tempdeux 145 ; 146 if (NOT keyword_set(basic)) OR keyword_set(coinmonte) OR keyword_set(coindescend) then begin 147 tempdeux = systime(1) ; For key_performance =2 148 ;2 land points in ascendant diagonal with 2 ocean points in descendant diagonal. 149 coinmont = where( (1-msk)*(1-shift(msk, -1, -1)) $ 150 *(shift(msk, 0, -1)*shift(msk, -1, 0) EQ 1) ) 151 if coinmont[0] NE -1 THEN pts_downward = [pts_downward, coinmont] 152 ; 153 IF testvar(var = key_performance) EQ 2 THEN $ 154 print, 'temps triangule: trouver coinmont', systime(1)-tempdeux 155 tempdeux = systime(1) ; pour key_performance =2 156 ; 157 coindesc = where( ((1-shift(msk, 0, -1))*(1-shift(msk, -1, 0)) $ 158 *msk*shift(msk, -1, -1) EQ 1) ) 159 ; 160 ;2 land points in descendant diagonal with 2 ocean points in ascendant diagonal. 161 IF testvar(var = key_performance) EQ 2 THEN $ 162 print, 'temps triangule: trouver coindesc', systime(1)-tempdeux 163 ; 164 ENDIF 165 ; 166 if n_elements(pts_downward) EQ 1 then BEGIN 167 tempdeux = systime(1) ; For key_performance =2 168 ; 169 triang = definetri(nx, ny) 170 ; 171 IF testvar(var = key_performance) EQ 2 THEN $ 172 print, 'temps triangule: definetri', systime(1)-tempdeux 173 coinmont = -1 174 coindesc = -1 175 ENDIF ELSE BEGIN 176 tempdeux = systime(1) ; For key_performance =2 177 pts_downward = pts_downward[1:n_elements(pts_downward)-1] 178 pts_downward = pts_downward[uniq(pts_downward, sort(pts_downward))] 179 ; None rectangle can have an element of the last column or of the 180 ; last line as left bottom corner. 181 ; so we have to remove these points if they has been selected in pts_downward. 182 derniere_colonne = (lindgen(ny)+1)*nx-1 183 derniere_ligne = lindgen(nx)+(ny-1)*nx 184 pts_downward =different(pts_downward,derniere_colonne ) 185 pts_downward =different(pts_downward,derniere_ligne ) 186 if (NOT keyword_set(basic)) OR keyword_set(coinmonte) OR keyword_set(coindescend) then begin 187 if coinmont[0] NE -1 then begin 191 188 coinmont =different(coinmont,derniere_colonne ) 192 189 coinmont =different(coinmont,derniere_ligne ) 193 194 190 endif 191 if coindesc[0] NE -1 then begin 195 192 coindesc =different(coindesc,derniere_colonne ) 196 193 coindesc =different(coindesc,derniere_ligne ) 197 endif 198 ENDIF ELSE BEGIN 199 coinmont = -1 200 coindesc = -1 201 ENDELSE 202 IF testvar(var = key_performance) EQ 2 THEN $ 203 print, 'temps triangule: menage ds pts_downward coinmont et coindesc', systime(1)-tempdeux 204 ; 205 tempdeux = systime(1) ; pour key_performance =2 206 if pts_downward[0] EQ -1 then triang = definetri(nx, ny) $ 207 ELSE triang = definetri(nx, ny, pts_downward) 208 IF testvar(var = key_performance) EQ 2 THEN $ 209 print, 'temps triangule: definetri', systime(1)-tempdeux 210 ENDELSE 211 ;------------------------------------------------------------ 212 ; on vire les triangles qui ne contiennent que des points terre 213 ;------------------------------------------------------------ 214 ; 215 ; tres bonne idee qui ne marche pas encore a 200% avec IDL 5.2 216 ; ca devrait aller mieux dans les prochaines versions d''IDL... 217 ; 218 if (NOT keyword_set(basic)) AND (NOT keyword_set(keep_cont)) then begin 219 tempdeux = systime(1) ; pour key_performance =2 220 ; on enleve les rectangles qui sont entierement dans la terre 221 recdsterre = where((1-msk)*(1-shift(msk, -1, 0))*(1-shift(msk, 0, -1))*(1-shift(msk, -1, -1)) EQ 1) 222 IF testvar(var = key_performance) EQ 2 THEN $ 223 print, 'temps triangule: tous les recdsterre', systime(1)-tempdeux 224 225 ; en attendant une version qui marche parfaitement, on est contraint 226 ; de faire un nouveau tri: 227 ; il ne faut pas enlever les rectangles qui n''ont qu''un sommet en 228 ; commun. 194 endif 195 ENDIF ELSE BEGIN 196 coinmont = -1 197 coindesc = -1 198 ENDELSE 199 IF testvar(var = key_performance) EQ 2 THEN $ 200 print, 'temps triangule: menage ds pts_downward coinmont et coindesc', systime(1)-tempdeux 201 ; 202 tempdeux = systime(1) ; For key_performance =2 203 if pts_downward[0] EQ -1 then triang = definetri(nx, ny) $ 204 ELSE triang = definetri(nx, ny, pts_downward) 205 IF testvar(var = key_performance) EQ 2 THEN $ 206 print, 'temps triangule: definetri', systime(1)-tempdeux 207 ENDELSE 208 ;------------------------------------------------------------ 209 ; We delete land points which only contain land points. 210 ;------------------------------------------------------------ 211 ; 212 ; 213 if (NOT keyword_set(basic)) AND (NOT keyword_set(keep_cont)) then begin 214 tempdeux = systime(1) ; For key_performance =2 215 ; We delete rectangles which are entirely in the land. 216 recdsterre = where((1-msk)*(1-shift(msk, -1, 0))*(1-shift(msk, 0, -1))*(1-shift(msk, -1, -1)) EQ 1) 217 IF testvar(var = key_performance) EQ 2 THEN $ 218 print, 'temps triangule: tous les recdsterre', systime(1)-tempdeux 219 220 ; We do an other sort : 221 ; We have to do not remove rectangles which only have one common summit. 229 222 ; t1 = systime(1) 230 231 232 233 234 tempdeux = systime(1) ; pour key_performance =2235 236 ;if NOT keyword_set(basic) then begin237 vire1 = 0238 vire2 = 0239 while (vire1[0] NE -1 OR vire2[0] NE -1) ne 0 do begin240 ; vire sont les rectangles qu''il faut retirer de recsterre (en fait241 ; qu''il faut garder bien qu''ils soient entirement dans la terre)242 vire1 = where( (indice*shift(indice, -1, -1) $243 *(1-shift(indice, 0, -1))*(1-shift(indice, -1, 0))*trimask) EQ 1)244 if vire1[0] NE -1 THEN BEGIN245 indice[vire1] = 0223 indice = intarr(nx, ny) 224 trimask = intarr(nx, ny) 225 trimask[0:nx-2, 0:ny-2] = 1 226 IF recdsterre[0] NE -1 then BEGIN 227 tempdeux = systime(1) ; For key_performance =2 228 indice[recdsterre] = 1 229 if NOT keyword_set(basic) then begin 230 vire1 = 0 231 vire2 = 0 232 while (vire1[0] NE -1 OR vire2[0] NE -1) ne 0 do begin 233 ; Delete rectangles we have to remove from recsterre (in fact those we have 234 ; to keep although they ar eentirely in the land). 235 vire1 = where( (indice*shift(indice, -1, -1) $ 236 *(1-shift(indice, 0, -1))*(1-shift(indice, -1, 0))*trimask) EQ 1) 237 if vire1[0] NE -1 THEN BEGIN 238 indice[vire1] = 0 246 239 ; indice[vire1+nx+1] = 0 247 endif248 249 vire2 = where( ((1-indice)*(1-shift(indice, -1, -1)) $250 *shift(indice, 0, -1)*shift(indice, -1, 0)*trimask) EQ 1)251 if vire2[0] NE -1 THEN BEGIN252 indice[vire2+1] = 0240 endif 241 242 vire2 = where( ((1-indice)*(1-shift(indice, -1, -1)) $ 243 *shift(indice, 0, -1)*shift(indice, -1, 0)*trimask) EQ 1) 244 if vire2[0] NE -1 THEN BEGIN 245 indice[vire2+1] = 0 253 246 ; indice[vire2+nx] = 0 254 endif255 endwhile256 IF testvar(var = key_performance) EQ 2 THEN $257 print, 'temps triangule: trier les recdsterre', systime(1)-tempdeux258 ;endif259 indice[*, ny-1] = 1 ; la deriere colonne te la derniere ligne260 indice[nx-1, *] = 1 ; ne peuvent definir derectangle.261 ; 262 tempdeux = systime(1) ; pour key_performance =2263 264 ; on recupere les numeros des triangles que l'' on va garder265 266 267 247 endif 248 endwhile 249 IF testvar(var = key_performance) EQ 2 THEN $ 250 print, 'temps triangule: trier les recdsterre', systime(1)-tempdeux 251 endif 252 indice[*, ny-1] = 1 ; The last column and the last line 253 indice[nx-1, *] = 1 ; can not define any rectangle. 254 ; 255 tempdeux = systime(1) ; For key_performance =2 256 recgarde = where(indice EQ 0) 257 ; We recuperate numbers of triangles we will keep. 258 trigarde = 2*[recgarde-recgarde/nx] 259 trigarde = transpose(temporary(trigarde)) 260 trigarde = [trigarde, trigarde+1] 268 261 ; 269 270 262 triang = triang[*, temporary(trigarde[*])] 263 IF testvar(var = key_performance) EQ 2 THEN $ 271 264 print, 'temps triangule: virer les triangle de la liste', systime(1)-tempdeux 272 273 265 endif 266 endif 274 267 ; print, 'temps tri triangles', systime(1)-t1 275 268 ;------------------------------------------------------------ 276 ; quand key_periodic eq 1, triang est une liste d''indice d'un277 ; tableau qui a une colonne de trop.278 ; il faut ramener ca a la matrice initiale en mettant les indivces de279 ; la derniere colonne egaux a ceux de la derniere colonne...280 ;------------------------------------------------------------ 281 tempdeux = systime(1) ; pour key_performance =2282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 ;------------------------------------------------------------ 314 315 316 ;------------------------------------------------------------ 317 269 ; When key_periodic equal 1, triang is a list of indexes's array which 270 ; have a surplus column. 271 ; We have to put it back to the initial matrix by putting indexes of 272 ; the last column equal to these of the last column... 273 ;------------------------------------------------------------ 274 tempdeux = systime(1) ; For key_performance =2 275 if keyword_set(key_periodic)*(nx-1 EQ jpi) $ 276 AND NOT keyword_set(basic) then BEGIN 277 indicey = triang/nx 278 indicex = triang-indicey*nx 279 nx = nx-1 280 liste = where(indicex EQ nx) 281 if liste[0] NE -1 then indicex[liste] = 0 282 triang = indicex+nx*indicey 283 nx = nx+1 284 if coinmont[0] NE -1 then begin 285 indicey = coinmont/nx 286 indicex = coinmont-indicey*nx 287 nx = nx-1 288 liste = where(indicex EQ nx) 289 if liste[0] NE -1 THEN indicex[liste] = 0 290 coinmont = indicex+nx*indicey 291 nx = nx+1 292 endif 293 if coindesc[0] NE -1 then begin 294 indicey = coindesc/nx 295 indicex = coindesc-indicey*nx 296 nx = nx-1 297 liste = where(indicex EQ nx) 298 if liste[0] NE -1 THEN indicex[liste] = 0 299 coindesc = indicex+nx*indicey 300 nx = nx+1 301 endif 302 endif 303 IF testvar(var = key_performance) EQ 2 THEN $ 304 print, 'temps triangule: finitions', systime(1)-tempdeux 305 306 ;------------------------------------------------------------ 307 if keyword_set(coinmonte) THEN coinmonte = coinmont ELSE twin_corners_up = coinmont 308 if keyword_set(coindescend) THEN coindescend = coindesc ELSE twin_corners_dn = coindesc 309 ;------------------------------------------------------------ 310 IF NOT keyword_set(key_forgetold) THEN BEGIN 318 311 @updateold 319 320 321 322 323 312 ENDIF 313 314 IF keyword_set(key_performance) THEN print, 'temps triangule', systime(1)-tempsun 315 316 return, triang 324 317 325 318 END
Note: See TracChangeset
for help on using the changeset viewer.