home processing download documents tutorial python tutorial gallery source about
 チュートリアル (トピック一覧へ戻る)

パネル化アルゴリズム

     矩形パネル化

曲面上の線のチュートリアル と同様に、2次元Forループとpt()メソッドを用いることによって 曲面のパネル化がなされます。 Forループ内でサンプルした4つの点から四角形の面を生成します。

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

size( 480, 360, IG.GL );

//IG.open("surface1.3dm");  //input geometry from 3dm file
IG.open("surface1.obj"); ///input geometry from OBJ file

ISurface[] surfs = IG.surfaces();

for( ISurface surf : surfs ){

  int unum = 8, vnum = 8;
  double uinc = 1.0/unum, vinc = 1.0/vnum;

  for(int i=0; i < unum; i++){
    for(int j=0; j < vnum; j++){
      IVec pt11 = surf.pt( i*uinc, j*vinc );
      IVec pt21 = surf.pt( (i+1)*uinc, j*vinc );
      IVec pt12 = surf.pt( i*uinc, (j+1)*vinc );
      IVec pt22 = surf.pt( (i+1)*uinc, (j+1)*vinc );
      new ISurface(pt11, pt21, pt22, pt12).clr(i*uinc,j*vinc,0);
    }
  }
  surf.del();
}


     三角パネル化

三角形のパネルを生成する単純な方法は、四角形のパネルに用いる4つの点から 3つずつ選択し、2つの三角形を生成することです。

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

size( 480, 360, IG.GL );

//IG.open("surface1.3dm");  //input geometry from 3dm file
IG.open("surface1.obj"); ///input geometry from OBJ file

ISurface[] surfs = IG.surfaces();

for( ISurface surf : surfs ){

  int unum = 8, vnum = 8;
  double uinc = 1.0/unum, vinc = 1.0/vnum;

  for(int i=0; i < unum; i++){
    for(int j=0; j < vnum; j++){
      IVec pt11 = surf.pt( i*uinc, j*vinc );
      IVec pt21 = surf.pt( (i+1)*uinc, j*vinc );
      IVec pt12 = surf.pt( i*uinc, (j+1)*vinc );
      IVec pt22 = surf.pt( (i+1)*uinc, (j+1)*vinc );
      new ISurface(pt11, pt21, pt22).clr(i*uinc,0,j*vinc);
      new ISurface(pt22, pt12, pt11).clr(1-i*uinc);
    }
  }
  surf.del();
}

3つの点の選択方法を変えることで、斜めの辺の向きを逆にすることができます。

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

size( 480, 360, IG.GL );

//IG.open("surface1.3dm");  //input geometry from 3dm file
IG.open("surface1.obj"); ///input geometry from OBJ file

ISurface[] surfs = IG.surfaces();

for( ISurface surf : surfs ){

  int unum = 8, vnum = 8;
  double uinc = 1.0/unum, vinc = 1.0/vnum;

  for(int i=0; i < unum; i++){
    for(int j=0; j < vnum; j++){
      IVec pt11 = surf.pt( i*uinc, j*vinc );
      IVec pt21 = surf.pt( (i+1)*uinc, j*vinc );
      IVec pt12 = surf.pt( i*uinc, (j+1)*vinc );
      IVec pt22 = surf.pt( (i+1)*uinc, (j+1)*vinc );
      new ISurface(pt11, pt21, pt12).clr(0,i*uinc,j*vinc);
      new ISurface(pt12, pt21, pt22).clr(1-i*uinc);
    }
  }
  surf.del();
}


     斜め格子上の三角パネル

三角形のパネルを生成するもう一つの方法は斜め格子(ダイアグリッド) に基づいたもので、以下のコードのように条件分岐 if( (i+j)%2 == 0 )を用います。

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

size( 480, 360, IG.GL );

//IG.open("surface1.3dm");  //input geometry from 3dm file
IG.open("surface1.obj"); ///input geometry from OBJ file

ISurface[] surfs = IG.surfaces();

for( ISurface surf : surfs ){

  int unum = 8, vnum = 8;
  double uinc = 1.0/unum, vinc = 1.0/vnum;

  for(int i=0; i < unum; i++){
    for(int j=0; j < vnum; j++){
      if( (i+j)%2 == 0 ){
        IVec pt1 = surf.pt( i*uinc, j*vinc );
        IVec pt2 = surf.pt( (i+1)*uinc, (j-1)*vinc );
        IVec pt3 = surf.pt( (i+1)*uinc, (j+1)*vinc );
        new ISurface(pt1, pt2, pt3).clr(0,i*uinc,j*vinc);
      }
      else{
        IVec pt1 = surf.pt( (i+1)*uinc, j*vinc );
        IVec pt2 = surf.pt( i*uinc, (j+1)*vinc );
        IVec pt3 = surf.pt( i*uinc, (j-1)*vinc );
        new ISurface(pt1, pt2, pt3).clr(1-i*uinc);
      }
    }
  }
  surf.del();
}

