comp.lang.idl-pvwave archive
Messages from Usenet group comp.lang.idl-pvwave, compiled by Paulo Penteado

Home » Public Forums » archive » Re: vector plots on maps
Show: Today's Messages :: Show Polls :: Message Navigator
E-mail to friend 
Return to the default flat view Create a new topic Submit Reply
Re: vector plots on maps [message #10911] Thu, 05 February 1998 00:00 Go to previous message
Theo Brauers is currently offline  Theo Brauers
Messages: 58
Registered: November 1997
Member
Hi Mirko.
I had the same problem a few months ago. I solved it by
modifying the partvelvec routine written by Joop Schaye
(jschaye@astro.rug.nl). see attached file.
Theo


mirko_vukovic@notes.mrc.sony.com wrote:
>
> hello,
>
> is there a routine by which I can overplot a vector field on a map?
>
> velovect cannot do the job.
>
> tia,
>
> mirko vukovic
>
> -------------------==== Posted via Deja News ====-----------------------
> http://www.dejanews.com/ Search, Read, Post to Usenet
;+
; NAME:
; partvelvec
;
; PURPOSE:
; This procedure plots the velocity vectors of particles (at the
; positions of the particles).
;
; CATEGORY:
; Plotting, Two-dimensional.
;
; CALLING SEQUENCE:
; PARTVELVEC, VELX, VELY, POSX, POSY [, X, Y]
;
; INPUTS:
; VELX: An array of any dimension, containing the x-components
; of the particle velocities.
; VELY: An array of the same dimension as velx, containing the
; y-components of the particle velocities.
; POSX: An array of the same dimension as velx, containing the
; x-components of the particle positions.
; POSY: An array of the same dimension as velx, containing the
; y-components of the particle positions.
;
; OPTIONAL INPUTS:
; X: Optional abcissae values. X must be a vector.
; Y: Optional ordinate values. Y must be a vector. If only X
; is specified, then Y is taken equal to be equal to X.
;
; OPTIONAL INPUT KEYWORD PARAMETERS:
; FRACTION: The fraction of the vectors to plot. They are
; taken at random from the complete sample. Default is
; FRACTION = 1.0, use all vectors
;
; LENGTH: The maximum vectorlength relative to the plot data
; window. Default = 0.08
;
; COLOR: The color for the vectors, axes and titles.
; Default=!P.COLOR
;
; OVER: Plot over the previous plot
;
; Plot All other keywords available to PLOT are also used
; Keywords: by this procedure.
;
; OUTPUTS:
; This procedure plots the velocity vectors (VELX,VELY) at the
; positions of the particles, (POSX,POSY). If X and Y are not
; specified, then the size of the plot is such that all vectors
; just fit within in the plot data window.
;
; SIDE EFFECTS:
; Plotting on the current device is performed.
;
; EXAMPLE:
; Generate some particle positions and velocities.
;
; POSX=RANDOMU(seed,200)
; POSY=RANDOMU(seed,200)
; VELX=RANDOMU(seed,200)-0.5
; VELY=RANDOMU(seed,200)-0.5
;
; Plot the particle velocities.
;
; PARTVELVEC, VELX, VELY, POSX, POSY
;
; MODIFICATION HISTORY:
; Written by: Joop Schaye (jschaye@astro.rug.nl), Sep 1996.
; Modified: Theo Brauers (th.brauers@fz-juelich.de) Oct. 1997
; use with maps, incl. debug
;-

PRO partvelvec,velx,vely,posx,posy,x,y, OVER=over, $
FRACTION=fraction,LENGTH=length,COLOR=color,_EXTRA=extra

debug, '1.10 T.B. 1997-OCT-20'

;---------------------------------------------
; Various settings, modify these to customize
;---------------------------------------------

c={customize, $
length: 0.08, $ ; Maximum vector length relative to plot region. (*)
lengtharrow: 0.3, $ ; Length of arrowhead legs relative to vectorlength.
angle: 22.5 } ; 1/2 times the angle between the arrowhead legs.

; (*) Not used if keyword LENGTH is present


;---------------------
; Some error handling
;---------------------

on_error,2 ; Return to caller if an error occurs.

nparams=n_params()
IF nparams NE 4 THEN BEGIN
IF (nparams NE 5 AND nparams NE 6) THEN BEGIN
message,'Wrong number of parameters!',/continue
message,'Syntax: PARTVELVEC, VELX, VELY, POSX, POSY [, X, Y]', $
/noname,/noprefix
ENDIF
IF nparams EQ 5 THEN y=x
sizex=size(x)
sizey=size(y)
IF (sizex(0) NE 1 OR sizey(0) NE 1) THEN $
message,'X and Y must be vectors!'
ENDIF

sizevelx=size(velx)
sizevely=size(vely)
sizeposx=size(posx)
sizeposy=size(posy)

IF (total(sizevelx(0:sizevelx(0))-sizevely(0:sizevelx(0))) NE 0 $
OR total(sizevelx(0:sizevelx(0))-sizeposx(0:sizevelx(0))) NE 0 $
OR total(sizevelx(0:sizevelx(0))-sizeposy(0:sizevelx(0))) NE 0) THEN $
message,'All arguments must have the same dimension and size!'

IF n_elements(fraction) GT 0 THEN $
IF (fraction LT 0.0 OR fraction GT 1.0) THEN $
message,'Fraction has to be between 0.0 and 1.0.'


;--------------
; Prepare plot
;--------------

nvecs=n_elements(velx) ; Number of particles.
vel=sqrt(velx^2+vely^2) ; Total velocity.
maxvel=max(vel) ; Maximum velocity.

; Compute maximum length of vectors.
IF n_elements(length) LE 0 THEN length=c.length
minposx=min(posx)
maxposx=max(posx)
minposy=min(posy)
maxposy=max(posy)
length=length*((maxposx-minposx) > (maxposy-minposy))

; Convert velocities.
vx=length*velx/maxvel
vy=length*vely/maxvel
vel=length*temporary(vel)/maxvel

; Make sure no vectors extend beyond the plot data window.
x1=posx+vx ; End of vector.
y1=posy+vy
IF nparams EQ 4 THEN BEGIN
minposx=min(x1)<minposx
maxposx=max(x1)>maxposx
minposy=min(y1)<minposy
maxposy=max(y1)>maxposy
ENDIF

angle=c.angle*!dtor ; Convert from degrees to radians.
sinangle=sin(angle) ; Need these.
cosangle=cos(angle)


;-----------
; Plot axes
;-----------

IF n_elements(color) EQ 0 THEN color=!p.color

IF n_elements(over) EQ 0 THEN BEGIN
IF nparams EQ 4 THEN $
plot,[minposx,maxposx],[minposy,maxposy], $
/nodata,/xstyle,/ystyle,COLOR=color,_EXTRA=extra $
ELSE plot,x,y,/nodata,/xstyle,/ystyle,COLOR=color,_EXTRA=extra
ENDIF

;--------------
; Plot vectors
;--------------

IF n_elements(fraction) GT 0 THEN BEGIN
IF fraction EQ 1.0 THEN GOTO,plotall
nrgood=long(fraction*nvecs) ; # of vectors to plot.
IF nrgood EQ 0 THEN return
; Compute indices of vectors to plot. I use two lines to get more
; random "random numbers".
good=long(randomu(seed,nrgood+1)*(nvecs-1.0))
good=good(1:*)
vx=temporary(vx(good))
vy=temporary(vy(good))
px=posx(good) ; Can't use temporary if we wan't to keep the data.
py=posy(good)
x1=temporary(x1(good))
y1=temporary(y1(good))
nvecs=nrgood
ENDIF ELSE BEGIN
plotall:
px=posx
py=posy
ENDELSE

FOR i=0l,nvecs-1l DO BEGIN ; Loop over particles.
; Note that we cannot put the next three lines outside the loop,
; because we want the arrow size to be relative to the vector length.
r=c.lengtharrow*vel(i) ; Length of arrow head.
rsin=r*sinangle
rcos=r*cosangle
; Draw basis, arrow leg, same arrow leg, other arrow leg.
; One arrow leg is drawn twice, because we need to return to the end
; of the vector to draw the other leg.
plots,[px(i),x1(i),x1(i)-(vx(i)*rcos+vy(i)*rsin)/vel(i), $
x1(i),x1(i)-(vx(i)*rcos-vy(i)*rsin)/vel(i)], $
[py(i),y1(i),y1(i)-(vy(i)*rcos-vx(i)*rsin)/vel(i), $
y1(i),y1(i)-(vy(i)*rcos+vx(i)*rsin)/vel(i)],COLOR=color
ENDFOR

END ; End of procedure PARTVELVEC.
[Message index]
 
Read Message
Read Message
Read Message
Read Message
Previous Topic: transforming an array where some values can't
Next Topic: Re: Beginner fails miserabley at first hurdle 0.05 0.05

-=] Back to Top [=-
[ Syndicate this forum (XML) ] [ RSS ] [ PDF ]

Current Time: Sat Oct 11 21:39:33 PDT 2025

Total time taken to generate the page: 1.84240 seconds