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

パネル化アルゴリズム例

     パネル化アルゴリズム例その8

以下の例では2つの入力曲面から、その間の空間に幾何学オブジェクトを生成します。 2つの入力曲面を扱う場合、2つの変数を用意し(surfA, surfB)、それぞれの変数を用いて 曲面上の点を取得します。なお、独自の入力ファイルを用いる場合、もしもそのファイルに曲面が2つ含まれていない 場合はエラーになるので注意してください。 以下のコードでは各々の曲面からサンプルされた点をつないで線を生成します。

surface9.3dm

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

size(480, 360, IG.GL);

IG.open("surface9.3dm");
ISurface[] surfaces = IG.surfaces();

ISurface surfA = surfaces[0];
ISurface surfB = surfaces[1];

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++) {
    IVec ptA = surfA.pt( i*uinc, j*vinc );
    IVec ptB = surfB.pt( i*uinc, j*vinc );
    new ICurve(ptA, ptB).clr(1.0,0,0);
  }
}

次にForループ内で、各々の曲面から4つの点をサンプルし、それを組み合わせて5つの線を生成します。

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

size(480, 360, IG.GL);

IG.open("surface9.3dm");
ISurface[] surfaces = IG.surfaces();

ISurface surfA = surfaces[0];
ISurface surfB = surfaces[1];

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++) {
    IVec ptA11 = surfA.pt( i*uinc, j*vinc );
    IVec ptA21 = surfA.pt( (i + 1)*uinc, j*vinc );
    IVec ptA12 = surfA.pt( i*uinc, (j + 1)*vinc);
    IVec ptA22 = surfA.pt( (i + 1)*uinc, (j + 1)*vinc );

    IVec ptB11 = surfB.pt( i*uinc, j*vinc );
    IVec ptB21 = surfB.pt( (i + 1)*uinc, j*vinc );
    IVec ptB12 = surfB.pt( i*uinc, (j + 1)*vinc);
    IVec ptB22 = surfB.pt( (i + 1)*uinc, (j + 1)*vinc );

    new ICurve(ptA11, ptB11).clr(1.,0,0);
    new ICurve(ptA11, ptB22).clr(0,0,0.5);
    new ICurve(ptA12, ptB12).clr(1.0,0,1.0);
    new ICurve(ptA12, ptB21).clr(0.5,0,0.5);
    new ICurve(ptA21, ptB11).clr(0);
  }
}
surfA.del();
surfB.del();

最後に線をもとにパイプ曲面を、4点から2つの三角形パネルを、4点からフレーム状の矩形のパイプを それぞれの入力曲面上に生成します。

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

size(480, 360, IG.GL);

IG.open("surface9.3dm");
ISurface[] surfaces = IG.surfaces();

ISurface surfA = surfaces[0];
ISurface surfB = surfaces[1];

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++) {
    IVec ptA11 = surfA.pt( i*uinc, j*vinc );
    IVec ptA21 = surfA.pt( (i + 1)*uinc, j*vinc );
    IVec ptA12 = surfA.pt( i*uinc, (j + 1)*vinc);
    IVec ptA22 = surfA.pt( (i + 1)*uinc, (j + 1)*vinc );

    IVec ptB11 = surfB.pt( i*uinc, j*vinc );
    IVec ptB21 = surfB.pt( (i + 1)*uinc, j*vinc );
    IVec ptB12 = surfB.pt( i*uinc, (j + 1)*vinc);
    IVec ptB22 = surfB.pt( (i + 1)*uinc, (j + 1)*vinc );

    // triangular panels
    new ISurface(ptA11,ptA21,ptA22).clr(i*uinc,j*vinc,0,0.5);
    new ISurface(ptA22,ptA12,ptA11).clr(i*uinc,j*vinc,0,0.5);
    new ISurface(ptB11,ptB21,ptB12).clr(0,i*uinc,j*vinc,0.5);
    new ISurface(ptB21,ptB22,ptB12).clr(0,i*uinc,j*vinc,0.5);

    // frame of panels (square-piping with degree 1, closed)
    double size = 0.2;
    IG.squarePipe(new IVec[]{ptA11,ptA21,ptA22},1,true,size).clr(.2);
    IG.squarePipe(new IVec[]{ptA22,ptA12,ptA11},1,true,size).clr(0.2);
    IG.squarePipe(new IVec[]{ptB11,ptB21,ptB12},1,true,size).clr(0.2);
    IG.squarePipe(new IVec[]{ptB21,ptB22,ptB12},1,true,size).clr(0.2);

    // pipe between two surfaces
    double radius = 0.1;
    new ICylinder(ptA11, ptB11, radius).clr(1.,0,0);
    new ICylinder(ptA11, ptB22, radius).clr(0,0,0.5);
    new ICylinder(ptA12, ptB12, radius).clr(1.0,0,1.0);
    new ICylinder(ptA12, ptB21, radius).clr(0.5,0,0.5);
    new ICylinder(ptA21, ptB11, radius).clr(0);
  }
}
surfA.del();
surfB.del();


(トピック一覧へ戻る)

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