home processing download documents tutorial python tutorial gallery source about
 Tutorials (back to the list of tutorials)

NURBS Volume Cellularization

     NURBS Volume

NURBS Volume can be instantiated by a 3D matrix of control points and degree in U, V, W dimension.

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);

  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);
}


     Points in NURBS Volume

You can sample a point by pt(double u, double v, double w) or pt(IVec uvw) method.

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);

  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 8;
  int wnum = 5;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;

  for(int i=0; i<=unum; i++){
    for(int j=0; j<=vnum; j++){
      for(int k=0; k<=wnum; k++){
        // sample a point coordinates
        IVec pt = vol.pt(i*uinc, j*vinc, k*winc);
        // creating a point
        new IPoint(pt).clr(i*uinc, j*vinc, k*winc);
      }
    }
  }
}


     Lines in U direction

You can draw lines in U direction by sampling points using i and i+1.

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);

  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 8;
  int wnum = 5;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;

  for(int i=0; i<=unum; i++){
    for(int j=0; j<=vnum; j++){
      for(int k=0; k<=wnum; k++){
        IVec pt1 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt2 = vol.pt((i+1)*uinc, j*vinc, k*winc);

        if(i < unum){
          // drawing a line
          new ICurve(pt1, pt2).clr(1.0,0,0);
        }
      }
    }
  }
}


     Lines in V direction

You can draw lines in V direction by sampling points using j and j+1.

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);

  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 8;
  int wnum = 5;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;

  for(int i=0; i<=unum; i++){
    for(int j=0; j<=vnum; j++){
      for(int k=0; k<=wnum; k++){
        IVec pt11 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt21 = vol.pt((i+1)*uinc, j*vinc, k*winc);
        IVec pt12 = vol.pt(i*uinc, (j+1)*vinc, k*winc);

        if(i < unum){
          // drawing a line in U direction
          new ICurve(pt11, pt21).clr(1.0,0,0);
        }
        if(j < vnum){
          // drawing a line in V direction
          new ICurve(pt11, pt12).clr(0,1.0,0);
        }
      }
    }
  }
}


     Lines in W direction

You can draw lines in W direction by sampling points using k and k+1.

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);

  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 8;
  int wnum = 5;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;

  for(int i=0; i<=unum; i++){
    for(int j=0; j<=vnum; j++){
      for(int k=0; k<=wnum; k++){
        IVec pt111 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt211 = vol.pt((i+1)*uinc, j*vinc, k*winc);
        IVec pt121 = vol.pt(i*uinc, (j+1)*vinc, k*winc);
        IVec pt112 = vol.pt(i*uinc, j*vinc, (k+1)*winc);

        if(i < unum){
          // drawing a line in U direction
          new ICurve(pt111, pt211).clr(1.0,0,0);
        }
        if(j < vnum){
          // drawing a line in V direction
          new ICurve(pt111, pt121).clr(0,1.0,0);
        }
        if(k < wnum){
          // drawing a line in W direction
          new ICurve(pt111, pt112).clr(0,0,1.0);
        }
      }
    }
  }
}


     Diagonal Lines in UV direction

You can draw lines in UV direction.

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);

  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 8;
  int wnum = 5;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        IVec pt111 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt221 = vol.pt((i+1)*uinc, (j+1)*vinc, k*winc);

        if(i < unum && j < vnum){
          // drawing a diagonal line in UV direction
          new ICurve(pt111, pt221).clr(1.0,0,0);
        }
      }
    }
  }
}


     Diagrid Lines in UV direction

You can draw diagrid lines in UV direction.

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);

  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 8;
  int wnum = 5;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        IVec pt111 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt211 = vol.pt((i+1)*uinc, j*vinc, k*winc);
        IVec pt121 = vol.pt(i*uinc, (j+1)*vinc, k*winc);
        IVec pt221 = vol.pt((i+1)*uinc, (j+1)*vinc, k*winc);

        if(i < unum && j < vnum){
          if((i+j)%2==0){
            // UV diagonal line
            new ICurve(pt111, pt221).clr(1.0,0,0);
          }
          else{
            // UV line in another diagonal direction
            new ICurve(pt211, pt121).clr(0,0,1.0);
          }
        }
      }
    }
  }
}


     NURBS Volume from a file

You can create a NURBS volume from an array of NURBS surface with the same number of control points in U and V. The order of the surfaces matters. The surfaces in the example code are sorted by X coodinates. Note that the importing Rhino file needs to be Rhino 4 version file.

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);


  //importing a Rhino file, whose file version needs to be Rhino 4. >_< 
  IG.open("surfs.3dm");
  ISurface[] surfs = IG.surfaces();

  ArrayList< ISurface > surfArray = new ArrayList< ISurface >();
  for(int i=0; i < surfs.length; i++){
    surfArray.add(surfs[i]);
  }
  //sorting surfaces in X by the approx center points 
  ISort.sort(surfArray, new ISurfaceXComparator());
  // ISort.sort(surfArray, new ISurfaceYComparator());
  // ISort.sort(surfArray, new ISurfaceZComparator());
  surfs = surfArray.toArray(surfs);

  //number of control points in U and V needs to be all same.
  int ucpNum = surfs[0].ucpNum();
  int vcpNum = surfs[0].vcpNum();
  int wcpNum = surfs.length;

  //U and V degree are set to be the same with the imported surface.
  int udeg = surfs[0].udeg();
  int vdeg = surfs[0].vdeg();
  //W degree can be set as you wish.
  int wdeg = 3;

  IVec[][][] cpts = new IVec[ucpNum][vcpNum][wcpNum];
  for(int i=0; i < ucpNum; i++){
    for(int j=0; j < vcpNum; j++){
      for(int k=0; k < wcpNum; k++){
        cpts[i][j][k] = surfs[k].cp(i,j);
      }
    }
  }

  //delete the imported surfaces.
  //IG.del(surfs);

  IVolume vol = new IVolume(cpts, udeg, vdeg, wdeg).clr(1.0,1.0,0);

  int unum = 8;
  int vnum = 10;
  int wnum = 12;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        IVec pt111 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt211 = vol.pt((i+1)*uinc, j*vinc, k*winc);
        IVec pt121 = vol.pt(i*uinc, (j+1)*vinc, k*winc);
        IVec pt221 = vol.pt((i+1)*uinc, (j+1)*vinc, k*winc);

        if(i < unum && j < vnum){
          if((i+j)%2==0){
            // UV diagonal line
            new ICurve(pt111, pt221).clr(1.0,0,0);
          }
          else{
            // UV line in another diagonal direction
            new ICurve(pt211, pt121).clr(0,0,1.0);
          }
        }
      }
    }
  }
}


     UV VW WU Diagonal Line

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  //importing a Rhino file, whose file version needs to be Rhino 4. >_< 
  IG.open("surfs.3dm");
  ISurface[] surfs = IG.surfaces();
  ArrayList< ISurface > surfArray = new ArrayList< ISurface >();
  for(int i=0; i < surfs.length; i++){ surfArray.add(surfs[i]); }
  //sorting surfaces in X by the approx center points 
  ISort.sort(surfArray, new ISurfaceXComparator());
  // ISort.sort(surfArray, new ISurfaceYComparator());
  // ISort.sort(surfArray, new ISurfaceZComparator());
  surfs = surfArray.toArray(surfs);

  //number of control points in U and V needs to be all same.
  int ucpNum = surfs[0].ucpNum();
  int vcpNum = surfs[0].vcpNum();
  int wcpNum = surfs.length;
  int udeg = surfs[0].udeg(); //U and V degree are set to be the same with the imported surface.
  int vdeg = surfs[0].vdeg();
  int wdeg = 3; //W degree can be set as you wish.

  IVec[][][] cpts = new IVec[ucpNum][vcpNum][wcpNum];
  for(int i=0; i < ucpNum; i++){ for(int j=0; j < vcpNum; j++){ for(int k=0; k < wcpNum; k++){ cpts[i][j][k] = surfs[k].cp(i,j); } } }

  IG.del(surfs); //delete the imported surfaces.

  IVolume vol = new IVolume(cpts, udeg, vdeg, wdeg).clr(1.0,1.0,0);

  int unum = 8;
  int vnum = 10;
  int wnum = 12;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        IVec pt111 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt221 = vol.pt((i+1)*uinc, (j+1)*vinc, k*winc);
        IVec pt122 = vol.pt(i*uinc, (j+1)*vinc, (k+1)*winc);
        IVec pt212 = vol.pt((i+1)*uinc, j*vinc, (k+1)*winc);
        if(i < unum && j < vnum){
          new ICurve(pt111, pt221).clr(1.0,1.0,0);
        }
        if(j < vnum && k < wnum){
          new ICurve(pt111, pt122).clr(0,1.0,1.0);
        }
        if(k < wnum && i < unum){
          new ICurve(pt111, pt212).clr(1.0,0,1.0);
        }
      }
    }
  }
  vol.hide();
}


     Adding Mesh Stick (Pipe)

