OSDN Git Service

[リリース]NyARToolkit 1.0.0
[nyartoolkit-and/nyartoolkit-and.git] / src / jp / nyatla / nyartoolkit / core / NyARMarkerList.java
1 package jp.nyatla.nyartoolkit.core;\r
2 \r
3 import jp.nyatla.nyartoolkit.NyARException;\r
4 \r
5 /**\r
6  * このクラスは、detectMarkerがマーカーオブジェクトの蓄積に使うクラスです。\r
7  * 実体を伴うマーカーホルダと、これを参照するマーカーアレイを持ちます。\r
8  * \r
9  * マーカーアレイはマーカーホルダに存在するマーカーリストを特定の条件でフィルタした\r
10  * 結果を格納します。\r
11  * \r
12  * 一度作られたマーカーホルダは繰り返し使用されます。\r
13  * \r
14  *\r
15  */\r
16 public class NyARMarkerList\r
17 {\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
22     /**\r
23      * 派生データ型をラップするときに使う\r
24      * @param i_holder\r
25      * 値の保持配列。全要素に実体を割り当てる必要がある。\r
26      */\r
27     protected  NyARMarkerList(NyARMarker[] i_holder)\r
28     {\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
33     }\r
34     public NyARMarkerList(int i_number_of_holder)\r
35     {\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
40         }\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
44     }\r
45     /**\r
46      * 現在位置のマーカーホルダを返す。\r
47      * 現在位置が終端の場合関数は失敗する。\r
48      * @return\r
49      */\r
50     public final NyARMarker getCurrentHolder() throws NyARException\r
51     {\r
52         if(this.marker_holder_num>=this.marker_holder.length){\r
53             throw new NyARException();\r
54         }       \r
55         return this.marker_holder[this.marker_holder_num];\r
56     }\r
57     /**\r
58      * マーカーホルダの現在位置を1つ進めて、そのホルダを返す。\r
59      * この関数を実行すると、使用中のマーカーホルダの数が1個増える。\r
60      * @return\r
61      * 空いているマーカーホルダが無ければnullを返します。\r
62      *\r
63      */\r
64     public final NyARMarker getNextHolder()\r
65     {\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
69             return null;\r
70         }\r
71         this.marker_holder_num++;\r
72         return this.marker_holder[this.marker_holder_num];\r
73     }\r
74     /**\r
75      * マーカーアレイのi_indexの要素を返す。\r
76      * @param i_index\r
77      * @return\r
78      * @throws NyARException\r
79      */\r
80     public final NyARMarker getMarker(int i_index) throws NyARException\r
81     {\r
82         if(i_index>=marker_array_num){\r
83             throw new NyARException();\r
84         }\r
85         return this.marker_array[i_index];\r
86     }\r
87     /**\r
88      * マーカーアレイの要素数を返す。\r
89      * @return\r
90      */\r
91     public final int getMarkerNum()\r
92     {\r
93         return marker_array_num;\r
94     }\r
95     /**\r
96      * マーカーアレイの要素数と、マーカーホルダの現在位置をリセットする。\r
97      * @return\r
98      */\r
99     public final void reset()\r
100     {\r
101         this.marker_array_num=0;\r
102         this.marker_holder_num=0;\r
103     }\r
104     /**\r
105      * マーカーホルダに格納済みのマーカーから重なっているのものを除外して、\r
106      * マーカーアレイにフィルタ結果を格納します。\r
107      * [[この関数はマーカー検出処理と密接に関係する関数です。\r
108      * NyARDetectMarkerクラス以外から呼び出さないで下さい。]]\r
109      * メモ:この関数はmarker_holderの内容を変化させまするので注意。\r
110      */\r
111     public final void updateMarkerArray()\r
112     {\r
113         //重なり処理かな?\r
114         int i;\r
115         double d;\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
127                     }\r
128                 }else{\r
129                     if( d < marker_holder[j].area / 4 ) {\r
130                         marker_holder[i].area = 0;\r
131                     }\r
132                 }\r
133             }\r
134         }\r
135         //みつかったマーカーを整理する。\r
136         int l_array_num=0;\r
137         //エリアが0のマーカーを外した配列を作って、その数もついでに計算\r
138         for(i=0;i<marker_holder_num;i++){\r
139             if(marker_holder[i].area==0.0){\r
140                 continue;\r
141             }\r
142             marker_array[l_array_num]=marker_holder[i];\r
143             l_array_num++;\r
144         }\r
145         //マーカー個数を更新\r
146         this.marker_array_num=l_array_num;\r
147     }    \r
148 }