Function:s2vect3

From S2PLOT

Jump to: navigation, search

s2vect3

Draw a vector map of a 3D data array, with blanking.

Prototype

void s2vect3(float ***a, float ***b, float ***c, int adim, int bdim, int cdim, int a1, int a2, int b1, int b2, int c1, int c2, 
float scale, int nc, float *tr, float minlength, int colbylength, float minl, float maxl);

Description

Draw a vector map of a 3D data array, with data blanking.

  • a, b and c are 3D arrays indexed by [0..(adim-1)][0..(bdim-1)][0..(cdim-1)] holding the components of the vectors in three orthogonal directions.
  • The slice of data actually plotted is indexed by [a1..a2][b1..b2][c1..c2].
  • Vector lengths are scaled by the value scale. There is no auto-set as per PGPlot's pgvect function.
  • nc controls positioning of the vectors. nc<0 places the head of the vector on the coordinates; nc>0 places the vector base on the coords, and nc == 0 centres the vector on the coords.
  • tr is the transformation matrix which maps indexes into the arrays onto the x, y and z axes of the 3D space. NOTE: this transformation IS NOT APPLIED to the vector components!!! The standard (non-rotated, non-skewed) transformation would have tr[2], tr[3], tr[5], tr[7], tr[9]and tr[10] all zero.
    • x = tr[0] + tr[1] * ia + tr[2] * ib + tr[3] * ic
    • y = tr[4] + tr[5] * ia + tr[6] * ib + tr[7] * ic
    • z = tr[8] + tr[9] * ia + tr[10]* ib + tr[11]* ic
  • Vectors with length (sqrt(a[...]^2 + b[...]^2 + c[...]^2)) less than minlength are not drawn.
  • If colbylength > 0, the the vectors will be coloured by mapping those of length minl or smaller to the start of the current colour index range, and those of length maxl or greater to the end of the current colour index range.


See Also

s2arro Draw an arrow from the point with world-coordinates (x1,y1,z1) to (x2,y2,z2).

PGPLOT Equivalent

PGVECT

Code Example

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include "s2plot.h"

#define NX 10                                   /* Dimensions of arrays */
#define NY 10
#define NZ 10
#define XLIMIT 1.0
#define YLIMIT 1.0
#define ZLIMIT 1.0

int main(int argc, char *argv[])
{
   float ***a, ***b, ***c;                      /* Components of vectors */
   int i, j, k;                                 /* Loop variables */
   float x1 = -XLIMIT, x2 = +XLIMIT,            /* Range of plottable values */
         y1 = -YLIMIT, y2 = +YLIMIT,
         z1 = -ZLIMIT, z2 = +ZLIMIT;
   float minlength = +9E30;                     /* Min and max vector lengths */
   float maxlength = -9E30;
   float tr[12];                                /* Transformation matrix */
   float mindraw, scale;                        /* See below */
   int colbylength, nc;                         /* See below */
   float length;                                /* Length of a vector */

   srand48((long)time(NULL));                   /* Seed random numbers */
   s2opend("/?",argc, argv);                    /* Open the display */
   s2swin(x1,x2, y1,y2, z1,z2);                 /* Set the window coordinates */
   s2box("BCDET",0,0,"BCDET",0,0,"BCDET",0,0);  /* Draw coordinate box */

   a = (float ***)calloc(NX, sizeof(float **));
   b = (float ***)calloc(NX, sizeof(float **));
   c = (float ***)calloc(NX, sizeof(float **));
   for (i=0;i < NX;i++) {
      a[i] = (float **)calloc(NY, sizeof(float **));
      b[i] = (float **)calloc(NY, sizeof(float **));
      c[i] = (float **)calloc(NY, sizeof(float **));
      for (j=0;j < NY;j++) {
         a[i][j] = (float *)calloc(NY, sizeof(float *));
         b[i][j] = (float *)calloc(NY, sizeof(float *));
         c[i][j] = (float *)calloc(NY, sizeof(float *));
         for (k=0;k < NZ;k++) {
             a[i][j][k] = drand48()*2.0 - 1.0;          /* X component */
             b[i][j][k] = drand48()*2.0 - 1.0;          /* Y component */
             c[i][j][k] = drand48()*2.0 - 1.0;          /* Z component */

             length = sqrt(a[i][j][k] * a[i][j][k] +
                           b[i][j][k] * b[i][j][k] +
                           c[i][j][k] * c[i][j][k]);
             maxlength = (length > maxlength) ? length : maxlength;
             minlength = (length < minlength) ? length : minlength;
         }
      }
   }

   tr[0] = x1; tr[1] = (x2-x1)/(float)(NX-1); tr[2] = 0.0; tr[3] = 0.0;
   tr[4] = y1; tr[5] = 0.0; tr[6] = (y2-y1)/(float)(NY-1); tr[7] = 0.0;
   tr[8] = z1; tr[9] = 0.0; tr[10]= 0.0; tr[11] = (z2-z1)/(float)(NZ-1);

   s2icm("rainbow", 1000, 1500);                /* Install a colour map */
   s2scir(1000,1500);                           /* Set the colour range */

   s2slw(2);                                    /* Set the line width */
   s2sch(2);                                    /* Set the size of arrowhead */
   s2sah(1, 30.0, 0.8);                         /* Set the arrowhead type */
   scale = 0.2;                                 /* Size of vectors */
   nc = 0;                                      /* Put vector at coord point */
   colbylength = 1;                             /* Use the colour map */
   mindraw = -1.0;                              /* Draw them all! */

   s2vect3(a,b,c, NX,NY,NZ, 0,NX-1, 0,NY-1, 0,NZ-1,
                scale, nc, tr, colbylength, mindraw, minlength, maxlength);

   s2show(1);
   return 1;
}

Back to S2PLOT function list.


Personal tools