You can add closed square mesh stick by IG.meshSquareStick(IVec p1, IVec p2, double width), closed circular mesh stick by IG.meshStick(IVec p1, IVec p2, double radius), or open NURBS surface pipe by IG.pipe(IVec p1, IVec p2, double radius).

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  //importing a Rhino file, whose file version needs to be Rhino 4. >_< 
  IG.open("surfs.3dm");
  ISurface[] surfs = IG.surfaces();
  ArrayList< ISurface > surfArray = new ArrayList< ISurface >();
  for(int i=0; i < surfs.length; i++){ surfArray.add(surfs[i]); }
  //sorting surfaces in X by the approx center points 
  ISort.sort(surfArray, new ISurfaceXComparator());
  // ISort.sort(surfArray, new ISurfaceYComparator());
  // ISort.sort(surfArray, new ISurfaceZComparator());
  surfs = surfArray.toArray(surfs);

  //number of control points in U and V needs to be all same.
  int ucpNum = surfs[0].ucpNum();
  int vcpNum = surfs[0].vcpNum();
  int wcpNum = surfs.length;
  int udeg = surfs[0].udeg(); //U and V degree are set to be the same with the imported surface.
  int vdeg = surfs[0].vdeg();
  int wdeg = 3; //W degree can be set as you wish.

  IVec[][][] cpts = new IVec[ucpNum][vcpNum][wcpNum];
  for(int i=0; i < ucpNum; i++){ for(int j=0; j < vcpNum; j++){ for(int k=0; k < wcpNum; k++){ cpts[i][j][k] = surfs[k].cp(i,j); } } }

  IG.del(surfs); //delete the imported surfaces.

  IVolume vol = new IVolume(cpts, udeg, vdeg, wdeg).clr(1.0,1.0,0);

  int unum = 6;
  int vnum = 8;
  int wnum = 10;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;
  double radius = 0.1;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        IVec pt111 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt221 = vol.pt((i+1)*uinc, (j+1)*vinc, k*winc);
        IVec pt122 = vol.pt(i*uinc, (j+1)*vinc, (k+1)*winc);
        IVec pt212 = vol.pt((i+1)*uinc, j*vinc, (k+1)*winc);
        if(i < unum && j < vnum){
          IG.meshSquareStick(pt111, pt221, radius).clr(0.7,0.7,0.7);
        }
        if(j < vnum && k < wnum){
          IG.meshSquareStick(pt111, pt122, radius).clr(0.7,0.7,0.7);
        }
        if(k < wnum && i < unum){
          IG.meshSquareStick(pt111, pt212, radius).clr(0.7,0.7,0.7);
        }
      }
    }
  }
  vol.hide();
}


     Diagonal Structure 1

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);
  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 5;
  int wnum = 5;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;
  double radius = 0.4;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        IVec pt111 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt211 = vol.pt((i+1)*uinc, j*vinc, k*winc);
        IVec pt121 = vol.pt(i*uinc, (j+1)*vinc, k*winc);
        IVec pt221 = vol.pt((i+1)*uinc, (j+1)*vinc, k*winc);
        IVec pt112 = vol.pt(i*uinc, j*vinc, (k+1)*winc);
        IVec pt212 = vol.pt((i+1)*uinc, j*vinc, (k+1)*winc);
        IVec pt122 = vol.pt(i*uinc, (j+1)*vinc, (k+1)*winc);
        IVec pt222 = vol.pt((i+1)*uinc, (j+1)*vinc, (k+1)*winc);

        if(i < unum && j < vnum && k < wnum){
          IG.meshSquareStick(pt111, pt222, radius).clr(0.7,0.7,0.7);
          IG.meshSquareStick(pt112, pt221, radius).clr(0.7,0.7,0.7);
          IG.meshSquareStick(pt121, pt212, radius).clr(0.7,0.7,0.7);
          IG.meshSquareStick(pt211, pt122, radius).clr(0.7,0.7,0.7);
        }
      }
    }
  }
  vol.hide();
}


     Diagonal Structure 2

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);
  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 5;
  int wnum = 5;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;
  double radius = 0.4;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        IVec pt111 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt211 = vol.pt((i+1)*uinc, j*vinc, k*winc);
        IVec pt121 = vol.pt(i*uinc, (j+1)*vinc, k*winc);
        IVec pt221 = vol.pt((i+1)*uinc, (j+1)*vinc, k*winc);
        IVec pt112 = vol.pt(i*uinc, j*vinc, (k+1)*winc);
        IVec pt212 = vol.pt((i+1)*uinc, j*vinc, (k+1)*winc);
        IVec pt122 = vol.pt(i*uinc, (j+1)*vinc, (k+1)*winc);
        IVec pt222 = vol.pt((i+1)*uinc, (j+1)*vinc, (k+1)*winc);

        if(i < unum && j < vnum && k < wnum){
          if((i+j+k)%2 == 0){
            IG.meshSquareStick(pt111, pt112, radius).clr(0.7,0.7,0.7);
            IG.meshSquareStick(pt111, pt222, radius).clr(0.7,0.7,0.7);
            IG.meshSquareStick(pt121, pt212, radius).clr(0.7,0.7,0.7);
          }
          else{
            IG.meshSquareStick(pt112, pt111, radius).clr(0.5,0.5,0.5);
            IG.meshSquareStick(pt112, pt221, radius).clr(0.5,0.5,0.5);
            IG.meshSquareStick(pt211, pt122, radius).clr(0.5,0.5,0.5);
          }

        }
      }
    }
  }
  vol.hide();
}


     Diagonal Structure 3

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);
  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 5;
  int wnum = 5;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;
  double radius = 0.4;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        IVec pt111 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt211 = vol.pt((i+1)*uinc, j*vinc, k*winc);
        IVec pt121 = vol.pt(i*uinc, (j+1)*vinc, k*winc);
        IVec pt221 = vol.pt((i+1)*uinc, (j+1)*vinc, k*winc);
        IVec pt112 = vol.pt(i*uinc, j*vinc, (k+1)*winc);
        IVec pt212 = vol.pt((i+1)*uinc, j*vinc, (k+1)*winc);
        IVec pt122 = vol.pt(i*uinc, (j+1)*vinc, (k+1)*winc);
        IVec pt222 = vol.pt((i+1)*uinc, (j+1)*vinc, (k+1)*winc);

        if(i < unum && j < vnum && k < wnum){
          if(i%2==k%2 && j%2==k%2){
            IG.meshSquareStick(pt111, pt222, radius).clr(0.7,0.7,0.7);
          }
          if(i%2==k%2 && j%2!=k%2){
            IG.meshSquareStick(pt121, pt212, radius).clr(0.5,0.5,0.5);
          }
          if(i%2!=k%2 && j%2==k%2){
            IG.meshSquareStick(pt211, pt122, radius).clr(0.5,0,1.0);
          }
          if(i%2!=k%2 && j%2!=k%2){
            IG.meshSquareStick(pt112, pt221, radius).clr(1.0,0,1.0);
          }
        }
      }
    }
  }
  vol.hide();
}


     Diagonal Structure 4

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);
  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 5;
  int wnum = 5;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;
  double radius = 0.4;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        IVec pt111 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt211 = vol.pt((i+1)*uinc, j*vinc, k*winc);
        IVec pt121 = vol.pt(i*uinc, (j+1)*vinc, k*winc);
        IVec pt221 = vol.pt((i+1)*uinc, (j+1)*vinc, k*winc);
        IVec pt112 = vol.pt(i*uinc, j*vinc, (k+1)*winc);
        IVec pt212 = vol.pt((i+1)*uinc, j*vinc, (k+1)*winc);
        IVec pt122 = vol.pt(i*uinc, (j+1)*vinc, (k+1)*winc);
        IVec pt222 = vol.pt((i+1)*uinc, (j+1)*vinc, (k+1)*winc);

        if(i < unum){
          IG.meshSquareStick(pt111, pt211, radius).clr(0.7,0.7,0.7);
        }
        if(j < vnum){
          IG.meshSquareStick(pt111, pt121, radius).clr(0.7,0.7,0.7);
        }
        if(k < wnum){
          IG.meshSquareStick(pt111, pt112, radius).clr(0.7,0.7,0.7);
        }

        if(i < unum && j < vnum){
          IG.meshSquareStick(pt111, pt221, radius).clr(0.5,0.5,0.5);
          IG.meshSquareStick(pt121, pt211, radius).clr(0.5,0.5,0.5);
        }

        if(j < vnum && k < wnum){
          IG.meshSquareStick(pt111, pt122, radius).clr(0.5,0.5,0.5);
          IG.meshSquareStick(pt112, pt121, radius).clr(0.5,0.5,0.5);
        }

        if(i < unum && k < wnum){
          IG.meshSquareStick(pt111, pt212, radius).clr(0.5,0.5,0.5);
          IG.meshSquareStick(pt112, pt211, radius).clr(0.5,0.5,0.5);
        }

        if(i < unum && j < vnum && k < wnum){
          IG.meshSquareStick(pt111, pt222, radius).clr(0.5,0,1.0);
          IG.meshSquareStick(pt121, pt212, radius).clr(0.5,0,1.0);
          IG.meshSquareStick(pt211, pt122, radius).clr(0.5,0,1.0);
          IG.meshSquareStick(pt112, pt221, radius).clr(0.5,0,1.0);
        }
      }
    }
  }
  vol.hide();
}


     Diagonal Structure 5

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);
  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 5;
  int wnum = 5;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;
  double radius = 0.4;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        IVec pt111 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt211 = vol.pt((i+1)*uinc, j*vinc, k*winc);
        IVec pt121 = vol.pt(i*uinc, (j+1)*vinc, k*winc);
        IVec pt221 = vol.pt((i+1)*uinc, (j+1)*vinc, k*winc);
        IVec pt112 = vol.pt(i*uinc, j*vinc, (k+1)*winc);
        IVec pt212 = vol.pt((i+1)*uinc, j*vinc, (k+1)*winc);
        IVec pt122 = vol.pt(i*uinc, (j+1)*vinc, (k+1)*winc);
        IVec pt222 = vol.pt((i+1)*uinc, (j+1)*vinc, (k+1)*winc);
        IVec mid1 = vol.pt((i+0.5)*uinc, (j+0.5)*vinc, k*winc);
        IVec mid2 = vol.pt((i+0.5)*uinc, (j+0.5)*vinc, (k+1)*winc);
        IVec center = vol.pt((i+0.5)*uinc, (j+0.5)*vinc, (k+0.5)*winc);

        if(i < unum && j < vnum && k < wnum){
          if((i+j+k)%2 == 0){
            IG.meshSquareStick(pt111, center, radius).clr(0.7,0.7,0.7);
            IG.meshSquareStick(pt211, center, radius).clr(0.7,0.7,0.7);
            IG.meshSquareStick(pt121, center, radius).clr(0.7,0.7,0.7);
            IG.meshSquareStick(pt221, center, radius).clr(0.7,0.7,0.7);
            IG.meshSquareStick(mid2, center, radius).clr(0.7,0.7,0.7);
          }
          else{
            IG.meshSquareStick(mid1, center, radius).clr(0.5,0.5,0.5);
            IG.meshSquareStick(pt112, center, radius).clr(0.5,0.5,0.5);
            IG.meshSquareStick(pt212, center, radius).clr(0.5,0.5,0.5);
            IG.meshSquareStick(pt122, center, radius).clr(0.5,0.5,0.5);
            IG.meshSquareStick(pt222, center, radius).clr(0.5,0.5,0.5);
          }
        }
      }
    }
  }
  vol.hide();
}


     Diagonal Structure 6 (Curve)

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);
  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 5;
  int wnum = 5;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;
  double radius = 0.4;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        IVec pt111 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt211 = vol.pt((i+1)*uinc, j*vinc, k*winc);
        IVec pt121 = vol.pt(i*uinc, (j+1)*vinc, k*winc);
        IVec pt221 = vol.pt((i+1)*uinc, (j+1)*vinc, k*winc);
        IVec pt112 = vol.pt(i*uinc, j*vinc, (k+1)*winc);
        IVec pt212 = vol.pt((i+1)*uinc, j*vinc, (k+1)*winc);
        IVec pt122 = vol.pt(i*uinc, (j+1)*vinc, (k+1)*winc);
        IVec pt222 = vol.pt((i+1)*uinc, (j+1)*vinc, (k+1)*winc);
        IVec mid1 = vol.pt((i+0.5)*uinc, (j+0.5)*vinc, k*winc);
        IVec mid2 = vol.pt((i+0.5)*uinc, (j+0.5)*vinc, (k+1)*winc);
        IVec center = vol.pt((i+0.5)*uinc, (j+0.5)*vinc, (k+0.5)*winc);

        if(i < unum && j < vnum && k < wnum){
          if(k%2 == 0){
            ICurve crv1 = new ICurve(new IVec[]{ pt111, center, mid2}, 2);
            ICurve crv2 = new ICurve(new IVec[]{ pt211, center, mid2}, 2);
            ICurve crv3 = new ICurve(new IVec[]{ pt121, center, mid2}, 2);
            ICurve crv4 = new ICurve(new IVec[]{ pt221, center, mid2}, 2);
            IG.meshSquareStick(crv1, radius).clr(0.7,0.7,0.7);
            IG.meshSquareStick(crv2, radius).clr(0.7,0.7,0.7);
            IG.meshSquareStick(crv3, radius).clr(0.7,0.7,0.7);
            IG.meshSquareStick(crv4, radius).clr(0.7,0.7,0.7);
          }
          else{
            ICurve crv5 = new ICurve(new IVec[]{ pt112, center, mid1}, 2);
            ICurve crv6 = new ICurve(new IVec[]{ pt212, center, mid1}, 2);
            ICurve crv7 = new ICurve(new IVec[]{ pt122, center, mid1}, 2);
            ICurve crv8 = new ICurve(new IVec[]{ pt222, center, mid1}, 2);
            IG.meshSquareStick(crv5, radius).clr(0.5,0.5,0.5);
            IG.meshSquareStick(crv6, radius).clr(0.5,0.5,0.5);
            IG.meshSquareStick(crv7, radius).clr(0.5,0.5,0.5);
            IG.meshSquareStick(crv8, radius).clr(0.5,0.5,0.5);
          }
        }
      }
    }
  }
  vol.hide();
}


     Surfaces in Volume

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  //importing a Rhino file, whose file version needs to be Rhino 4. >_< 
  IG.open("surfs.3dm");
  ISurface[] surfs = IG.surfaces();
  ArrayList< ISurface > surfArray = new ArrayList< ISurface >();
  for(int i=0; i < surfs.length; i++){ surfArray.add(surfs[i]); }
  //sorting surfaces in X by the approx center points 
  ISort.sort(surfArray, new ISurfaceXComparator());
  // ISort.sort(surfArray, new ISurfaceYComparator());
  // ISort.sort(surfArray, new ISurfaceZComparator());
  surfs = surfArray.toArray(surfs);

  //number of control points in U and V needs to be all same.
  int ucpNum = surfs[0].ucpNum();
  int vcpNum = surfs[0].vcpNum();
  int wcpNum = surfs.length;
  int udeg = surfs[0].udeg(); //U and V degree are set to be the same with the imported surface.
  int vdeg = surfs[0].vdeg();
  int wdeg = 3; //W degree can be set as you wish.

  IVec[][][] cpts = new IVec[ucpNum][vcpNum][wcpNum];
  for(int i=0; i < ucpNum; i++){ for(int j=0; j < vcpNum; j++){ for(int k=0; k < wcpNum; k++){ cpts[i][j][k] = surfs[k].cp(i,j); } } }

  IG.del(surfs); //delete the imported surfaces.

  IVolume vol = new IVolume(cpts, udeg, vdeg, wdeg).clr(1.0,1.0,0);

  int unum = 6;
  int vnum = 5;
  int wnum = 5;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        IVec pt111 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt211 = vol.pt((i+1)*uinc, j*vinc, k*winc);
        IVec pt121 = vol.pt(i*uinc, (j+1)*vinc, k*winc);
        IVec pt221 = vol.pt((i+1)*uinc, (j+1)*vinc, k*winc);
        IVec pt112 = vol.pt(i*uinc, j*vinc, (k+1)*winc);
        IVec pt212 = vol.pt((i+1)*uinc, j*vinc, (k+1)*winc);
        IVec pt122 = vol.pt(i*uinc, (j+1)*vinc, (k+1)*winc);
        IVec pt222 = vol.pt((i+1)*uinc, (j+1)*vinc, (k+1)*winc);

        if(i < unum && k < wnum ){
          new ISurface(pt111,pt121,pt122,pt112).clr(1.0,0,0);
        }
      }
    }
  }
  vol.hide();
}


     Surfaces in Volume 2

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);
  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 5;
  int wnum = 5;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;
  double radius = 0.4;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        IVec pt111 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt211 = vol.pt((i+1)*uinc, j*vinc, k*winc);
        IVec pt121 = vol.pt(i*uinc, (j+1)*vinc, k*winc);
        IVec pt221 = vol.pt((i+1)*uinc, (j+1)*vinc, k*winc);
        IVec pt112 = vol.pt(i*uinc, j*vinc, (k+1)*winc);
        IVec pt212 = vol.pt((i+1)*uinc, j*vinc, (k+1)*winc);
        IVec pt122 = vol.pt(i*uinc, (j+1)*vinc, (k+1)*winc);
        IVec pt222 = vol.pt((i+1)*uinc, (j+1)*vinc, (k+1)*winc);

        if(i < unum && j < vnum){
          new ISurface(pt111, pt211, pt221, pt121).clr(1.0,0,0);
        }
        if(j < vnum && k < wnum){
          new ISurface(pt111, pt121, pt122, pt112).clr(0,1.0,0);
        }
        if(i < unum && k < wnum){
          new ISurface(pt111, pt211, pt212, pt112).clr(0,0,1.0);
        }
      }
    }
  }
  vol.hide();
}


     Boxes in Volume

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);
  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 5;
  int wnum = 5;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;
  double radius = 0.4;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        IVec pt111 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt211 = vol.pt((i+1)*uinc, j*vinc, k*winc);
        IVec pt121 = vol.pt(i*uinc, (j+1)*vinc, k*winc);
        IVec pt221 = vol.pt((i+1)*uinc, (j+1)*vinc, k*winc);
        IVec pt112 = vol.pt(i*uinc, j*vinc, (k+1)*winc);
        IVec pt212 = vol.pt((i+1)*uinc, j*vinc, (k+1)*winc);
        IVec pt122 = vol.pt(i*uinc, (j+1)*vinc, (k+1)*winc);
        IVec pt222 = vol.pt((i+1)*uinc, (j+1)*vinc, (k+1)*winc);

        if(i < unum && j < vnum && k < wnum){
          new IBox(pt111, pt211, pt221, pt121,
                   pt112, pt212, pt222, pt122).clr(1.0,0.5,0);
        }
      }
    }
  }
  vol.hide();
}


     Boxes in Volume 2

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);
  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 5;
  int wnum = 5;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;
  double radius = 0.4;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        IVec pt111 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt211 = vol.pt((i+1)*uinc, j*vinc, k*winc);
        IVec pt121 = vol.pt(i*uinc, (j+1)*vinc, k*winc);
        IVec pt221 = vol.pt((i+1)*uinc, (j+1)*vinc, k*winc);
        IVec pt112 = vol.pt(i*uinc, j*vinc, (k+1)*winc);
        IVec pt212 = vol.pt((i+1)*uinc, j*vinc, (k+1)*winc);
        IVec pt122 = vol.pt(i*uinc, (j+1)*vinc, (k+1)*winc);
        IVec pt222 = vol.pt((i+1)*uinc, (j+1)*vinc, (k+1)*winc);

        if(i < unum && j < vnum && k < wnum){
          if((i+j+k)%3==0){
            new IBox(pt111, pt211, pt221, pt121,
                     pt112, pt212, pt222, pt122).clr(1.0,0.5,0);
          }
        }
      }
    }
  }
  vol.hide();
}


     Import Surface Modules 1

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // import modules
  IG.open("module_surf.3dm");
  ISurface moduleSrf = IG.surface(0);
  IG.delAll(); // clear geometries

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);
  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 5;
  int wnum = 5;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;
  double radius = 0.4;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        IVec pt111 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt211 = vol.pt((i+1)*uinc, j*vinc, k*winc);
        IVec pt121 = vol.pt(i*uinc, (j+1)*vinc, k*winc);
        IVec pt221 = vol.pt((i+1)*uinc, (j+1)*vinc, k*winc);
        IVec pt112 = vol.pt(i*uinc, j*vinc, (k+1)*winc);
        IVec pt212 = vol.pt((i+1)*uinc, j*vinc, (k+1)*winc);
        IVec pt122 = vol.pt(i*uinc, (j+1)*vinc, (k+1)*winc);
        IVec pt222 = vol.pt((i+1)*uinc, (j+1)*vinc, (k+1)*winc);

        if(i < unum && k < wnum){
          deform(moduleSrf.cp(), pt111, pt211, pt212, pt112).clr(1.0,0,0);
        }
      }
    }
  }
  vol.hide();
}

