OSDN Git Service

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