OSDN Git Service

初期インポート。
[nyartoolkit-and/nyartoolkit-android-0.9.git] / src / jp / nyatla / nyartoolkit / core / NyARMarkerList.java
diff --git a/src/jp/nyatla/nyartoolkit/core/NyARMarkerList.java b/src/jp/nyatla/nyartoolkit/core/NyARMarkerList.java
new file mode 100644 (file)
index 0000000..6e03c2f
--- /dev/null
@@ -0,0 +1,148 @@
+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