[2] | 1 | ;------------------------------------------------------------ |
---|
| 2 | ;------------------------------------------------------------ |
---|
| 3 | ;------------------------------------------------------------ |
---|
| 4 | ;+ |
---|
| 5 | ; NAME: lineintersection |
---|
| 6 | ; |
---|
| 7 | ; PURPOSE: Calcule les coordonnees de l''intersection de 2 droites ou |
---|
| 8 | ; d''une serie de 2 droites |
---|
| 9 | ; |
---|
| 10 | ; CATEGORY:petit truc qui peut etre utile (sans boucles, ca va de soit!) |
---|
| 11 | ; |
---|
| 12 | ; CALLING SEQUENCE: point=lineintersection(abc1, abc2) |
---|
| 13 | ; |
---|
| 14 | ; INPUTS: abc est un tableau de dimensions 3, |
---|
| 15 | ; nbre_de_couple_de_droites, dont chaque ligne contient les 3 |
---|
| 16 | ; parametres a, b, c de l''equation de droite du type ax+by+c=0 |
---|
| 17 | ; |
---|
| 18 | ; KEYWORD PARAMETERS: |
---|
| 19 | ; /FLOAT: pour retourner l''output sous forme de tableau de |
---|
| 20 | ; reel plutot que de vecteur decomplexes (par defaut) |
---|
| 21 | ; |
---|
| 22 | ; OUTPUTS:2 possibilites: |
---|
| 23 | ; 1) par defaut: c''est une vecteur de complexe dont chaque |
---|
| 24 | ; element est les coordonnees du point d''intersection d''un |
---|
| 25 | ; couple de droites. |
---|
| 26 | ; 2) si /FLOAT est active, c'est un tableau de reels de |
---|
| 27 | ; dimensiones 2, nbre_de_couple_de_droites dont chaque |
---|
| 28 | ; ligne est les coordonnees du point d''intersection d''un |
---|
| 29 | ; couple de droites |
---|
| 30 | ; |
---|
| 31 | ; COMMON BLOCKS: |
---|
| 32 | ; |
---|
| 33 | ; SIDE EFFECTS:si les deux droites dont paralleles, on retourne les |
---|
| 34 | ; coordonnes (!values.f_nan,!values.f_nan) |
---|
| 35 | ; |
---|
| 36 | ; RESTRICTIONS:attention a la precision de la machine qui fait que |
---|
| 37 | ; les coordonnees calcules de verifient peut-etre pas exactement les |
---|
| 38 | ; equations du couple de droites. |
---|
| 39 | ; |
---|
| 40 | ; EXAMPLE: |
---|
| 41 | ; IDL> abc1=linearequation(complex(1,2),[3,4]) |
---|
| 42 | ; IDL> abc2=linearequation(complex(1,2),[8,15]) |
---|
| 43 | ; IDL> print, lineintersection(abc1, abc2) |
---|
| 44 | ; ( 1.00000, 2.00000) |
---|
| 45 | ; IDL> print, lineintersection(abc1, abc2,/float) |
---|
| 46 | ; 1.00000 2.00000 |
---|
| 47 | ; |
---|
| 48 | ; MODIFICATION HISTORY:Sebastien Masson (smasson@lodyc.jussieu.fr) |
---|
| 49 | ; 10 juin 2000 |
---|
| 50 | ;- |
---|
| 51 | ;------------------------------------------------------------ |
---|
| 52 | ;------------------------------------------------------------ |
---|
| 53 | ;------------------------------------------------------------ |
---|
| 54 | FUNCTION lineintersection, abc1, abc2, FLOAT = float |
---|
| 55 | ; |
---|
[114] | 56 | ; |
---|
| 57 | compile_opt idl2, strictarrsubs |
---|
| 58 | ; |
---|
[2] | 59 | a1 = float(reform(abc1[0, *])) |
---|
| 60 | b1 = float(reform(abc1[1, *])) |
---|
| 61 | c1 = float(reform(abc1[2, *])) |
---|
| 62 | a2 = float(reform(abc2[0, *])) |
---|
| 63 | b2 = float(reform(abc2[1, *])) |
---|
| 64 | c2 = float(reform(abc2[2, *])) |
---|
| 65 | ; |
---|
| 66 | determinant = a1*b2-a2*b1 |
---|
| 67 | nan = where(determinant EQ 0) |
---|
| 68 | if nan[0] NE -1 THEN determinant = !values.f_nan |
---|
| 69 | ; |
---|
| 70 | x = (b1*c2-c1*b2)/determinant |
---|
| 71 | y = (c1*a2-a1*c2)/determinant |
---|
| 72 | ; |
---|
| 73 | if keyword_set(float) then begin |
---|
| 74 | npts = n_elements(x) |
---|
| 75 | res = [reform(x, 1, npts, /over), reform(y, 1, npts, /over)] |
---|
| 76 | ENDIF ELSE res = complex(x, y) |
---|
| 77 | return, res |
---|
| 78 | end |
---|