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 | ; |
---|
56 | a1 = float(reform(abc1[0, *])) |
---|
57 | b1 = float(reform(abc1[1, *])) |
---|
58 | c1 = float(reform(abc1[2, *])) |
---|
59 | a2 = float(reform(abc2[0, *])) |
---|
60 | b2 = float(reform(abc2[1, *])) |
---|
61 | c2 = float(reform(abc2[2, *])) |
---|
62 | ; |
---|
63 | determinant = a1*b2-a2*b1 |
---|
64 | nan = where(determinant EQ 0) |
---|
65 | if nan[0] NE -1 THEN determinant = !values.f_nan |
---|
66 | ; |
---|
67 | x = (b1*c2-c1*b2)/determinant |
---|
68 | y = (c1*a2-a1*c2)/determinant |
---|
69 | ; |
---|
70 | if keyword_set(float) then begin |
---|
71 | npts = n_elements(x) |
---|
72 | res = [reform(x, 1, npts, /over), reform(y, 1, npts, /over)] |
---|
73 | ENDIF ELSE res = complex(x, y) |
---|
74 | return, res |
---|
75 | end |
---|