OSDN Git Service

git-svn-id: http://svn.sourceforge.jp/svnroot/nyartoolkit/NyARToolkit/trunk@808 7cac0...
[nyartoolkit-and/nyartoolkit-and.git] / lib / src.rpf / jp / nyatla / nyartoolkit / rpf / tracker / nyartk / status / NyARRectTargetStatusPool.java
1 package jp.nyatla.nyartoolkit.rpf.tracker.nyartk.status;\r
2 \r
3 import jp.nyatla.nyartoolkit.NyARException;\r
4 import jp.nyatla.nyartoolkit.core.types.NyARDoublePoint2d;\r
5 import jp.nyatla.nyartoolkit.core.types.NyARLinear;\r
6 import jp.nyatla.nyartoolkit.core.utils.NyARManagedObjectPool;\r
7 import jp.nyatla.nyartoolkit.rpf.utils.LineBaseVertexDetector;\r
8 import jp.nyatla.nyartoolkit.rpf.utils.VecLinearCoordinates;\r
9 import jp.nyatla.nyartoolkit.rpf.utils.VecLinearCoordinatesOperator;\r
10 \r
11 /**\r
12  * このクラスは、{@link NyARRectTargetStatus}型のプールクラスです。\r
13  * 通常、ユーザが使うことはありません。\r
14  */\r
15 public class NyARRectTargetStatusPool extends NyARManagedObjectPool<NyARRectTargetStatus>\r
16 {\r
17         /** 要素間で共有するオブジェクト。この変数は、NyARRectTargetStatus以外から使わないでください。*/\r
18         public VecLinearCoordinates _vecpos=new VecLinearCoordinates(100);\r
19         /** 要素間で共有するオブジェクト。この変数は、NyARRectTargetStatus以外から使わないでください。*/\r
20         public LineBaseVertexDetector _line_detect=new LineBaseVertexDetector();\r
21         /** 要素間で共有するオブジェクト。この変数は、NyARRectTargetStatus以外から使わないでください。*/\r
22         public VecLinearCoordinatesOperator _vecpos_op=new VecLinearCoordinatesOperator(); \r
23         /** 要素間で共有するオブジェクト。この変数は、NyARRectTargetStatus以外から使わないでください。*/\r
24         public VecLinearCoordinates.VecLinearCoordinatePoint[] _indexbuf=new VecLinearCoordinates.VecLinearCoordinatePoint[4];\r
25         /** 要素間で共有するオブジェクト。この変数は、NyARRectTargetStatus以外から使わないでください。*/\r
26         public NyARLinear[] _line=NyARLinear.createArray(4);\r
27         /**\r
28          * コンストラクタです。\r
29          * プールの最大サイズを利用して、インスタンスを生成します。\r
30          * @param i_size\r
31          * プールの最大サイズです。\r
32          * @throws NyARException\r
33          */\r
34         public NyARRectTargetStatusPool(int i_size) throws NyARException\r
35         {\r
36                 super.initInstance(i_size,NyARRectTargetStatus.class);\r
37         }\r
38         /**\r
39          * この関数は、リスト要素を生成して返します。\r
40          */     \r
41         protected NyARRectTargetStatus createElement()\r
42         {\r
43                 return new NyARRectTargetStatus(this);\r
44         }\r
45 \r
46         private final int[] __sq_table=new int[4];\r
47         /**\r
48          * この関数は、頂点同士の移動距離を測定して、極端に大きな差を含む点が無いかをチェックします。\r
49          * 点セット同士の順番は一致している必要があります。\r
50          * チェックルールは、頂点セット同士の差のうち一つが、全体の一定割合以上の誤差を持つかです。\r
51          * この関数は矩形の辺推定の誤認識対策用のコードですが、より良い方法が見つかったら消してもかまいません。\r
52          * @param i_point1\r
53          * 点セット1(4要素)\r
54          * @param i_point2\r
55          * 点セット2(4要素)\r
56          * @return\r
57          * 極端な点が無ければtrue\r
58          */\r
59         public final boolean checkLargeDiff(NyARDoublePoint2d[] i_point1,NyARDoublePoint2d[] i_point2)\r
60         {\r
61                 assert(i_point1.length==i_point2.length);\r
62                 int[] sq_tbl=this.__sq_table;\r
63                 int all=0;\r
64                 for(int i=3;i>=0;i--){\r
65                         sq_tbl[i]=(int)i_point1[i].sqDist(i_point2[i]);\r
66                         all+=sq_tbl[i];\r
67                 }\r
68                 //移動距離の2乗の平均値\r
69                 if(all<4){\r
70                         return true;\r
71                 }\r
72                 for(int i=3;i>=0;i--){\r
73                         //1個が全体の75%以上を持っていくのはおかしい。\r
74                         if(sq_tbl[i]*100/all>70){\r
75                                 return false;\r
76                         }\r
77                 }\r
78                 return true;\r
79         }       \r
80 \r
81 \r
82 }