Function:cs2ah
From S2PLOT
cs2ah
Add a handle to allow interactive picking of objects
Prototype
void cs2ah(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
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 */
cs2ah(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 */
cs2ah(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.