上記の方法では、横端のパネルの縁がもとの曲面に合わずにギザギザしてしまいます。 縁を合わせたい場合は、半分の三角形を端の位置にだけ生成します。 その場合、端の位置を判定するのにIF条件分岐を用います。

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

size( 480, 360, IG.GL );

//IG.open("surface1.3dm");  //input geometry from 3dm file
IG.open("surface1.obj"); ///input geometry from OBJ file

ISurface[] surfs = IG.surfaces();
for( ISurface surf : surfs ){

  int unum = 8, vnum = 8;
  double uinc = 1.0/unum, vinc = 1.0/vnum;
  IVec pt1, pt2, pt3;
  for(int i=0; i < unum; i++){
    for(int j=0; j < vnum; j++){
      if( (i+j)%2 == 0 ){
        pt1 = surf.pt( i*uinc, j*vinc );
        if( j > 0 ){
          pt2 = surf.pt( (i+1)*uinc, (j-1)*vinc );
        }
        else{
          pt2 = surf.pt( (i+1)*uinc, j*vinc );
        }
        if( j < vnum-1 ){
          pt3 = surf.pt( (i+1)*uinc, (j+1)*vinc );
        }
        else{
          pt3 = surf.pt( (i+1)*uinc, j*vinc );
	}
        new ISurface(pt1, pt2, pt3).clr(1,i*uinc,j*vinc);
      }
      else{
        pt1 = surf.pt( (i+1)*uinc, j*vinc );
        if( j < vnum-1 ){
          pt2 = surf.pt( i*uinc, (j+1)*vinc );
        }
        else{
          pt2 = surf.pt( i*uinc, j*vinc );
        }
        if( j > 0 ){
          pt3 = surf.pt( i*uinc, (j-1)*vinc );
        }
        else{
          pt3 = surf.pt( i*uinc, j*vinc );
	}
        new ISurface(pt1, pt2, pt3).clr(1-i*uinc);
      }
    }
  }
  surf.del();
}


     斜め格子上の菱型パネル

斜め格子の上に菱型のパネルを生成するには、 条件分岐 if( (i+j)%2 == 0 )を用いたうえで、 4点からパネルを生成します。

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

size( 480, 360, IG.GL );

//IG.open("surface1.3dm");  //input geometry from 3dm file
IG.open("surface1.obj"); ///input geometry from OBJ file

ISurface[] surfs = IG.surfaces();

for( ISurface surf : surfs ){

  int unum = 10, vnum = 10;
  double uinc = 1.0/unum, vinc = 1.0/vnum;

  for(int i=0; i <= unum; i++){
    for(int j=0; j < vnum; j++){
      if( (i+j)%2 == 0 ){
        IVec pt1 = surf.pt( (i-1)*uinc, j*vinc );
        IVec pt2 = surf.pt( i*uinc, (j-1)*vinc );
        IVec pt3 = surf.pt( (i+1)*uinc, j*vinc );
        IVec pt4 = surf.pt( i*uinc, (j+1)*vinc );
        new ISurface(pt1, pt2, pt3, pt4).clr(.5,i*uinc,j*vinc);
      }
    }
  }
  surf.del();
}

また角や縁がギザギザしてしまうのを避けたい場合は、 If条件分岐を用いて、 角や縁の位置で菱型を半分や四分の一にした三角形を配置します。

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

size( 480, 360, IG.GL );

//IG.open("surface1.3dm");  //input geometry from 3dm file
IG.open("surface1.obj"); ///input geometry from OBJ file

ISurface[] surfs = IG.surfaces();

for( ISurface surf : surfs ){

  int unum = 10, vnum = 10;
  double uinc = 1.0/unum, vinc = 1.0/vnum;
  IVec pt1, pt2, pt3, pt4;
  for(int i=0; i <= unum; i++){
    for(int j=0; j < vnum; j++){
      if( (i+j)%2 == 0 ){
        if(i > 0){
          pt1 = surf.pt( (i-1)*uinc, j*vinc );
        }
        else{
          pt1 = surf.pt( i*uinc, j*vinc );
        }
        if(i < unum){
          pt3 = surf.pt( (i+1)*uinc, j*vinc );
        }
        else{
          pt3 = surf.pt( i*uinc, j*vinc );
        }
        if(j > 0){
          pt2 = surf.pt( i*uinc, (j-1)*vinc );
        }
        else{
          pt2 = surf.pt( i*uinc, j*vinc );
        }
        if(j< vnum-1){
          pt4 = surf.pt( i*uinc, (j+1)*vinc );
        }
        else{
          pt4 = surf.pt( i*uinc, j*vinc );
        }
        new ISurface(pt1, pt2, pt3, pt4).clr(i*uinc,j*vinc,.5);
      }
    }
  }
  surf.del();
}


(トピック一覧へ戻る)

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