[85] | 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 |
---|