| | 80 | |
| | 81 | |
| | 82 | ;; Vectors? |
| | 83 | IF sState.vec_show THEN BEGIN |
| | 84 | sState.oVols[0]->GetProperty,DATA0=bMag,RGB_TABLE0=pal,/NO_COPY |
| | 85 | |
| | 86 | ;; x,y,z |
| | 87 | u = (*sState.pdata).u & v = (*sState.pdata).v & w = (*sState.pdata).w |
| | 88 | xyztnMkVectors,u,v,w,fVerts,iConn, $ |
| | 89 | SCALE=scale, RANDOM=sState.bRandom, NVECTORS=nvectors,$ |
| | 90 | STEPSIZE=stepsize,BMAG=bMag,Vc=vc,X=x |
| | 91 | sState.oVectors[0]->SetProperty,DATA=fVerts,POLYLINES=iConn |
| | 92 | xyztnMkVectors,u,v,w,fVerts,iConn, $ |
| | 93 | SCALE=scale, RANDOM=sState.bRandom, NVECTORS=nvectors,$ |
| | 94 | STEPSIZE=stepsize,BMAG=bMag,Vc=vc,Y=y |
| | 95 | sState.oVectors[1]->SetProperty,DATA=fVerts,POLYLINES=iConn |
| | 96 | xyztnMkVectors,u,v,w,fVerts,iConn, $ |
| | 97 | SCALE=scale, RANDOM=sState.bRandom, NVECTORS=nvectors,$ |
| | 98 | STEPSIZE=stepsize,BMAG=bMag,Vc=vc,Z=z |
| | 99 | sState.oVectors[2]->SetProperty,DATA=fVerts,POLYLINES=iConn |
| | 100 | ;;; x,y,z, end |
| | 101 | |
| | 102 | sState.oVols[0]->SetProperty,DATA0=bMag,/NO_COPY |
| | 103 | ENDIF |
| | 104 | |
| | 105 | |
| | 271 | |
| | 272 | |
| | 273 | |
| | 274 | PRO xyztnMkVectors, u, v, w, fVerts, iConn, X=x, Y=y, Z=z, SCALE=scale,$ |
| | 275 | RANDOM=random, NVECTORS=nvectors, STEPSIZE=stepsize,$ |
| | 276 | bMAG=bMag, VC=vc |
| | 277 | |
| | 278 | ;; Ensure volumes match in number of elements. |
| | 279 | nSamples = N_ELEMENTS(u) |
| | 280 | IF (nSamples NE N_ELEMENTS(v) OR nSamples NE N_ELEMENTS(w)) THEN BEGIN |
| | 281 | MESSAGE,'Number of elements in u, v, and w must match.' |
| | 282 | RETURN |
| | 283 | ENDIF |
| | 284 | sz = SIZE(u) |
| | 285 | |
| | 286 | ;; Handle keywords, set defaults. |
| | 287 | IF (N_ELEMENTS(scale) EQ 0) THEN scale = 1.0 |
| | 288 | IF (N_ELEMENTS(random) EQ 0) THEN random=0 |
| | 289 | IF (N_ELEMENTS(nvectors) EQ 0) THEN nvectors = 100 |
| | 290 | IF (N_ELEMENTS(stepsize) eq 0) then stepsize = 1 |
| | 291 | IF (N_ELEMENTS(bMag) EQ 0) THEN bMag = BYTSCL(SQRT(u^2+v^2+w^2)) |
| | 292 | |
| | 293 | ;; Get plane information. |
| | 294 | doPlane = 0 |
| | 295 | IF (N_ELEMENTS(x) GT 0) THEN BEGIN |
| | 296 | IF (random EQ 0) THEN BEGIN |
| | 297 | nRow = sz[2] / stepsize |
| | 298 | nCol = sz[3] / stepsize |
| | 299 | ENDIF |
| | 300 | doPlane = 1 |
| | 301 | ENDIF |
| | 302 | IF (N_ELEMENTS(y) GT 0) THEN BEGIN |
| | 303 | IF (doPlane) THEN MESSAGE,'X, Y, and Z keywords are mutually exclusive' |
| | 304 | IF (random EQ 0) THEN BEGIN |
| | 305 | nRow = sz[3] / stepsize |
| | 306 | nCol = sz[1] / stepsize |
| | 307 | ENDIF |
| | 308 | doPlane = 2 |
| | 309 | ENDIF |
| | 310 | IF (N_ELEMENTS(z) GT 0) THEN BEGIN |
| | 311 | IF (doPlane) THEN MESSAGE,'X, Y, and Z keywords are mutually exclusive' |
| | 312 | IF (random EQ 0) THEN BEGIN |
| | 313 | nRow = sz[2] / stepsize |
| | 314 | nCol = sz[1] / stepsize |
| | 315 | ENDIF |
| | 316 | doPlane = 3 |
| | 317 | ENDIF |
| | 318 | IF (doPlane EQ 0) THEN MESSAGE, 'Must specify a plane.' |
| | 319 | |
| | 320 | ;; Grab max, min values in vector volumes. |
| | 321 | maxU = MAX(u, MIN=minU) |
| | 322 | maxV = MAX(v, MIN=minV) |
| | 323 | maxW = MAX(w, MIN=minW) |
| | 324 | |
| | 325 | ;; Compute the magnitude. |
| | 326 | mag = SQRT((maxU-minU)^2 + (maxV-minV)^2 + (maxW-minW)^2) |
| | 327 | fNorm = scale / mag |
| | 328 | |
| | 329 | nV = nRow*nCol |
| | 330 | |
| | 331 | fVerts = FLTARR(3, 2*nV) |
| | 332 | iConn = LONARR(3*nV) |
| | 333 | vc = BYTARR(2*nV) |
| | 334 | |
| | 335 | CASE doPlane OF |
| | 336 | 1: BEGIN ; X=x |
| | 337 | x0 = REPLICATE(x,nV) |
| | 338 | y0 = REFORM((REPLICATE(1,nCol) # (LINDGEN(nRow)*stepsize)),nV) |
| | 339 | z0 = REFORM(((LINDGEN(nCol)*stepsize) # REPLICATE(1,nRow)),nV) |
| | 340 | END |
| | 341 | 2: BEGIN ; Y=y |
| | 342 | y0 = REPLICATE(y,nRow*nCol) |
| | 343 | z0 = REFORM((REPLICATE(1,nCol) # (LINDGEN(nRow)*stepsize)),nV) |
| | 344 | x0 = REFORM(((LINDGEN(nCol)*stepsize) # REPLICATE(1,nRow)),nV) |
| | 345 | END |
| | 346 | 3: BEGIN ; Z=z |
| | 347 | z0 = REPLICATE(z,nRow*nCol) |
| | 348 | y0 = REFORM((REPLICATE(1,nCol) # (LINDGEN(nRow)*stepsize)),nV) |
| | 349 | x0 = REFORM(((LINDGEN(nCol)*stepsize) # REPLICATE(1,nRow)),nV) |
| | 350 | END |
| | 351 | ENDCASE |
| | 352 | |
| | 353 | inds = LINDGEN(nV) |
| | 354 | v0 = transpose([[x0],[y0],[z0]]) |
| | 355 | v1 = transpose([[x0+u[x0,y0,z0]*fNorm], $ |
| | 356 | [y0+v[x0,y0,z0]*fNorm], $ |
| | 357 | [z0+w[x0,y0,z0]*fNorm]]) |
| | 358 | fVerts[*,inds*2] = v0[*,inds] |
| | 359 | fVerts[*,inds*2+1] = v1[*,inds] |
| | 360 | iConn[inds*3] = 2 |
| | 361 | iConn[inds*3+1] = inds*2 |
| | 362 | iConn[inds*3+2] = inds*2+1 |
| | 363 | |
| | 364 | vc[inds*2] = bMag[x0,y0,z0] |
| | 365 | vc[inds*2+1] = bMag[x0,y0,z0] |
| | 366 | END |
| | 367 | |
| | 368 | |
| | 369 | |
| | 370 | |