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

可変長配列

     ArrayListクラス

配列の長さは初期化時に固定され、その後は変更できません。

もしオブジェクトの集合のサイズに初期化後の修正が必要であれば、 配列の代わりにArrayListクラスを利用してください。 ArrayListの宣言は 配列の宣言IVec[]と異なり、 ArrayList<IVec>のように、型は< >の中に入れます。

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

size( 480, 360, IG.GL );

ArrayList< IVec > pointList = new ArrayList< IVec >(); //empty array

// adding vectors
pointList.add( new IVec(0,0,0) );
pointList.add( new IVec(20,0,0) );
pointList.add( new IVec(40,0,0) );
pointList.add( new IVec(60,0,0) );

// size() gives the length of the array 
for(int i=0; i < pointList.size(); i++){
  new IPoint( pointList.get(i) ); //access i-th member
}

// insert a vector at index 1.
pointList.add( 1, new IVec(0, 0, 30) );

// remove a vector at index 2.
pointList.remove( 2 );

// replace the vector at index 3 with a new one.
pointList.set( 3, new IVec(60, 0, 30) );

// convert into fixed size array with size() and for loop.
IVec[] fixedArray = new IVec[ pointList.size() ];
for(int i=0; i < pointList.size(); i++){
  fixedArray[i] = pointList.get(i);
}

// or shorter way to convert into fixed size array.
IVec[] fixedArray2 = 
  pointList.toArray( new IVec[ pointList.size() ] );

// creating a curve. 
new ICurve(fixedArray).clr(1.,0,0);

ArrayListクラスは要素の操作のためにそれぞれの役割を持ったメソッドを提供します。

  • add( member ) :  新しい要素をリストの最後尾に追加します。
  • add( index, member ) : 新しい要素を指定の位置に挿入し、その後方の要素すべてを後方に移動します。
  • set( index, member ) : 新しい要素を指定の位置の要素と置換します。
  • remove( index ) : 指定の位置の要素をリストから除外します。
  • get( index ) : 指定の位置の要素を参照します。
  • size() : 可変長配列のサイズを参照します。
  • toArray( fixed_array_with_same_length_or_less ) : 要素すべてを同じ順序のまま指定の固定長の配列に格納します。
ArrayListに関する詳細については Javaの公式ドキュメントを参照してください。

     2次元可変長配列

配列と同様にArrayListを用いても2次元構造を生成できます。 この場合のArrayListの宣言はArrayList<ArrayList<IVec>>のような 入れ子状になります。

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

size( 480, 360, IG.GL );

ArrayList < ArrayList < IVec > > ptlist2 = 
  new ArrayList < ArrayList < IVec > >();

for(int i=0; i < 100; i++ ){
  // needs to make a child list individually
  ArrayList < IVec > childList = new ArrayList < IVec >();
  int num = 0;
  if( i%11 == 0 ){ num = 110; }
  else if( i%8 == 0 ){ num = 80; }
  else if( i%7 == 0 ){ num = 70; }
  else if( i%5 == 0 ){ num = 50; }
  else if( i%4 == 0 ){ num = 40; }
  else if( i%3 == 0 ){ num = 30; }
  else if( i%2 == 0 ){ num = 20; }

  for(int j=0; j < num; j++){
    childList.add( new IVec( j, 50-i, j*j*0.01 ) );
  }
  // add the child list to the parent (ptlist2)
  ptlist2.add(childList);
}

// create curves
for(int i=0; i < ptlist2.size(); i++){
  // don't create curve if number of points is less than 2
  if( ptlist2.get(i).size() > 1 ){
    IVec[] fixedArray = 
      ptlist2.get(i).toArray(new IVec[ptlist2.get(i).size()]);
    new ICurve(fixedArray).clr(i*0.01);
  }
}


     ソーティング

ArrayListに格納されたIVecオブジェクトはISortクラスのメソッドでソートすることが可能です。

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

size( 480, 360, IG.GL );

ArrayList < IVec > pts = new ArrayList < IVec >();

for(int i=0; i < 100; i++){
  IVec p = IRandom.pt(-80,-80,0,80,80,0);
  pts.add(p);
} 

for(int i=0; i < pts.size(); i++){ new IPoint(pts.get(i)); }

// sort points in x direction (blue)
ISort.sort(pts, new IXComparator());
new ICurve(pts.toArray(new IVec[pts.size()])).clr(0,0,1.);

// sort points in y direction (cyan)
ISort.sort(pts, new IYComparator());
new ICurve(pts.toArray(new IVec[pts.size()])).clr(0,1.,1.);

// sort points in radial direction (red)
ISort.sort(pts, new IRadialComparator());
new ICurve(pts.toArray(new IVec[pts.size()])).clr(1.,0,0);

IRandom.pt()関数はそれぞれの座標軸の最小値・最大値からIVecオブジェクトをランダムに生成します。 ランダムな生成に関する詳細については乱数に関するチュートリアルを参照してください。

ISort.sort() はIVec型のArrayListといずれかの比較機構を引数に取ります。 IXComparatorはX軸の値を、 IYComparatorはY軸の値を、 IZComparatorはZ軸の値を、 IDirectionalComparatorはベクトルの角度を、 IRadialComparatorはベクトルのラジアンを、 IDistanceComparatorはベクトル長をそれぞれ比較して順番に並べます。


(トピック一覧へ戻る)

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