// project pt in (0-1, 0-1, 0) to uv quad
IVec deform(IVec pt, IVec uv11, IVec uv21, IVec uv22, IVec uv12){
   IVec upt1 = uv11.sum(uv21, pt.x);
   IVec upt2 = uv12.sum(uv22, pt.x);
   IVec uvpt = upt1.sum(upt2, pt.y);
   if(pt instanceof IVec4) uvpt = uvpt.to4d(((IVec4)pt).w());
   return uvpt;
}

ICurve deform(ICurve crv, IVec uv11, IVec uv21, IVec uv22, IVec uv12){
  for(int i=0; i < crv.cpNum(); i++){
    crv.cps()[i].set(deform(crv.cp(i), uv11,uv21,uv22,uv12));
  }
  crv.updateGraphic();
  return crv;
}

ISurface deform(ISurface srf, IVec uv11, IVec uv21, IVec uv22, IVec uv12){
  for(int i=0; i < srf.ucpNum(); i++){
    for(int j=0; j < srf.vcpNum(); j++){
      srf.cps()[i][j].set(deform(srf.cp(i,j), uv11,uv21,uv22,uv12));
    }
  }
  srf.updateGraphic();
  return srf;
}

IMesh deform(IMesh mesh, IVec uv11, IVec uv21, IVec uv22, IVec uv12){
  for(int i=0; i < mesh.vertexNum(); i++){
    mesh.vertex(i).set(deform(mesh.vertex(i).get(), uv11,uv21,uv22,uv12));
  }
  mesh.updateGraphic();
  return mesh;
}


     Import Surface Modules 2

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // import modules
  IG.open("module_surf2.3dm");
  ISurface moduleSrf1 = IG.layer("module1").surface(0);
  ISurface moduleSrf2 = IG.layer("module2").surface(0);
  IG.delAll(); // clear geometries

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);
  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 5;
  int wnum = 5;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;
  double radius = 0.4;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        IVec pt111 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt211 = vol.pt((i+1)*uinc, j*vinc, k*winc);
        IVec pt121 = vol.pt(i*uinc, (j+1)*vinc, k*winc);
        IVec pt221 = vol.pt((i+1)*uinc, (j+1)*vinc, k*winc);
        IVec pt112 = vol.pt(i*uinc, j*vinc, (k+1)*winc);
        IVec pt212 = vol.pt((i+1)*uinc, j*vinc, (k+1)*winc);
        IVec pt122 = vol.pt(i*uinc, (j+1)*vinc, (k+1)*winc);
        IVec pt222 = vol.pt((i+1)*uinc, (j+1)*vinc, (k+1)*winc);

        if(i < unum && k < wnum){
          if(IRand.pct(50)){
            deform(moduleSrf1.cp(), pt111, pt211, pt212, pt112).clr(1.0,0,0);
          }
          else{
            deform(moduleSrf2.cp(), pt111, pt211, pt212, pt112).clr(1.0,0,0);
          }
        }
        if(i < unum && j < vnum){
          if(IRand.pct(40)){
            if(IRand.pct(50)){
              deform(moduleSrf1.cp(), pt111, pt211, pt212, pt112).clr(1.0,0,0);
            }
            else{
              deform(moduleSrf2.cp(), pt111, pt211, pt212, pt112).clr(1.0,0,0);
            }
          }
        }

      }
    }
  }
  vol.hide();
}

