Function:ns2dis
From S2PLOT
ns2dis
Draw an isosurface object
Prototype
void ns2dis(int isid, int force);
Description
Draw an isosurface object. Set force = 1 to force the surface to be recalculated, e.g. the grid or isosurface level has been changed. Using force = 0 will redisplay previously calculated version of isosurface.
See Also
ns2cis | Create an isosurface object |
ns2cisc | Create an isosurface object with a colour function |
ns2sisl | Change the level of isosurface |
Code Example
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "s2plot.h"
#define CELLS 30
int id2; /* ID for isosurface object - Global */
void colorfn(float *x, float *y, float *z, float *r, float *g, float *b)
/* Isosurface colouring function */
{
*r = 0.2 + 0.5 * (*x) / (float)(CELLS - 1);
*g = 0.0 + 0.8 * (*y) / (float)(CELLS - 1);
*b = 0.6 + 0.2 * (*z) / (float)(CELLS - 1);
}
void cb(double *t, int *kc)
{
static int count = 0; /* Count number of times in */
static float level = 0.0; /* Isosurface level to plot */
int force = 1; /* Force redraw of surface */
if (count == 25) { /* About once per second */
count = 0; /* Reset counter */
level += 0.1; /* Increase isosurface level */
if (level > 1.0) level = 0.0;
ns2sisl(id2, level); /* Set the new level */
} else {
count++; /* Keep counting */
}
ns2dis(id2, force); /* Draw isosurface */
}
int main(int argc, char *argv[])
{
int i, j, k; /* Loop variables */
float x, y, z; /* Dummy variables for grid values */
int nx, ny, nz; /* Number of cells in grid */
float ***grid; /* Grid data */
float tr[12]; /* Transformation matrix */
int resolution; /* Resolution of isosurface */
float level; /* Isosurface level to plot */
float alpha; /* Alpha channel */
char trans; /* Drawing mode for isosurface */
int id1; /* ID for isosurface object */
nx = CELLS; /* Grid dimensions */
ny = CELLS;
nz = CELLS;
/* Create transpose matrix mapping data indices to world coords */
tr[0] = tr[4] = tr[8] = 0.0; /* Offsets */
tr[1] = tr[6] = tr[11] = 1.0; /* Increments */
tr[2] = tr[3] = tr[5] = tr[7] = tr[9] = tr[10] = 0.; /* Cross terms */
s2opend("/?",argc, argv); /* Open the display */
s2swin(0, nx-1, 0, ny-1, 0, nz-1); /* Set the window coordinates */
s2box("BCDET",0,0,"BCDET",0,0,"BCDET",0,0); /* Draw coordinate box */
/* allocate and generate the data grid */
grid = (float ***)malloc(nx * sizeof(float **));
for (i = 0; i < nx; i++) {
grid[i] = (float **)malloc(ny * sizeof(float *));
x = (float)(i) / (float)(nx - 1);
for (j = 0; j < ny; j++) {
grid[i][j] = (float *)malloc(nz * sizeof(float));
y = (float)(j) / (float)(ny - 1);
for (k = 0; k < nz; k++) {
z = (float)(k) / (float)(nz - 1);
grid[i][j][k] = x*x*x + y*y - z*z*z*z;
}
}
}
level = 0.2; /* Set the isosurface level */
resolution = 1; /* Set the isosurface resolution */
alpha = 0.9; /* Set the alpha channel */
trans = 'o'; /* Opaque isosurface */
/* Create the isosurface object */
id1 = ns2cis(grid, nx, ny, nz, 0, nx-1, 0, ny-1, 0, nz-1,
tr, level, resolution, trans, alpha, 1., 1., 0.);
ns2dis(id1, 0); /* Draw it */
level = 0.7; /* Set the isosurface level */
resolution = 6; /* Set the isosurface resolution */
alpha = 0.5; /* Set the alpha channel */
trans = 's'; /* Opaque isosurface */
/* Create the isosurface object - don't draw yet */
id2 = ns2cisc(grid, nx, ny, nz, 0, nx-1, 0, ny-1, 0, nz-1,
tr, level, resolution, trans, alpha, colorfn);
s2scb(&cb);
s2show(1); /* Open the s2plot window */
return 1;
}
Back to S2PLOT function list.