--- /dev/null
+package jp.nyatla.nyartoolkit.core;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+\r
+/**\r
+ * このクラスは、detectMarkerがマーカーオブジェクトの蓄積に使うクラスです。\r
+ * 実体を伴うマーカーホルダと、これを参照するマーカーアレイを持ちます。\r
+ * \r
+ * マーカーアレイはマーカーホルダに存在するマーカーリストを特定の条件でフィルタした\r
+ * 結果を格納します。\r
+ * \r
+ * 一度作られたマーカーホルダは繰り返し使用されます。\r
+ * \r
+ *\r
+ */\r
+public class NyARMarkerList\r
+{\r
+ private int marker_holder_num;//marker_holderの使用中の数\r
+ protected int marker_array_num;//marker_arrayの有効な数\r
+ protected final NyARMarker[] marker_holder;//マーカーデータの保持配列\r
+ protected final NyARMarker[] marker_array; //マーカーデータのインデックス配列\r
+ /**\r
+ * 派生データ型をラップするときに使う\r
+ * @param i_holder\r
+ * 値の保持配列。全要素に実体を割り当てる必要がある。\r
+ */\r
+ protected NyARMarkerList(NyARMarker[] i_holder)\r
+ {\r
+ this.marker_holder=i_holder;\r
+ this.marker_array =new NyARMarker[i_holder.length];\r
+ this.marker_array_num =0;\r
+ this.marker_holder_num =0;\r
+ }\r
+ public NyARMarkerList(int i_number_of_holder)\r
+ {\r
+ this.marker_holder=new NyARMarker[i_number_of_holder];\r
+ //先にマーカーホルダにオブジェクトを作っておく\r
+ for(int i=0;i<i_number_of_holder;i++){\r
+ this.marker_holder[i]=new NyARMarker();\r
+ }\r
+ this.marker_array =new NyARMarker[this.marker_holder.length];\r
+ this.marker_array_num =0;\r
+ this.marker_holder_num =0;\r
+ }\r
+ /**\r
+ * 現在位置のマーカーホルダを返す。\r
+ * 現在位置が終端の場合関数は失敗する。\r
+ * @return\r
+ */\r
+ public final NyARMarker getCurrentHolder() throws NyARException\r
+ {\r
+ if(this.marker_holder_num>=this.marker_holder.length){\r
+ throw new NyARException();\r
+ } \r
+ return this.marker_holder[this.marker_holder_num];\r
+ }\r
+ /**\r
+ * マーカーホルダの現在位置を1つ進めて、そのホルダを返す。\r
+ * この関数を実行すると、使用中のマーカーホルダの数が1個増える。\r
+ * @return\r
+ * 空いているマーカーホルダが無ければnullを返します。\r
+ *\r
+ */\r
+ public final NyARMarker getNextHolder()\r
+ {\r
+ //現在位置が終端位置ならnullを返す。\r
+ if(this.marker_holder_num+1>=this.marker_holder.length){\r
+ this.marker_holder_num=this.marker_holder.length;\r
+ return null;\r
+ }\r
+ this.marker_holder_num++;\r
+ return this.marker_holder[this.marker_holder_num];\r
+ }\r
+ /**\r
+ * マーカーアレイのi_indexの要素を返す。\r
+ * @param i_index\r
+ * @return\r
+ * @throws NyARException\r
+ */\r
+ public final NyARMarker getMarker(int i_index) throws NyARException\r
+ {\r
+ if(i_index>=marker_array_num){\r
+ throw new NyARException();\r
+ }\r
+ return this.marker_array[i_index];\r
+ }\r
+ /**\r
+ * マーカーアレイの要素数を返す。\r
+ * @return\r
+ */\r
+ public final int getMarkerNum()\r
+ {\r
+ return marker_array_num;\r
+ }\r
+ /**\r
+ * マーカーアレイの要素数と、マーカーホルダの現在位置をリセットする。\r
+ * @return\r
+ */\r
+ public final void reset()\r
+ {\r
+ this.marker_array_num=0;\r
+ this.marker_holder_num=0;\r
+ }\r
+ /**\r
+ * マーカーホルダに格納済みのマーカーから重なっているのものを除外して、\r
+ * マーカーアレイにフィルタ結果を格納します。\r
+ * [[この関数はマーカー検出処理と密接に関係する関数です。\r
+ * NyARDetectMarkerクラス以外から呼び出さないで下さい。]]\r
+ * メモ:この関数はmarker_holderの内容を変化させまするので注意。\r
+ */\r
+ public final void updateMarkerArray()\r
+ {\r
+ //重なり処理かな?\r
+ int i;\r
+ double d;\r
+ double[] pos_j,pos_i;\r
+// NyARMarker[] marker_holder;\r
+ for(i=0; i < this.marker_holder_num; i++ ){\r
+ pos_i=marker_holder[i].pos;\r
+ for(int j=i+1; j < this.marker_holder_num; j++ ) {\r
+ pos_j=marker_holder[j].pos;\r
+ d = (pos_i[0] - pos_j[0])*(pos_i[0] - pos_j[0])+\r
+ (pos_i[1] - pos_j[1])*(pos_i[1] - pos_j[1]);\r
+ if(marker_holder[i].area >marker_holder[j].area ) {\r
+ if( d <marker_holder[i].area / 4 ) {\r
+ marker_holder[j].area = 0;\r
+ }\r
+ }else{\r
+ if( d < marker_holder[j].area / 4 ) {\r
+ marker_holder[i].area = 0;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ //みつかったマーカーを整理する。\r
+ int l_array_num=0;\r
+ //エリアが0のマーカーを外した配列を作って、その数もついでに計算\r
+ for(i=0;i<marker_holder_num;i++){\r
+ if(marker_holder[i].area==0.0){\r
+ continue;\r
+ }\r
+ marker_array[l_array_num]=marker_holder[i];\r
+ l_array_num++;\r
+ }\r
+ //マーカー個数を更新\r
+ this.marker_array_num=l_array_num;\r
+ } \r
+}
\ No newline at end of file