// project pt in (0-1, 0-1, 0) to uv quad
IVec deform(IVec pt, IVec uv11, IVec uv21, IVec uv22, IVec uv12){
   IVec upt1 = uv11.sum(uv21, pt.x);
   IVec upt2 = uv12.sum(uv22, pt.x);
   IVec uvpt = upt1.sum(upt2, pt.y);
   if(pt instanceof IVec4) uvpt = uvpt.to4d(((IVec4)pt).w());
   return uvpt;
}

ICurve deform(ICurve crv, IVec uv11, IVec uv21, IVec uv22, IVec uv12){
  for(int i=0; i < crv.cpNum(); i++){
    crv.cps()[i].set(deform(crv.cp(i), uv11,uv21,uv22,uv12));
  }
  crv.updateGraphic();
  return crv;
}

ISurface deform(ISurface srf, IVec uv11, IVec uv21, IVec uv22, IVec uv12){
  for(int i=0; i < srf.ucpNum(); i++){
    for(int j=0; j < srf.vcpNum(); j++){
      srf.cps()[i][j].set(deform(srf.cp(i,j), uv11,uv21,uv22,uv12));
    }
  }
  srf.updateGraphic();
  return srf;
}

IMesh deform(IMesh mesh, IVec uv11, IVec uv21, IVec uv22, IVec uv12){
  for(int i=0; i < mesh.vertexNum(); i++){
    mesh.vertex(i).set(deform(mesh.vertex(i).get(), uv11,uv21,uv22,uv12));
  }
  mesh.updateGraphic();
  return mesh;
}


     Import Box Modules

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // import modules
  IG.open("module_brep.3dm");
  IBrep moduleBrep = IG.brep(0);
  IG.delAll(); // clear geometries

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);
  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 5;
  int wnum = 5;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        IVec pt111 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt211 = vol.pt((i+1)*uinc, j*vinc, k*winc);
        IVec pt121 = vol.pt(i*uinc, (j+1)*vinc, k*winc);
        IVec pt221 = vol.pt((i+1)*uinc, (j+1)*vinc, k*winc);
        IVec pt112 = vol.pt(i*uinc, j*vinc, (k+1)*winc);
        IVec pt212 = vol.pt((i+1)*uinc, j*vinc, (k+1)*winc);
        IVec pt122 = vol.pt(i*uinc, (j+1)*vinc, (k+1)*winc);
        IVec pt222 = vol.pt((i+1)*uinc, (j+1)*vinc, (k+1)*winc);

        if(i < unum && j < vnum && k < wnum){
          deform(moduleBrep.cp(), pt111, pt211, pt221, pt121, pt112, pt212, pt222, pt122).clr(0.5,0.5,0.5);
        }
      }
    }
  }
  vol.hide();
}

