1 | ; vector.pro |
---|
2 | ; vector plotting routine |
---|
3 | ; see http://cgam.nerc.ac.uk/graphics/idl.php for more details |
---|
4 | |
---|
5 | ; Calling procedure: |
---|
6 | ; VECTOR, U, V, X, Y |
---|
7 | ; U and V are the vector components as two dimensional arrays. |
---|
8 | ; X and Y are the vectors locations as one dimensional arrays. |
---|
9 | ; |
---|
10 | ; Optional parameters: |
---|
11 | ; LENGTH: Length of the vector, default=1 which is 300 pixels. |
---|
12 | ; OVERPLOT: Set this to overplot the current graphics plot. |
---|
13 | ; STRIDE: Pick every nth vector for plotting. |
---|
14 | ; TYPE: Type of arrow head. 0-4, default=0 |
---|
15 | ; ANGLE: Angle of vector head in degrees, default=22.5. |
---|
16 | ; HEAD_LEN: Length of the arrow head relative to shaft, default=0.3 |
---|
17 | ; ALIGN: Alignment of arrow. Default is 0.5, range=0.0 to 1.0. |
---|
18 | ; REF_MAG: Arrow magnitude. |
---|
19 | ; REF_POS: Position for reference vector in normalised coordinates [x,y]. |
---|
20 | ; REF_TEXT: Text to place to the left of the reference vector. |
---|
21 | ; COLOR: Color index of vectors |
---|
22 | |
---|
23 | PRO VECTOR, u,v,x,y, LENGTH = length,$ |
---|
24 | Color=color, STRIDE=stride, ALIGN=align, $ |
---|
25 | REF_MAG=ref_mag, TYPE=type, ANGLE=angle, HEAD_LEN=head_len,$ |
---|
26 | REF_POS=ref_pos, REF_TEXT=ref_text, OVERPLOT=overplot, _EXTRA=extra |
---|
27 | |
---|
28 | ;Check mapping is cylindrical or not set - reject if otherwise. |
---|
29 | IF ((!MAP.PROJECTION NE 0) AND (!MAP.PROJECTION NE 8)) THEN BEGIN |
---|
30 | PRINT, 'Mapping must be cylindrical or unset to use the vector routine' |
---|
31 | RETURN |
---|
32 | ENDIF |
---|
33 | |
---|
34 | ;Basic checks of the input data |
---|
35 | a=SIZE(u) |
---|
36 | b=SIZE(v) |
---|
37 | c=SIZE(x) |
---|
38 | d=SIZE(y) |
---|
39 | IF ((a[0] NE 2) OR (b[0] NE 2)) THEN BEGIN |
---|
40 | PRINT, 'u and v must be two dimensional' |
---|
41 | RETURN |
---|
42 | ENDIF |
---|
43 | IF (TOTAL(ABS(b[0:2]-a[0:2])) NE 0) THEN BEGIN |
---|
44 | PRINT, 'u and v must have the same size' |
---|
45 | RETURN |
---|
46 | ENDIF |
---|
47 | IF ((c[0] NE 1) AND (d[0] NE 1)) THEN BEGIN |
---|
48 | PRINT, 'x and y must be one dimensional' |
---|
49 | RETURN |
---|
50 | ENDIF |
---|
51 | IF ((c[1]-a[1]) NE 0) THEN BEGIN |
---|
52 | PRINT, 'u and x have mismatched sizes' |
---|
53 | RETURN |
---|
54 | ENDIF |
---|
55 | IF ((d[1]-b[2]) NE 0) THEN BEGIN |
---|
56 | PRINT, 'v and y have mismatched sizes' |
---|
57 | RETURN |
---|
58 | ENDIF |
---|
59 | |
---|
60 | ;Initialise parameters if undefined |
---|
61 | IF (N_ELEMENTS(STRIDE) EQ 0) THEN stride=0 |
---|
62 | IF N_ELEMENTS(LENGTH) EQ 0 THEN length=1.0 |
---|
63 | IF N_ELEMENTS(COLOR) EQ 0 THEN color = !P.COLOR |
---|
64 | IF (N_ELEMENTS(ANGLE) EQ 0) THEN angle=22.5 |
---|
65 | IF (N_ELEMENTS(HEAD_LEN) EQ 0) THEN head_len=0.3 |
---|
66 | IF (N_ELEMENTS(TYPE) EQ 0) THEN TYPE=0 |
---|
67 | IF (N_ELEMENTS(ALIGN) EQ 0) THEN align=0.5 |
---|
68 | IF (N_ELEMENTS(REF_TEXT) EQ 0) THEN ref_text=' ' |
---|
69 | IF (N_ELEMENTS(REF_MAG) EQ 0) THEN BEGIN |
---|
70 | maxmag=MAX(ABS(SQRT(u^2.+v^2.))) |
---|
71 | ENDIF ELSE BEGIN |
---|
72 | maxmag=ref_mag |
---|
73 | ENDELSE |
---|
74 | |
---|
75 | ;Setup the plot area if undefined |
---|
76 | IF (NOT KEYWORD_SET(overplot)) THEN BEGIN |
---|
77 | xs=x[0]-(x(1)-x(0)) |
---|
78 | xf=x[N_ELEMENTS(x)-1]+(x(1)-x(0)) |
---|
79 | ys=y[0]-(y(1)-y(0)) |
---|
80 | yf=y[N_ELEMENTS(y)-1]+(y(1)-y(0)) |
---|
81 | PLOT,[xs,xf],[ys,yf], XSTYLE=1, YSTYLE=1, /NODATA,$ |
---|
82 | COLOR=color, _EXTRA = extra |
---|
83 | ENDIF |
---|
84 | |
---|
85 | ;Do stride data reduction if needed |
---|
86 | IF (stride GT 1) THEN BEGIN |
---|
87 | mypts=FLTARR(a[1], a[2]) |
---|
88 | mypts[*,*]=0.0 |
---|
89 | FOR iy=0,a[2]-1,stride DO BEGIN |
---|
90 | FOR ix=0,a[1]-1,stride DO BEGIN |
---|
91 | IF ( ((ix/stride) EQ FIX(ix/stride)) AND $ |
---|
92 | ((iy/stride) EQ FIX(iy/stride)) ) THEN mypts[ix,iy]=1.0 |
---|
93 | ENDFOR |
---|
94 | ENDFOR |
---|
95 | pts=WHERE(mypts LT 1.0) |
---|
96 | u[pts]=0.0 |
---|
97 | v[pts]=0.0 |
---|
98 | ENDIF |
---|
99 | |
---|
100 | ;Main vector plotting loop |
---|
101 | FOR ix=0, N_ELEMENTS(x)-1 DO BEGIN |
---|
102 | FOR iy=0, N_ELEMENTS(y)-1 DO BEGIN |
---|
103 | PLOT_VECTOR, u(ix,iy), v(ix,iy), x(ix), y(iy), type=type, $ |
---|
104 | angle=angle, head_len=head_len,$ |
---|
105 | maxmag=maxmag, align=align, length=length,$ |
---|
106 | color=color, cstyle=0 |
---|
107 | ENDFOR |
---|
108 | ENDFOR |
---|
109 | |
---|
110 | ;Plot a reference vector if requested |
---|
111 | IF (N_ELEMENTS(REF_POS) NE 0) THEN BEGIN |
---|
112 | PLOT_VECTOR, maxmag, 0.0, ref_pos[0], ref_pos[1], type=type, $ |
---|
113 | angle=angle, ref_text=ref_text, head_len=head_len,$ |
---|
114 | maxmag=maxmag, align=align, length=length,$ |
---|
115 | color=color, cstyle=1 |
---|
116 | ENDIF |
---|
117 | |
---|
118 | END |
---|
119 | |
---|