チュートリアル | (トピック一覧へ戻る) |
以下のコードでは、iとjを用いた2次元Forループによって、 格子上の点が曲面上にサンプルされます。 サンプルされる数はunum, vnumで指定されます。
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 pt = surf.pt( i*uinc, j*vinc ); new IPoint(pt).clr( i*uinc, j*vinc, 0); } } }
上記スケッチで用いられているsurf.pt( i*uinc, j*vinc )は曲面上の点をサンプルする基本的な方法です。
生成したまたは存在している幾何学オブジェクトを消去するには、そのオブジェクトのdel()メソッドを用います。
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 pt = surf.pt( i*uinc, j*vinc ); new IPoint(pt).clr( i*uinc, j*vinc, 0); } } surf.del(); }
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 pt1 = surf.pt(i*uinc, j*vinc); IVec pt2 = surf.pt((i+1)*uinc, j*vinc); new ICurve(pt1, pt2).clr(0); } } surf.del(); }
同様に、iとjの操作を入れ替えて、曲線を曲面のV方向に沿って生成することも可能です。
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 pt1 = surf.pt(i*uinc, j*vinc); IVec pt2 = surf.pt(i*uinc, (j+1)*vinc); new ICurve(pt1, pt2).clr(1.0); } } surf.del(); }
線を曲面のU方向とV方向の両方に生成することも可能です。 その場合、For文にIf文を加えてiとjが範囲の外に出ないようにします。
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 pt1 = surf.pt(i*uinc, j*vinc); if(i < unum){ IVec pt2u = surf.pt((i+1)*uinc, j*vinc); new ICurve(pt1, pt2u).clr(0); } if(j < vnum){ IVec pt2v = surf.pt(i*uinc, (j+1)*vinc); new ICurve(pt1, pt2v).clr(1.0); } } } surf.del(); }
上記のスケッチにおけるカウンター変数 i と j、点間距離uincとvincの関係を図で確認します。
For文がカウンター変数 i と jの値を増加させながら反復する際、それぞれの点が生成される座標も移動していきます。
i と j にある値を加えたり引いたりして座標の計算を変更することで、 上記の変数に相対的な距離・方向をもつ座標を生成できます。
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 pt1 = surf.pt(i*uinc, j*vinc); IVec pt2 = surf.pt((i+1)*uinc, (j+1)*vinc); new ICurve(pt1, pt2).clr(0,1.,1.); } } surf.del(); }
斜線の向きは上記の繋ぐ点の組み合わせによって変えることができます。
ここでは
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 pt1 = surf.pt(i*uinc, (j+1)*vinc); IVec pt2 = surf.pt((i+1)*uinc, j*vinc); new ICurve(pt1, pt2).clr(0,0,1.); } } surf.del(); }
以下のスケッチは斜線と格子線を両方曲面上に表示します。
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 pt1 = surf.pt(i*uinc, j*vinc); if(i < unum){ IVec pt2u = surf.pt((i+1)*uinc, j*vinc); new ICurve(pt1, pt2u).clr(0); } if(j < vnum){ IVec pt2v = surf.pt(i*uinc, (j+1)*vinc); new ICurve(pt1, pt2v).clr(1.0); } if(i < unum && j < vnum){ IVec pt2uv = surf.pt((i+1)*uinc, (j+1)*vinc); new ICurve(pt1, pt2uv).clr(0,1.,1.); } } } surf.del(); }
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); if( j > 0){ IVec pt2 = surf.pt((i+1)*uinc, (j-1)*vinc); new ICurve(pt1, pt2).clr(0); } if( j < vnum ){ IVec pt3 = surf.pt((i+1)*uinc, (j+1)*vinc); new ICurve(pt1, pt3).clr(0,0,1.); } } } } surf.del(); }
i と j の値の和が偶数であるとき生成される点の座標を図で確認します。
このとき
この「く」の字の線が反復されることで、斜め格子線が形成されます。
i と j の値の和が奇数であるとき
if( (i+j)%2 == 1
のみ線を生成するようスケッチを書き換えることで、格子線が反転されます。
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 == 1 ){ IVec pt1 = surf.pt(i*uinc, j*vinc); if( j > 0){ IVec pt2 = surf.pt((i+1)*uinc, (j-1)*vinc); new ICurve(pt1, pt2).clr(0); } if( j < vnum ){ IVec pt3 = surf.pt((i+1)*uinc, (j+1)*vinc); new ICurve(pt1, pt3).clr(0,0,1.); } } } } surf.del(); }
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 = 4; double uinc = 1.0/unum, vinc = 1.0/vnum; for(int i=0; i < unum; i++){ vnum++; vinc = 1.0/vnum; for(int j=0; j <= vnum; j++){ double vinc2 = 1.0/(vnum+1); IVec pt1 = surf.pt(i*uinc, j*vinc); IVec pt2 = surf.pt((i+1)*uinc, j*vinc2); IVec pt3 = surf.pt((i+1)*uinc, (j+1)*vinc2); new ICurve(pt1, pt2).clr(1.,0,0); new ICurve(pt1, pt3).clr(.5,0,1); } } surf.del(); }
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 = 20, vnum = 8; double uinc = 1.0/unum, vinc = 1.0/vnum; double r = 0.3; 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-r)*vinc); IVec pt2 = surf.pt(i*uinc, (j+r)*vinc); new ICurve(pt1, pt2).clr(1.,0,1.); if( i < unum ){ if( j > 0){ IVec pt3 = surf.pt((i+1)*uinc, (j-1+r)*vinc); new ICurve(pt1, pt3).clr(0); } if( j < vnum ){ IVec pt4 = surf.pt((i+1)*uinc, (j+1-r)*vinc); new ICurve(pt2, pt4).clr(0,0,1.); } } } } } surf.del(); }
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 = 12, vnum = 12; double uinc = 1.0/unum, vinc = 1.0/vnum; for(int i=0; i <= unum; i++){ for(int j=0; j <= vnum; j++){ IVec pt1 = surf.pt(i*uinc, j*vinc); if( (i+j)%3 == 0 ){ if( i < unum ){ IVec pt2 = surf.pt((i+1)*uinc, j*vinc); new ICurve(pt1, pt2).clr(0); // orthogonal line } if( j < vnum ){ IVec pt3 = surf.pt(i*uinc, (j+1)*vinc); new ICurve(pt1, pt3).clr(0.5); // orthogonal line } } if( (i+j)%3 == 1 ){ if( i < unum && j < vnum ){ IVec pt4 = surf.pt((i+1)*uinc, (j+1)*vinc); new ICurve(pt1, pt4).clr(1.,0,0); // diagonal line } } } } surf.del(); }
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); if( j > 0){ IVec pt2 = surf.pt((i+1)*uinc, (j-1)*vinc); new ICylinder(pt1, pt2, 0.5); } if( j < vnum ){ IVec pt3 = surf.pt((i+1)*uinc, (j+1)*vinc); new ICylinder(pt1, pt3, 0.5); } } } } surf.del(); }
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 = 12, vnum = 12; double uinc = 1.0/unum, vinc = 1.0/vnum; double depth = 3.0; for(int i=0; i <= unum; i++){ for(int j=0; j <= vnum; j++){ IVec pt1 = surf.pt(i*uinc, j*vinc); IVec pt1d = surf.pt(i*uinc, j*vinc, depth); if( (i+j)%3 == 0 ){ if( i < unum ){ IVec pt2 = surf.pt((i+1)*uinc, j*vinc); IVec pt2d = surf.pt((i+1)*uinc, j*vinc, depth); new ISurface(pt1, pt2, pt2d, pt1d).clr(0); } if( j < vnum ){ IVec pt3 = surf.pt(i*uinc, (j+1)*vinc); IVec pt3d = surf.pt(i*uinc, (j+1)*vinc, depth); new ISurface(pt1, pt3, pt3d, pt1d).clr(0.5); } } if( (i+j)%3 == 1 ){ if( i < unum && j < vnum ){ IVec pt4 = surf.pt((i+1)*uinc, (j+1)*vinc); IVec pt4d = surf.pt((i+1)*uinc, (j+1)*vinc, depth); new ISurface(pt1, pt4, pt4d, pt1d).clr(1.,0,0); } } } } surf.del(); }