OSDN Git Service

git-svn-id: http://svn.sourceforge.jp/svnroot/nyartoolkit/NyARToolkit/trunk@673 7cac0...
[nyartoolkit-and/nyartoolkit-and.git] / lib / src.rpf / jp / nyatla / nyartoolkit / rpf / utils / VecLinearCoordinates.java
1 package jp.nyatla.nyartoolkit.dev.rpf.utils;\r
2 \r
3 import jp.nyatla.nyartoolkit.core.types.NyARDoublePoint2d;\r
4 import jp.nyatla.nyartoolkit.core.types.NyARLinear;\r
5 import jp.nyatla.nyartoolkit.core.types.NyARVecLinear2d;\r
6 \r
7 public class VecLinearCoordinates\r
8 {       \r
9         /**\r
10          * データ型です。\r
11          * 輪郭ベクトルを格納します。\r
12          */\r
13         public static class NyARVecLinearPoint extends NyARVecLinear2d\r
14         {\r
15                 /**\r
16                  * ベクトルの2乗値です。輪郭の強度値にもなります。\r
17                  */\r
18                 public double scalar;\r
19                 public static NyARVecLinearPoint[] createArray(int i_length)\r
20                 {\r
21                         NyARVecLinearPoint[] r=new NyARVecLinearPoint[i_length];\r
22                         for(int i=0;i<i_length;i++){\r
23                                 r[i]=new NyARVecLinearPoint();\r
24                         }\r
25                         return r;\r
26                 }\r
27         }       \r
28         public int length;\r
29         public NyARVecLinearPoint items[];\r
30 \r
31         public VecLinearCoordinates(int i_length)\r
32         {\r
33                 this.length = 0;\r
34                 this.items = NyARVecLinearPoint.createArray(i_length);\r
35         }\r
36         /**\r
37          * ベクトルを1,2象限に制限します。\r
38          */\r
39         public final void limitQuadrantTo12()\r
40         {\r
41                 for (int i = this.length - 1; i >= 0; i--) {\r
42                         VecLinearCoordinates.NyARVecLinearPoint target1 = this.items[i];\r
43                         if (target1.dy < 0) {\r
44                                 target1.dy *= -1;\r
45                                 target1.dx *= -1;\r
46                         }\r
47                 }\r
48         }\r
49         \r
50 \r
51         /**\r
52          * 輪郭配列から、から、キーのベクトル(絶対値の大きいベクトル)を順序を壊さずに抽出します。\r
53          * \r
54          * @param i_vecpos\r
55          *            抽出元の\r
56          * @param i_len\r
57          * @param o_index\r
58          *            インデクス番号を受け取る配列。受け取るインデックスの個数は、この配列の数と同じになります。\r
59          */\r
60         public void getOrderdKeyCoordIndexes(int[] o_index)\r
61         {\r
62                 getKeyCoordIndexes(o_index);\r
63                 // idxでソート\r
64                 int out_len_1 = o_index.length - 1;\r
65                 for (int i = 0; i < out_len_1;) {\r
66                         if (o_index[i] > o_index[i + 1]) {\r
67                                 int t = o_index[i];\r
68                                 o_index[i] = o_index[i + 1];\r
69                                 o_index[i + 1] = t;\r
70                                 i = 0;\r
71                                 continue;\r
72                         }\r
73                         i++;\r
74                 }\r
75                 return;\r
76         }\r
77         public void getKeyCoordIndexes(int[] o_index)\r
78         {\r
79                 NyARVecLinearPoint[] vp = this.items;\r
80                 assert (o_index.length <= this.length);\r
81                 int i;\r
82                 int out_len = o_index.length;\r
83                 int out_len_1 = out_len - 1;\r
84                 for (i = out_len - 1; i >= 0; i--) {\r
85                         o_index[i] = i;\r
86                 }\r
87                 // sqdistでソートする(B->S)\r
88                 for (i = 0; i < out_len_1;) {\r
89                         if (vp[o_index[i]].scalar < vp[o_index[i + 1]].scalar) {\r
90                                 int t = o_index[i];\r
91                                 o_index[i] = o_index[i + 1];\r
92                                 o_index[i + 1] = t;\r
93                                 i = 0;\r
94                                 continue;\r
95                         }\r
96                         i++;\r
97                 }\r
98                 // 先に4個をsq_distでソートしながら格納\r
99                 for (i = out_len; i < this.length; i++) {\r
100                         // 配列の値と比較\r
101                         for (int i2 = 0; i2 < out_len; i2++) {\r
102                                 if (vp[i].scalar > vp[o_index[i2]].scalar) {\r
103                                         // 値挿入の為のシフト\r
104                                         for (int i3 = out_len - 1; i3 > i2; i3--) {\r
105                                                 o_index[i3] = o_index[i3 - 1];\r
106                                         }\r
107                                         // 設定\r
108                                         o_index[i2] = i;\r
109                                         break;\r
110                                 }\r
111                         }\r
112                 }\r
113                 return;\r
114         }\r
115         public void getKeyCoord(NyARVecLinearPoint[] o_index)\r
116         {\r
117                 NyARVecLinearPoint[] vp = this.items;\r
118                 assert (o_index.length <= this.length);\r
119                 int i;\r
120                 int out_len = o_index.length;\r
121                 int out_len_1 = out_len - 1;\r
122                 for (i = out_len - 1; i >= 0; i--) {\r
123                         o_index[i] = vp[i];\r
124                 }\r
125                 // sqdistでソートする(B->S)\r
126                 for (i = 0; i < out_len_1;) {\r
127                         if (o_index[i].scalar < o_index[i + 1].scalar) {\r
128                                 NyARVecLinearPoint t = o_index[i];\r
129                                 o_index[i] = o_index[i + 1];\r
130                                 o_index[i + 1] = t;\r
131                                 i = 0;\r
132                                 continue;\r
133                         }\r
134                         i++;\r
135                 }\r
136                 // 先に4個をsq_distでソートしながら格納\r
137                 for (i = out_len; i < this.length; i++) {\r
138                         // 配列の値と比較\r
139                         for (int i2 = 0; i2 < out_len; i2++) {\r
140                                 if (vp[i].scalar > o_index[i2].scalar) {\r
141                                         // 値挿入の為のシフト\r
142                                         for (int i3 = out_len - 1; i3 > i2; i3--) {\r
143                                                 o_index[i3] = o_index[i3 - 1];\r
144                                         }\r
145                                         // 設定\r
146                                         o_index[i2] = vp[i];\r
147                                         break;\r
148                                 }\r
149                         }\r
150                 }\r
151                 return;\r
152         }       \r
153         \r
154         /**\r
155          * 最も大きいベクトル成分のインデクスを返します。\r
156          * \r
157          * @return\r
158          */\r
159         public final int getMaxCoordIndex()\r
160         {\r
161                 NyARVecLinearPoint[] vp = this.items;\r
162                 int index = 0;\r
163                 double max_dist = vp[0].scalar;\r
164                 for (int i = this.length - 1; i > 0; i--) {\r
165                         if (max_dist < vp[i].scalar) {\r
166                                 max_dist = vp[i].scalar;\r
167                                 index = i;\r
168                         }\r
169                 }\r
170                 return index;\r
171         }\r
172 \r
173 \r
174         /**\r
175          * ノイズレベルを指定して、ノイズ(だと思われる)ベクトルを削除します。\r
176          */\r
177         /**\r
178          * 大きさ(sq_dist)が0のベクトルを削除して、要素を前方に詰めます。\r
179          */\r
180         public void removeZeroDistItem()\r
181         {\r
182                 //前方詰め\r
183                 int idx=0;\r
184                 final int len=this.length;\r
185                 for(int i=0;i<len;i++){\r
186                         if(this.items[i].scalar!=0){\r
187                                 idx++;\r
188                                 continue;\r
189                         }\r
190                         for(i=i+1;i<len;i++){\r
191                                 if(this.items[i].scalar!=0){\r
192                                         NyARVecLinearPoint temp = this.items[i];\r
193                                         this.items[i]=this.items[idx];\r
194                                         this.items[idx]=temp;\r
195                                         idx++;\r
196                                         i--;\r
197                                         break;\r
198                                 }\r
199                         }\r
200                 }\r
201                 this.length=idx;\r
202                 return;\r
203         }\r
204 }\r