// project pt in (0-1, 0-1, 0-1) to uvw cube
IVec deform(IVec pt, IVec uvw111, IVec uvw211, IVec uvw221, IVec uvw121,
                    IVec uvw112, IVec uvw212, IVec uvw222, IVec uvw122){
   IVec upt11 = uvw111.sum(uvw211, pt.x);
   IVec upt21 = uvw121.sum(uvw221, pt.x);
   IVec upt22 = uvw122.sum(uvw222, pt.x);
   IVec upt12 = uvw112.sum(uvw212, pt.x);
   IVec uvpt1 = upt11.sum(upt21, pt.y);
   IVec uvpt2 = upt12.sum(upt22, pt.y);
   IVec uvwpt = uvpt1.sum(uvpt2, pt.z);
   if(pt instanceof IVec4) uvwpt = uvwpt.to4d(((IVec4)pt).w());
   return uvwpt;
}

ISurface deform(ISurface srf,  IVec uvw111, IVec uvw211, IVec uvw221, IVec uvw121,
                               IVec uvw112, IVec uvw212, IVec uvw222, IVec uvw122){
  for(int i=0; i < srf.ucpNum(); i++){
    for(int j=0; j < srf.vcpNum(); j++){
      srf.cps()[i][j].set(deform(srf.cp(i,j), uvw111,uvw211,uvw221,uvw121,uvw112,uvw212,uvw222,uvw122));
    }
  }
  srf.updateGraphic();
  return srf;
}

