Tutorials | (back to the list of tutorials) |
NURBS 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);
}
Points in NURBS 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 = 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
![]()
![]()
![]()
![]()
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
![]()
![]()
![]()
![]()
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
![]()
![]()
![]()
![]()
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
![]()
![]()
![]()
![]()
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
![]()
![]()
![]()
![]()
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![]()
![]()
![]()
![]()
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)![]()
![]()
![]()
![]()
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);
}
HOME
FOR PROCESSING
DOWNLOAD
DOCUMENTS
TUTORIALS (Java /
Python)
GALLERY
SOURCE CODE(GitHub)
PRIVACY POLICY
ABOUT/CONTACT