1 | PRO plot_vector, u, v, x, y, type=type, angle=angle, head_len=head_len,$ |
---|
2 | maxmag=maxmag, align=align, length=length,$ |
---|
3 | ref_text=ref_text, color=color, cstyle=cstyle |
---|
4 | ;Procedure to calculate and plot a vector |
---|
5 | |
---|
6 | mylen=300.0 ; length of default arrow in pixels |
---|
7 | rev=1.0 |
---|
8 | x0=0.0 |
---|
9 | y0=0.0 |
---|
10 | x1=u/maxmag*mylen*length |
---|
11 | y1=v/maxmag*mylen*length |
---|
12 | dx=x1-x0 |
---|
13 | IF (dx LT 0.0) THEN rev=-1.0 |
---|
14 | dy=y1-y0 |
---|
15 | r=SQRT(dx^2+dy^2) |
---|
16 | theta=ATAN(dy/dx) |
---|
17 | phi=angle*!dtor |
---|
18 | rfrac=head_len |
---|
19 | x2=x1-r*rfrac*rev*COS(theta-phi) |
---|
20 | y2=y1-r*rfrac*rev*SIN(theta-phi) |
---|
21 | x3=x1-r*rfrac*rev*COS(theta+phi) |
---|
22 | y3=y1-r*rfrac*rev*SIN(theta+phi) |
---|
23 | x4=x1-rfrac/2*r*rev*COS(theta) |
---|
24 | y4=y1-rfrac/2*r*rev*SIN(theta) |
---|
25 | ;Calculate intersection of vector shaft and head points either |
---|
26 | ;side of the shaft - see |
---|
27 | ;http://astronomy.swin.edu.au/~pbourke/geometry/lineline2d |
---|
28 | ;for more details |
---|
29 | ua=((x3-x2)*(y0-y2)-(y3-y2)*(x0-x2))/$ |
---|
30 | ((y3-y2)*(x1-x0)-(x3-x2)*(y1-y0)) |
---|
31 | x5=x0+ua*(x1-x0) |
---|
32 | y5=y0+ua*(y1-y0) |
---|
33 | |
---|
34 | ;Plot vectors in data space - cstyle=0 |
---|
35 | ;Position in device coordinates and then convert to data coordinates |
---|
36 | IF (cstyle EQ 0) THEN BEGIN |
---|
37 | pt1=CONVERT_COORD(x,y, /DATA, /TO_DEVICE) |
---|
38 | xpts=[x0,x1,x2,x3,x4,x5]+pt1[0]-align*dx |
---|
39 | ypts=[y0,y1,y2,y3,y4,y5]+pt1[1]-align*dy |
---|
40 | pts=CONVERT_COORD(xpts,ypts, /DEVICE, /TO_DATA) |
---|
41 | xpts=pts[0,*] |
---|
42 | ypts=pts[1,*] |
---|
43 | x0=xpts[0] |
---|
44 | x1=xpts[1] |
---|
45 | x2=xpts[2] |
---|
46 | x3=xpts[3] |
---|
47 | x4=xpts[4] |
---|
48 | x5=xpts[5] |
---|
49 | y0=ypts[0] |
---|
50 | y1=ypts[1] |
---|
51 | y2=ypts[2] |
---|
52 | y3=ypts[3] |
---|
53 | y4=ypts[4] |
---|
54 | y5=ypts[5] |
---|
55 | |
---|
56 | |
---|
57 | ; Plot the vectors omiting any vectors with NaNs |
---|
58 | z=[xpts, ypts] |
---|
59 | IF (TOTAL(FINITE(z)) EQ 12) THEN BEGIN |
---|
60 | IF (N_ELEMENTS(TYPE) EQ 0) THEN TYPE=0 |
---|
61 | IF (TYPE EQ 0) THEN BEGIN |
---|
62 | PLOTS, [x0,x1,x2,x1,x3], [y0,y1,y2,y1,y3], COLOR=color |
---|
63 | ENDIF |
---|
64 | IF (TYPE EQ 1) THEN BEGIN |
---|
65 | PLOTS, [x0,x5,x3,x1,x2,x5], [y0,y5,y3,y1,y2,y5], COLOR=color |
---|
66 | ENDIF |
---|
67 | IF (TYPE EQ 2) THEN BEGIN |
---|
68 | PLOTS, [x0,x4,x2,x1,x3,x4], [y0,y4,y2,y1,y3,y4], COLOR=color |
---|
69 | ENDIF |
---|
70 | IF (TYPE EQ 3) THEN BEGIN |
---|
71 | PLOTS, [x0,x1], [y0,y1], COLOR=color |
---|
72 | POLYFILL, [x1,x2,x3,x1], [y1,y2,y3,y1], COLOR=color |
---|
73 | ENDIF |
---|
74 | IF (TYPE EQ 4) THEN BEGIN |
---|
75 | PLOTS, [x0,x4], [y0,y4], COLOR=color |
---|
76 | POLYFILL, [x1,x2,x4,x3,x1], [y1,y2,y4,y3,y1], COLOR=color |
---|
77 | ENDIF |
---|
78 | ENDIF |
---|
79 | ENDIF |
---|
80 | |
---|
81 | |
---|
82 | ;Plot reference vector - cstyle=1 |
---|
83 | ;Position in device coordinates and then convert to data coordinates |
---|
84 | IF (cstyle EQ 1) THEN BEGIN |
---|
85 | pt1=CONVERT_COORD(x,y, /NORMAL, /TO_DEVICE) |
---|
86 | xpts=[x0,x1,x2,x3,x4,x5]+pt1[0] |
---|
87 | ypts=[y0,y1,y2,y3,y4,y5]+pt1[1] |
---|
88 | x0=xpts[0] |
---|
89 | x1=xpts[1] |
---|
90 | x2=xpts[2] |
---|
91 | x3=xpts[3] |
---|
92 | x4=xpts[4] |
---|
93 | x5=xpts[5] |
---|
94 | y0=ypts[0] |
---|
95 | y1=ypts[1] |
---|
96 | y2=ypts[2] |
---|
97 | y3=ypts[3] |
---|
98 | y4=ypts[4] |
---|
99 | y5=ypts[5] |
---|
100 | |
---|
101 | ; Plot the vectors omiting any vectors with NaNs |
---|
102 | z=[xpts, ypts] |
---|
103 | IF (TOTAL(FINITE(z)) EQ 12) THEN BEGIN |
---|
104 | IF (N_ELEMENTS(TYPE) EQ 0) THEN TYPE=0 |
---|
105 | IF (TYPE EQ 0) THEN BEGIN |
---|
106 | PLOTS, [x0,x1,x2,x1,x3], [y0,y1,y2,y1,y3], COLOR=color, /DEVICE |
---|
107 | ENDIF |
---|
108 | IF (TYPE EQ 1) THEN BEGIN |
---|
109 | PLOTS, [x0,x5,x3,x1,x2,x5], [y0,y5,y3,y1,y2,y5], COLOR=color, /DEVICE |
---|
110 | ENDIF |
---|
111 | IF (TYPE EQ 2) THEN BEGIN |
---|
112 | PLOTS, [x0,x4,x2,x1,x3,x4], [y0,y4,y2,y1,y3,y4], COLOR=color, /DEVICE |
---|
113 | ENDIF |
---|
114 | IF (TYPE EQ 3) THEN BEGIN |
---|
115 | PLOTS, [x0,x1], [y0,y1], COLOR=color, /DEVICE |
---|
116 | POLYFILL, [x1,x2,x3,x1], [y1,y2,y3,y1], COLOR=color, /DEVICE |
---|
117 | ENDIF |
---|
118 | IF (TYPE EQ 4) THEN BEGIN |
---|
119 | PLOTS, [x0,x4], [y0,y4], COLOR=color, /DEVICE |
---|
120 | POLYFILL, [x1,x2,x4,x3,x1], [y1,y2,y4,y3,y1], COLOR=color, /DEVICE |
---|
121 | ENDIF |
---|
122 | ENDIF |
---|
123 | |
---|
124 | ;Add the reference vector text |
---|
125 | IF (N_ELEMENTS(REF_TEXT) EQ 0) THEN ref_text=' ' |
---|
126 | XYOUTS, x0-100, y0-100, ref_text, ALIGNMENT=1.0, /DEVICE |
---|
127 | ENDIF |
---|
128 | |
---|
129 | END |
---|