1 package jp.nyatla.nyartoolkit.core;
\r
3 import jp.nyatla.nyartoolkit.NyARException;
\r
6 * このクラスは、detectMarkerがマーカーオブジェクトの蓄積に使うクラスです。
\r
7 * 実体を伴うマーカーホルダと、これを参照するマーカーアレイを持ちます。
\r
9 * マーカーアレイはマーカーホルダに存在するマーカーリストを特定の条件でフィルタした
\r
12 * 一度作られたマーカーホルダは繰り返し使用されます。
\r
16 public class NyARMarkerList
\r
18 private int marker_holder_num;//marker_holderの使用中の数
\r
19 protected int marker_array_num;//marker_arrayの有効な数
\r
20 protected final NyARMarker[] marker_holder;//マーカーデータの保持配列
\r
21 protected final NyARMarker[] marker_array; //マーカーデータのインデックス配列
\r
25 * 値の保持配列。全要素に実体を割り当てる必要がある。
\r
27 protected NyARMarkerList(NyARMarker[] i_holder)
\r
29 this.marker_holder=i_holder;
\r
30 this.marker_array =new NyARMarker[i_holder.length];
\r
31 this.marker_array_num =0;
\r
32 this.marker_holder_num =0;
\r
34 public NyARMarkerList(int i_number_of_holder)
\r
36 this.marker_holder=new NyARMarker[i_number_of_holder];
\r
37 //先にマーカーホルダにオブジェクトを作っておく
\r
38 for(int i=0;i<i_number_of_holder;i++){
\r
39 this.marker_holder[i]=new NyARMarker();
\r
41 this.marker_array =new NyARMarker[this.marker_holder.length];
\r
42 this.marker_array_num =0;
\r
43 this.marker_holder_num =0;
\r
47 * 現在位置が終端の場合関数は失敗する。
\r
50 public final NyARMarker getCurrentHolder() throws NyARException
\r
52 if(this.marker_holder_num>=this.marker_holder.length){
\r
53 throw new NyARException();
\r
55 return this.marker_holder[this.marker_holder_num];
\r
58 * マーカーホルダの現在位置を1つ進めて、そのホルダを返す。
\r
59 * この関数を実行すると、使用中のマーカーホルダの数が1個増える。
\r
61 * 空いているマーカーホルダが無ければnullを返します。
\r
64 public final NyARMarker getNextHolder()
\r
66 //現在位置が終端位置ならnullを返す。
\r
67 if(this.marker_holder_num+1>=this.marker_holder.length){
\r
68 this.marker_holder_num=this.marker_holder.length;
\r
71 this.marker_holder_num++;
\r
72 return this.marker_holder[this.marker_holder_num];
\r
75 * マーカーアレイのi_indexの要素を返す。
\r
78 * @throws NyARException
\r
80 public final NyARMarker getMarker(int i_index) throws NyARException
\r
82 if(i_index>=marker_array_num){
\r
83 throw new NyARException();
\r
85 return this.marker_array[i_index];
\r
91 public final int getMarkerNum()
\r
93 return marker_array_num;
\r
96 * マーカーアレイの要素数と、マーカーホルダの現在位置をリセットする。
\r
99 public final void reset()
\r
101 this.marker_array_num=0;
\r
102 this.marker_holder_num=0;
\r
105 * マーカーホルダに格納済みのマーカーから重なっているのものを除外して、
\r
106 * マーカーアレイにフィルタ結果を格納します。
\r
107 * [[この関数はマーカー検出処理と密接に関係する関数です。
\r
108 * NyARDetectMarkerクラス以外から呼び出さないで下さい。]]
\r
109 * メモ:この関数はmarker_holderの内容を変化させまするので注意。
\r
111 public final void updateMarkerArray()
\r
116 double[] pos_j,pos_i;
\r
117 // NyARMarker[] marker_holder;
\r
118 for(i=0; i < this.marker_holder_num; i++ ){
\r
119 pos_i=marker_holder[i].pos;
\r
120 for(int j=i+1; j < this.marker_holder_num; j++ ) {
\r
121 pos_j=marker_holder[j].pos;
\r
122 d = (pos_i[0] - pos_j[0])*(pos_i[0] - pos_j[0])+
\r
123 (pos_i[1] - pos_j[1])*(pos_i[1] - pos_j[1]);
\r
124 if(marker_holder[i].area >marker_holder[j].area ) {
\r
125 if( d <marker_holder[i].area / 4 ) {
\r
126 marker_holder[j].area = 0;
\r
129 if( d < marker_holder[j].area / 4 ) {
\r
130 marker_holder[i].area = 0;
\r
137 //エリアが0のマーカーを外した配列を作って、その数もついでに計算
\r
138 for(i=0;i<marker_holder_num;i++){
\r
139 if(marker_holder[i].area==0.0){
\r
142 marker_array[l_array_num]=marker_holder[i];
\r
146 this.marker_array_num=l_array_num;
\r