IMesh deform(IMesh mesh,  IVec uvw111, IVec uvw211, IVec uvw221, IVec uvw121,
                          IVec uvw112, IVec uvw212, IVec uvw222, IVec uvw122){
  for(int i=0; i < mesh.vertexNum(); i++){
    mesh.vertex(i).set(deform(mesh.vertex(i).get(), uvw111,uvw211,uvw221,uvw121,uvw112,uvw212,uvw222,uvw122));
  }
  mesh.updateGraphic();
  return mesh;
}


IBrep deform(IBrep brep,  IVec uvw111, IVec uvw211, IVec uvw221, IVec uvw121,
                          IVec uvw112, IVec uvw212, IVec uvw222, IVec uvw122){
  for(int k=0; k < brep.surfaces.length; k++){
    for(int i=0; i < brep.surfaces[k].ucpNum(); i++){
      for(int j=0; j < brep.surfaces[k].vcpNum(); j++){
        brep.surfaces[k].cps()[i][j].set(deform(brep.surfaces[k].cp(i,j).get(), uvw111,uvw211,uvw221,uvw121,uvw112,uvw212,uvw222,uvw122));
      }
    }
  }
  brep.updateGraphic();
  return brep;
}


     Honeycomb Cell Surfaces

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);
  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 5;
  int wnum = 5;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        IVec pt111 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt211 = vol.pt((i+1)*uinc, j*vinc, k*winc);
        IVec pt121 = vol.pt(i*uinc, (j+1)*vinc, k*winc);
        IVec pt221 = vol.pt((i+1)*uinc, (j+1)*vinc, k*winc);
        IVec pt112 = vol.pt(i*uinc, j*vinc, (k+1)*winc);
        IVec pt212 = vol.pt((i+1)*uinc, j*vinc, (k+1)*winc);
        IVec pt122 = vol.pt(i*uinc, (j+1)*vinc, (k+1)*winc);
        IVec pt222 = vol.pt((i+1)*uinc, (j+1)*vinc, (k+1)*winc);
        IVec pt232 = vol.pt((i+1)*uinc, (j+2)*vinc, (k+1)*winc);
        IVec pt223 = vol.pt((i+1)*uinc, (j+1)*vinc, (k+2)*winc);
        IVec pt322 = vol.pt((i+2)*uinc, (j+1)*vinc, (k+1)*winc);

        if(i < unum && j < vnum && k < wnum){
          if( (i+j+k)%3==0 ){
            new ISurface(pt111,pt222,pt232,pt121).clr(1.,0,0);
            new ISurface(pt111,pt112,pt223,pt222).clr(1.,0,1.0);
            new ISurface(pt111,pt211,pt322,pt222).clr(0,0,1.0);
          }
        }
      }
    }
  }
  vol.hide();
}


     Orthogonal Strips

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);
  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 5;
  int wnum = 5;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        IVec pt111 = vol.pt(i*uinc, j*vinc, k*winc);
        IVec pt211 = vol.pt((i+1)*uinc, j*vinc, k*winc);
        IVec pt121 = vol.pt(i*uinc, (j+1)*vinc, k*winc);
        IVec pt221 = vol.pt((i+1)*uinc, (j+1)*vinc, k*winc);
        IVec pt112 = vol.pt(i*uinc, j*vinc, (k+1)*winc);
        IVec pt212 = vol.pt((i+1)*uinc, j*vinc, (k+1)*winc);
        IVec pt122 = vol.pt(i*uinc, (j+1)*vinc, (k+1)*winc);
        IVec pt222 = vol.pt((i+1)*uinc, (j+1)*vinc, (k+1)*winc);
        IVec pt232 = vol.pt((i+1)*uinc, (j+2)*vinc, (k+1)*winc);
        IVec pt223 = vol.pt((i+1)*uinc, (j+1)*vinc, (k+2)*winc);
        IVec pt322 = vol.pt((i+2)*uinc, (j+1)*vinc, (k+1)*winc);


        if(i < unum && j < vnum && k < wnum){
          new ISurface(vol.pt((i+0.5)*uinc, j*vinc, k*winc), vol.pt((i+0.5)*uinc, (j+1)*vinc, k*winc), vol.pt((i+0.5)*uinc, (j+1)*vinc, (k+0.5)*winc),vol.pt((i+0.5)*uinc, j*vinc, (k+0.5)*winc)).clr(0,1.0,1.0);
          new ISurface(vol.pt((i)*uinc, (j+0.25)*vinc, (k+0.5)*winc), vol.pt((i)*uinc, (j+0.75)*vinc, (k+0.5)*winc), vol.pt((i+1)*uinc, (j+0.75)*vinc, (k+0.5)*winc),vol.pt((i+1)*uinc, (j+0.25)*vinc, (k+0.5)*winc)).clr(0,0,1.0);
          new ISurface(vol.pt((i+0.25)*uinc, (j+0.5)*vinc, (k)*winc), vol.pt((i+0.75)*uinc, (j+0.5)*vinc, (k+0)*winc), vol.pt((i+0.75)*uinc, (j+0.5)*vinc, (k+1)*winc),vol.pt((i+0.25)*uinc, (j+0.5)*vinc, (k+1)*winc)).clr(0.5,0,1);
        }

      }
    }
  }
  vol.hide();
}


     Diagonal Boxes

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);
  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 5;
  int wnum = 7;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        double u = i*uinc;
        double v = j*vinc;
        double w = k*winc;

        if(i < unum && j < vnum && k < wnum){
          if(j%2==1){
            u += uinc/2;
          }
          if(k%3==1){
            u+=uinc/2;
            v-=vinc/3;
          }
          else if(k%3==2){
            u+=uinc/2;
            v+=vinc/3;
          }

          IVec uvw111 = new IVec(u,v,w);
          IVec uvw112 = new IVec(u-uinc/2, v-vinc/3, w+winc);
          IVec uvw212 = new IVec(u+uinc/2, v-vinc/3, w+winc);
          IVec uvw122 = new IVec(u, v+vinc*2/3, w+winc);
          IVec uvw113 = new IVec(u, v-vinc*2/3, w+winc*2);
          IVec uvw123 = new IVec(u-uinc/2, v+vinc/3, w+winc*2);
          IVec uvw223 = new IVec(u+uinc/2, v+vinc/3, w+winc*2);
          IVec uvw114 = new IVec(u, v, w+winc*3);

          new IBox(vol.pt(uvw111), vol.pt(uvw212), vol.pt(uvw113), vol.pt(uvw112),
                   vol.pt(uvw122), vol.pt(uvw223), vol.pt(uvw114),vol.pt(uvw123)).hsb(u, v, w);
        }
      }
    }
  }
  vol.hide();
}


     Diagonal Box Structure

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);
  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 5;
  int wnum = 7;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;
  double radius = 0.1;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        double u = i*uinc;
        double v = j*vinc;
        double w = k*winc;

        if(j%2==1){
          u += uinc/2;
        }
        if(k%3==1){
          u+=uinc/2;
          v-=vinc/3;
        }
        else if(k%3==2){
          u+=uinc/2;
          v+=vinc/3;
        }

        IVec uvw111 = new IVec(u,v,w);
        IVec uvw112 = new IVec(u-uinc/2, v-vinc/3, w+winc);
        IVec uvw212 = new IVec(u+uinc/2, v-vinc/3, w+winc);
        IVec uvw122 = new IVec(u, v+vinc*2/3, w+winc);

        if(uvw111.x>=0 && uvw111.x<=1 && uvw111.y>=0 && uvw111.y<=1){
          if(uvw112.x>=0 && uvw112.x<=1 && uvw112.y>=0 && uvw112.y<=1){
            IG.pipe(vol.pt(uvw111), vol.pt(uvw112),radius).clr(0.7,0.7,0.7);
          }
          if(uvw212.x>=0 && uvw212.x<=1 && uvw212.y>=0 && uvw212.y<=1){
            IG.pipe(vol.pt(uvw111), vol.pt(uvw212),radius).clr(0.7,0.7,0.7);
          }
          if(uvw122.x>=0 && uvw122.x<=1 && uvw122.y>=0 && uvw122.y<=1){
            IG.pipe(vol.pt(uvw111), vol.pt(uvw122),radius).clr(0.7,0.7,0.7);
          }
        }
      }
    }
  }
  vol.hide();
}


     Tetrahedron and Octahedron

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // control points
  IVec[][][] cpts = new IVec[4][3][2];
  cpts[0][0][0] = new IVec(0,0,0); cpts[0][0][1] = new IVec(0,0,10);
  cpts[0][1][0] = new IVec(0,10,0); cpts[0][1][1] = new IVec(0,10,10);
  cpts[0][2][0] = new IVec(0,20,0); cpts[0][2][1] = new IVec(0,20,10);
  cpts[1][0][0] = new IVec(10,0,0); cpts[1][0][1] = new IVec(10,0,10);
  cpts[1][1][0] = new IVec(10,10,0); cpts[1][1][1] = new IVec(10,10,10);
  cpts[1][2][0] = new IVec(10,20,0); cpts[1][2][1] = new IVec(10,20,10);
  cpts[2][0][0] = new IVec(20,0,0); cpts[2][0][1] = new IVec(20,0,20);
  cpts[2][1][0] = new IVec(20,5,0); cpts[2][1][1] = new IVec(20,5,20);
  cpts[2][2][0] = new IVec(20,10,0); cpts[2][2][1] = new IVec(20,10,20);
  cpts[3][0][0] = new IVec(30,0,0); cpts[3][0][1] = new IVec(30,0,20);
  cpts[3][1][0] = new IVec(30,5,0); cpts[3][1][1] = new IVec(30,5,20);
  cpts[3][2][0] = new IVec(30,10,0); cpts[3][2][1] = new IVec(30,10,20);
  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts, 3, 2, 1);

  int unum = 6;
  int vnum = 5;
  int wnum = 6;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;

  for(int i=0; i <= unum; i++){
    for(int j=0; j <= vnum; j++){
      for(int k=0; k <= wnum; k++){
        double u = i*uinc;
        double v = j*vinc;
        double w = k*winc;

        if(j%2==1){
          u += uinc/2;
        }
        if(k%3==1){
          u+=uinc/2;
          v-=vinc/3;
        }
        else if(k%3==2){
          u+=uinc/2;
          v+=vinc/3;
        }

        IVec uvw111 = new IVec(u,v,w);
        IVec uvw112 = new IVec(u-uinc/2, v-vinc/3, w+winc);
        IVec uvw212 = new IVec(u+uinc/2, v-vinc/3, w+winc);
        IVec uvw122 = new IVec(u, v+vinc*2/3, w+winc);
        IVec uvw211 = new IVec(u+uinc, v, w);
        IVec uvw221 = new IVec(u+uinc/2, v+vinc, w);
        IVec uvw121 = new IVec(u-uinc/2, v+vinc, w);
        IVec uvw222 = new IVec(u+uinc, v+vinc*2/3, w+winc);

        tetra1(vol.pt(uvw122),vol.pt(uvw111),vol.pt(uvw121),vol.pt(uvw221)).clr(1.0,0,1.0).layer("1");
        tetra2(vol.pt(uvw111),vol.pt(uvw212),vol.pt(uvw122),vol.pt(uvw112)).clr(0,0,1.0).layer("2");
        octa(vol.pt(uvw111),vol.pt(uvw211),vol.pt(uvw221),vol.pt(uvw212),vol.pt(uvw222),vol.pt(uvw122)).clr(0,1.0,1.0).layer("3");
      }
    }
  }
  vol.hide();
}

