Subversion Repositories AndroidProjects

Rev

Details | Last modification | View Log | RSS feed

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