Function:ns2cvra
From S2PLOT
(Difference between revisions)
Revision as of 01:58, 7 January 2009 S2plot admin (Talk | contribs) ← Previous diff |
Current revision S2plot admin (Talk | contribs) |
||
Line 1: | Line 1: | ||
==ns2cvra== | ==ns2cvra== | ||
- | Render volume of objects. | + | Volume rendering with alpha function specified. |
==Prototype== | ==Prototype== | ||
Line 26: | Line 26: | ||
<code><pre> | <code><pre> | ||
- | </pre></code> | + | #include <stdio.h> |
+ | #include <stdlib.h> | ||
+ | #include <math.h> | ||
+ | #include <time.h> | ||
+ | #include "s2plot.h" | ||
- | [[S2PLOT:Function List | Back]] to S2PLOT function list. | + | /* Global variables */ |
+ | int vid; /* ID for volume render object */ | ||
+ | float tr[12]; /* Transformation matrix */ | ||
+ | float ***volume; /* The data cube */ | ||
+ | int N = 5000; /* Number of data points */ | ||
+ | float *x, *y, *z; /* Arrays for data values */ | ||
+ | float ***initVolume(int nx, int ny, int nz) | ||
+ | /* Allocate memory and initialise a data cube */ | ||
+ | { | ||
+ | float ***volume; | ||
+ | int i, j, k; | ||
+ | volume = (float ***)malloc(nx * sizeof(float **)); | ||
+ | if (volume == NULL) { | ||
+ | fprintf(stderr,"Failed to allocate %ld bytes\n",(long)(nx*sizeof(float **))); | ||
+ | exit(-1); | ||
+ | } | ||
+ | for (i=0;i<nx;i++) { | ||
+ | volume[i] = (float **)malloc(ny * sizeof(float *)); | ||
+ | if (volume[i] == NULL) { | ||
+ | fprintf(stderr,"Failed to allocate %ld bytes\n",(long)(nx*sizeof(float *))); | ||
+ | exit(-1); | ||
+ | } | ||
+ | for (j=0;j<ny;j++) { | ||
+ | volume[i][j] = (float *)malloc(nz * sizeof(float)); | ||
+ | if (volume[i][j] == NULL) { | ||
+ | fprintf(stderr,"Failed to allocate %ld bytes\n",(long)(nx*sizeof(float))); | ||
+ | exit(-1); | ||
+ | } | ||
+ | for (k=0;k<nz;k++) { | ||
+ | volume[i][j][k] = 0.0; /* Initialise */ | ||
+ | } | ||
+ | } | ||
+ | } | ||
- | __NOTOC__ | + | return volume; |
- | __NOEDITSECTION__ | + | } |
- | Back to [[Function:Template | template]] page. | + | void cb(double *t, int *kc) |
+ | /* A dynamic callback */ | ||
+ | { | ||
+ | ds2dvr(vid, 1); /* Draw the volume render object */ | ||
+ | if ((*kc % 2) == 1) | ||
+ | s2pt(N, x, y, z, 1); /* Plot the points on <space> press */ | ||
+ | } | ||
+ | |||
+ | float dmin, dmax; /* Global variables for data range */ | ||
+ | |||
+ | float transfer(float *dval) /* Alpha transfer function */ | ||
+ | { | ||
+ | float davg = (dmax+dmin)/2.0; | ||
+ | if (*dval < davg) return 0.0; | ||
+ | else return 1.0; | ||
+ | } | ||
+ | int main(int argc, char *argv[]) | ||
+ | { | ||
+ | int i; /* Loop variable */ | ||
+ | int nx = 32, ny = 32, nz = 32; /* Dimensions of data cube */ | ||
+ | float amin, amax; /* Min/max values */ | ||
+ | char trans; /* Transparency mode */ | ||
+ | float x1 = -1.0, x2 = +1.0; /* Data range along axes */ | ||
+ | float y1 = -1.0, y2 = +1.0; | ||
+ | float z1 = -1.0, z2 = +1.0; | ||
+ | int vi, vj, vk; /* Temporary variables */ | ||
+ | float dx, dy, dz; /* Temporary variables */ | ||
+ | COLOUR amb = {0.8, 0.8, 0.8}; /* Ambient light */ | ||
+ | |||
+ | srand48((long)time(NULL)); /* Seed random numbers */ | ||
+ | |||
+ | volume = initVolume(nx, ny, nz); /* Allocate memory */ | ||
+ | |||
+ | for (i=0;i<12;i++) { /* Set-up transfrom matrix */ | ||
+ | tr[i] = 0.0; | ||
+ | } | ||
+ | tr[ 0] = x1; /* Mapping from data cube */ | ||
+ | tr[ 1] = (x2-x1)/(float)(nx-1.0); /* to physical coordinates */ | ||
+ | tr[ 4] = y1; | ||
+ | tr[ 6] = (y2-y1)/(float)(ny-1.0); | ||
+ | tr[ 8] = z1; | ||
+ | tr[11] = (z2-z1)/(float)(nz-1.0); | ||
+ | |||
+ | dmin = 0.0; /* Mininum data value in volume to plot */ | ||
+ | dmax = 2.0; /* Maximum data value in volume to plot */ | ||
+ | amin = 0.0; /* Minimum alpha channel value */ | ||
+ | amax = 0.8; /* Maximum alpha channel value */ | ||
+ | trans = 't'; /* Transparency type */ | ||
+ | |||
+ | dx = tr[1]*0.5; /* Offsets for window - voxels are pixel */ | ||
+ | dy = tr[6]*0.5; /* centred */ | ||
+ | dz = tr[11]*0.5; | ||
+ | |||
+ | s2opend("/S2MONO",argc,argv); /* Open the display */ | ||
+ | s2swin(x1-dx,x2+dx, y1-dy,y2+dy, z1-dz,z2+dz); /* Set window coords */ | ||
+ | s2box("BCDE",0,0,"BCDE",0,0,"BCDE",0,0); /* Draw coord box */ | ||
+ | |||
+ | x = (float *)calloc(N, sizeof(float)); | ||
+ | y = (float *)calloc(N, sizeof(float)); | ||
+ | z = (float *)calloc(N, sizeof(float)); | ||
+ | |||
+ | for (i=0;i<N;i++) { /* Create N random (x,y,z) values */ | ||
+ | vi = (int)(drand48()*(nx)); | ||
+ | vj = (int)(drand48()*(ny)); | ||
+ | vk = (int)(drand48()*(nz)); | ||
+ | x[i] = vi * tr[1] + tr[0]; | ||
+ | y[i] = vj * tr[6] + tr[4]; | ||
+ | z[i] = vk * tr[11] + tr[8]; | ||
+ | |||
+ | |||
+ | volume[vi][vj][vk]+=1.0-drand48()*drand48(); | ||
+ | /* Give a value to volume */ | ||
+ | } | ||
+ | s2scir(1000,2000); /* Set colour range */ | ||
+ | s2icm("mgreen",1000,2000); /* Install colour map */ | ||
+ | vid = ns2cvra(volume, nx, ny, nz, 0, nx-1, 0, ny-1, 0, nz-1, | ||
+ | tr, trans, dmin, dmax, transfer); | ||
+ | /* Create the volume render object */ | ||
+ | |||
+ | cs2scb(cb); /* Install a dynamic callback */ | ||
+ | |||
+ | fprintf(stderr,"Press <space> to toggle showing data points\n"); | ||
+ | |||
+ | ss2srm(SHADE_FLAT); /* Set shading type to FLAT */ | ||
+ | ss2sl(amb, 0, NULL, NULL, 0); /* Ambient lighting only */ | ||
+ | |||
+ | s2show(1); /* Open the s2plot window */ | ||
+ | |||
+ | return 1; | ||
+ | } | ||
+ | </pre></code> | ||
+ | |||
+ | [[S2PLOT:Function List | Back]] to S2PLOT function list. | ||
+ | |||
+ | __NOTOC__ | ||
+ | __NOEDITSECTION__ |
Current revision
ns2cvra
Volume rendering with alpha function specified.
Prototype
int ns2cvra(float ***grid,
int adim, int bdim, int cdim,
int a1, int a2, int b1, int b2, int c1, int c2,
float *tr, char trans,
float datamin, float datamax,
float(*ialphafn)(float*));
Description
Volume rendering object, but with a function for alpha rather than a linear ramp. The ialphafn is called with a float (ptr) argument being the data value (which can be outside the (datamin, datamax) range of course) and should return a value between 0 (transparent) and 1 (opaque).
See Also
ns2cvr | Create a volume rendering object. |
ns2svas | Set alpha scaling mode. |
ns2qvas | Query alpha scaling mode. |
Code Example
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include "s2plot.h"
/* Global variables */
int vid; /* ID for volume render object */
float tr[12]; /* Transformation matrix */
float ***volume; /* The data cube */
int N = 5000; /* Number of data points */
float *x, *y, *z; /* Arrays for data values */
float ***initVolume(int nx, int ny, int nz)
/* Allocate memory and initialise a data cube */
{
float ***volume;
int i, j, k;
volume = (float ***)malloc(nx * sizeof(float **));
if (volume == NULL) {
fprintf(stderr,"Failed to allocate %ld bytes\n",(long)(nx*sizeof(float **)));
exit(-1);
}
for (i=0;i<nx;i++) {
volume[i] = (float **)malloc(ny * sizeof(float *));
if (volume[i] == NULL) {
fprintf(stderr,"Failed to allocate %ld bytes\n",(long)(nx*sizeof(float *)));
exit(-1);
}
for (j=0;j<ny;j++) {
volume[i][j] = (float *)malloc(nz * sizeof(float));
if (volume[i][j] == NULL) {
fprintf(stderr,"Failed to allocate %ld bytes\n",(long)(nx*sizeof(float)));
exit(-1);
}
for (k=0;k<nz;k++) {
volume[i][j][k] = 0.0; /* Initialise */
}
}
}
return volume;
}
void cb(double *t, int *kc)
/* A dynamic callback */
{
ds2dvr(vid, 1); /* Draw the volume render object */
if ((*kc % 2) == 1)
s2pt(N, x, y, z, 1); /* Plot the points on <space> press */
}
float dmin, dmax; /* Global variables for data range */
float transfer(float *dval) /* Alpha transfer function */
{
float davg = (dmax+dmin)/2.0;
if (*dval < davg) return 0.0;
else return 1.0;
}
int main(int argc, char *argv[])
{
int i; /* Loop variable */
int nx = 32, ny = 32, nz = 32; /* Dimensions of data cube */
float amin, amax; /* Min/max values */
char trans; /* Transparency mode */
float x1 = -1.0, x2 = +1.0; /* Data range along axes */
float y1 = -1.0, y2 = +1.0;
float z1 = -1.0, z2 = +1.0;
int vi, vj, vk; /* Temporary variables */
float dx, dy, dz; /* Temporary variables */
COLOUR amb = {0.8, 0.8, 0.8}; /* Ambient light */
srand48((long)time(NULL)); /* Seed random numbers */
volume = initVolume(nx, ny, nz); /* Allocate memory */
for (i=0;i<12;i++) { /* Set-up transfrom matrix */
tr[i] = 0.0;
}
tr[ 0] = x1; /* Mapping from data cube */
tr[ 1] = (x2-x1)/(float)(nx-1.0); /* to physical coordinates */
tr[ 4] = y1;
tr[ 6] = (y2-y1)/(float)(ny-1.0);
tr[ 8] = z1;
tr[11] = (z2-z1)/(float)(nz-1.0);
dmin = 0.0; /* Mininum data value in volume to plot */
dmax = 2.0; /* Maximum data value in volume to plot */
amin = 0.0; /* Minimum alpha channel value */
amax = 0.8; /* Maximum alpha channel value */
trans = 't'; /* Transparency type */
dx = tr[1]*0.5; /* Offsets for window - voxels are pixel */
dy = tr[6]*0.5; /* centred */
dz = tr[11]*0.5;
s2opend("/S2MONO",argc,argv); /* Open the display */
s2swin(x1-dx,x2+dx, y1-dy,y2+dy, z1-dz,z2+dz); /* Set window coords */
s2box("BCDE",0,0,"BCDE",0,0,"BCDE",0,0); /* Draw coord box */
x = (float *)calloc(N, sizeof(float));
y = (float *)calloc(N, sizeof(float));
z = (float *)calloc(N, sizeof(float));
for (i=0;i<N;i++) { /* Create N random (x,y,z) values */
vi = (int)(drand48()*(nx));
vj = (int)(drand48()*(ny));
vk = (int)(drand48()*(nz));
x[i] = vi * tr[1] + tr[0];
y[i] = vj * tr[6] + tr[4];
z[i] = vk * tr[11] + tr[8];
volume[vi][vj][vk]+=1.0-drand48()*drand48();
/* Give a value to volume */
}
s2scir(1000,2000); /* Set colour range */
s2icm("mgreen",1000,2000); /* Install colour map */
vid = ns2cvra(volume, nx, ny, nz, 0, nx-1, 0, ny-1, 0, nz-1,
tr, trans, dmin, dmax, transfer);
/* Create the volume render object */
cs2scb(cb); /* Install a dynamic callback */
fprintf(stderr,"Press <space> to toggle showing data points\n");
ss2srm(SHADE_FLAT); /* Set shading type to FLAT */
ss2sl(amb, 0, NULL, NULL, 0); /* Ambient lighting only */
s2show(1); /* Open the s2plot window */
return 1;
}
Back to S2PLOT function list.