IBrep tetra1(IVec p1, IVec p2, IVec p3, IVec p4){
  ISurfaceGeo s1 = new ISurfaceGeo(p1,p2,p3);
  ISurfaceGeo s2 = new ISurfaceGeo(p1,p2,p4);
  ISurfaceGeo s3 = new ISurfaceGeo(p2,p3,p4);
  ISurfaceGeo s4 = new ISurfaceGeo(p3,p1,p4);
  return new IBrep(new ISurfaceGeo[]{ s1,s2,s3,s4 });
}

IBrep tetra2(IVec p1, IVec p2, IVec p3, IVec p4){
  ISurfaceGeo s1 = new ISurfaceGeo(p1,p2,p3);
  ISurfaceGeo s2 = new ISurfaceGeo(p1,p2,p4);
  ISurfaceGeo s3 = new ISurfaceGeo(p2,p3,p4);
  ISurfaceGeo s4 = new ISurfaceGeo(p3,p1,p4);
  return new IBrep(new ISurfaceGeo[]{ s1,s2,s3,s4 });
}

IBrep octa(IVec p1, IVec p2, IVec p3, IVec p4, IVec p5, IVec p6){
  ISurfaceGeo s1 = new ISurfaceGeo(p1,p2,p3);
  ISurfaceGeo s2 = new ISurfaceGeo(p1,p2,p4);
  ISurfaceGeo s3 = new ISurfaceGeo(p2,p3,p5);
  ISurfaceGeo s4 = new ISurfaceGeo(p3,p1,p6);
  ISurfaceGeo s5 = new ISurfaceGeo(p4,p5,p6);
  ISurfaceGeo s6 = new ISurfaceGeo(p4,p5,p2);
  ISurfaceGeo s7 = new ISurfaceGeo(p5,p6,p3);
  ISurfaceGeo s8 = new ISurfaceGeo(p6,p4,p1);
  return new IBrep(new ISurfaceGeo[]{ s1,s2,s3,s4,s5,s6,s7,s8 });
}


     Triangular Prism Grid

