Function:ds2ah

From S2PLOT

Jump to: navigation, search

ds2ah

Add a handle to allow interactive picking of objects

Prototype

void ds2ah(XYZ iP, float size, COLOUR icol, COLOUR ihilite, int iid, int iselected);

Description

Add a handle to object at location iP. The handle size is set by size, with colour icol when the handle is not selected and ihilite when it is selected. iid is the id of the current handle and iselected gives its selection status.

To use handles, press Shift-s (show handles) and Shift-c (show cross-hairs). Note that selecting handles in a stereoscopic environment requires you to click on the point between the left and right eye views.

See Also

ds2ahx Add a handle with a specified texture.
cs2shcb Set the handle callback function for when a handle is (de)selected
cs2th Toggle the state of a named (dynamic) handle
struct_COLOUR Data structure for (r,g,b) colour indices.
struct_XYZ Data structure for (x,y,z) coordinates.


Code Example

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

#define N 100                   /* Number of points */

XYZ xyz[N];                     /* Global variable: positions */
COLOUR col[N];                  /* Colour of the point */
int sel[N];                     /* Global varibale: selected data */

void pick(int *id)
/* Callback when an item is clicked */
{
   sel[*id] = (sel[*id]+1)%2;                   /* Toggle the selection */
   cs2th(*id);                         		/* Update handle list */
}

void cb(double *t, int *kc)
{
   COLOUR hilite = { 1.0, 1.0, 1.0 };           /* Highlight colour */
   float hsize = 0.02;                          /* Size of handle */
   int i;                                       /* Loop variable */

   if ((*kc%2) == 0) {
      for (i=0;i<N;i++) {
         ns2vthpoint(xyz[i], col[i], 3);                /* Draw thick point */
         ds2ah(xyz[i], hsize, col[i], hilite, i, sel[i]);
                                                /* Draw handles */
      }
   } else {
      for (i=0;i<N;i++) {                       /* Only show selected */
         if (sel[i]) {
             ns2vthpoint(xyz[i], col[i], 3);            /* Draw thick point */
             ds2ah(xyz[i], hsize, col[i], hilite, i, sel[i]);
                                                /* Draw handles */
         }
      }
   }
}

int main(int argc, char *argv[])
{
   int i;                                       /* Loop varibale */
   float x, y, z;                               /* Random data */

   srand48((long)time(NULL));                   /* Seed random numbers */

   fprintf(stderr,"Shift-s to toggle handles\nShift-c to toggle crosshair\n");
   fprintf(stderr,"Right mouse select\nSpacebar toggle show all/show sel\n");
   s2opend("/?",argc, argv);                    /* Open the display */
   s2swin(-1.,1., -1.,1., -1.,1.);              /* Set the window coordinates */
   s2box("BCDET",0,0,"BCDET",0,0,"BCDET",0,0);  /* Draw coordinate box */

   for (i=0;i<N;i++) {                          /* Set-up globals */
      xyz[i].x = drand48()*2.0 - 1.0;           /* Random position */
      xyz[i].y = drand48()*2.0 - 1.0;
      xyz[i].z = drand48()*2.0 - 1.0;
      col[i].r = drand48();                     /* Random colour */
      col[i].g = drand48();
      col[i].b = drand48();
      sel[i]   = 0;                             /* Not currently selected */
   }

   cs2scb(&cb);                                  /* Install dynamic callback */
   cs2shcb(&pick);                               /* Install handle callback */

   s2slw(2);                                    /* Set line width */
   for (i=0;i<N;i++) {          /* Non-selectable random data points */
      x = drand48()*2.0 - 1.0;
      y = drand48()*2.0 - 1.0;
      z = drand48()*2.0 - 1.0;
      s2sci(15*drand48() + 1);                  /* Random colour */
      s2pt1(x,y,z,1);
   }

   s2show(1);                                   /* Open the s2plot window */

   return 1;
}


Back to S2PLOT function list.


Personal tools