import processing.opengl.*;
import igeo.*;

void setup(){
  size(960, 720, IG.GL);

  // control points
  int rnum = 10;
  IVec[][][] cpts3 = new IVec[rnum+1][2][2];
  for(int i=0; i<=rnum; i++){
    cpts3[i][0][0] = new IVec(10,0,0).rot(i*PI/rnum/2);
    cpts3[i][1][0] = new IVec(15,0,0).rot(i*PI/rnum/2);
    cpts3[i][0][1] = new IVec(10,0,5+i*0.5).rot(i*PI/rnum/2);
    cpts3[i][1][1] = new IVec(15,0,5+i*0.5).rot(i*PI/rnum/2);
  }

  // creating NURBS IVolume
  IVolume vol = new IVolume(cpts3, 2, 1, 1);

  int unum = 18;
  int vnum = 9;
  int wnum = 12;
  double uinc = 1.0/unum;
  double vinc = 1.0/vnum;
  double winc = 1.0/wnum;

  IVec wdir = new IVec(0,vinc*2/3,winc).mul(2);
  IVec wstart = new IVec(uinc, 0, 0).mul(-unum);
  for(int k=0; k < wnum; k++, wstart.add(wdir)){
    IVec ustart = wstart.cp();
    IVec udir = new IVec(uinc,0,0).mul(2);
    for(int i=0; i <= unum*2; i++, ustart.add(udir)){
      IVec uvwdir = new IVec(uinc/2, vinc, 0);
      IVec uvw = ustart.cp().add(uvwdir, -unum);
      for(int j=0; j <= vnum*2; j++, uvw.add(uvwdir)){
        double u = uvw.x;
        double v = uvw.y;
        double w = uvw.z;

        if(u >= 0 && v >= 0 && w >= 0 && u <= 1 && v <= 1 && w <= 1){
          IVec uvw111 = new IVec(u,v,w);
          IVec uvw212 = new IVec(u+uinc/2, v-vinc/3, w+winc);
          IVec uvw122 = new IVec(u, v+vinc*2/3, w+winc);
          IVec uvw221 = new IVec(u+uinc/2, v+vinc, w);
          IVec uvw222 = new IVec(u+uinc, v+vinc*2/3, w+winc);
          IVec uvw232 = new IVec(u+uinc/2, v+vinc*5/3, w+winc);
          triangularPrism(vol, uvw212, uvw111, uvw122, uvw222, uvw221, uvw232).clr(0,1.0,1.0);
        }
      }
    }
  }

  IVec udir = new IVec(uinc, 0, 0).mul(2);
  IVec ustart = new IVec(0,0,0).add(udir, -unum);
  for(int i=0; i <= unum*2; i++, ustart.add(udir)){
    IVec vdir = new IVec(-uinc/2, vinc, 0).mul(2);
    IVec vstart = ustart.cp();
    for(int j=i%2; j <= vnum; j++, vstart.add(vdir)){
      IVec uvw = vstart.cp();
      IVec uvwinc = new IVec(uinc/2, -vinc/3, winc);
      for(int k=0; k < wnum; k++){
        double u = uvw.x;
        double v = uvw.y;
        double w = uvw.z;

        if(u >= 0 && v >= 0 && w >= 0 && u <= 1 && v <= 1 && w <= 1){
          IVec uvw111 = new IVec(u,v,w);
          IVec uvw212 = new IVec(u+uinc/2, v-vinc/3, w+winc);
          IVec uvw211 = new IVec(u+uinc, v, w);
          IVec uvw221 = new IVec(u+uinc/2, v+vinc, w);
          IVec uvw222 = new IVec(u+uinc, v+vinc*2/3, w+winc);
          IVec uvw210 = new IVec(u+uinc/2, v+vinc/3, w-winc);
          triangularPrism(vol, uvw111, uvw221, uvw210, uvw212, uvw222, uvw211).clr(0.5,0,1.);
        }
        uvw.add(uvwinc);
      }
    }
  }

  IVec udir2 = new IVec(uinc, 0, 0).mul(2);
  IVec ustart2 = new IVec(0,0,0).add(udir2, -unum).add(udir, 0.5);
  for(int i=0; i <= unum*2; i++, ustart2.add(udir2)){
    IVec vdir = new IVec(-uinc/2, vinc, 0).mul(2);
    IVec vstart = ustart2.cp().add(vdir, -vnum);
    for(int j=i%2; j <= vnum*2; j++, vstart.add(vdir)){
      IVec uvw = vstart.cp();
      IVec uvwinc = new IVec(0, vinc*2/3, winc);
      for(int k=0; k < wnum; k++, uvw.add(uvwinc)){
        double u = uvw.x;
        double v = uvw.y;
        double w = uvw.z;

        if(u >= 0 && v >= 0 && w >= 0 && u <= 1 && v <= 1 && w <= 1){
          IVec uvw101 = new IVec(u+uinc/2,v-vinc,w);
          IVec uvw111 = new IVec(u,v,w);
          IVec uvw212 = new IVec(u+uinc/2, v-vinc/3, w+winc);
          IVec uvw122 = new IVec(u, v+vinc*2/3, w+winc);
          IVec uvw211 = new IVec(u+uinc, v, w);
          IVec uvw222 = new IVec(u+uinc, v+vinc*2/3, w+winc);
          triangularPrism(vol, uvw111, uvw211, uvw101, uvw122, uvw222, uvw212).clr(1.0,0,0);
        }
      }
    }
  }
  vol.hide();
}

ISurface triangularPrism(IVolume vol, IVec uvw11, IVec uvw12, IVec uvw13, IVec uvw21, IVec uvw22, IVec uvw23){
  IVec[][] cpts = new IVec[3][2];
  cpts[0][0] = vol.pt(uvw11);
  cpts[1][0] = vol.pt(uvw12);
  cpts[2][0] = vol.pt(uvw13);
  cpts[0][1] = vol.pt(uvw21);
  cpts[1][1] = vol.pt(uvw22);
  cpts[2][1] = vol.pt(uvw23);
  return new ISurface(cpts, true, false);
}


(back to the list of tutorials)

HOME
FOR PROCESSING
DOWNLOAD
DOCUMENTS
TUTORIALS (Java / Python)
GALLERY
SOURCE CODE(GitHub)
PRIVACY POLICY
ABOUT/CONTACT