1 package jp.nyatla.nyartoolkit.rpf.utils;
\r
3 import jp.nyatla.nyartoolkit.core.types.NyARVecLinear2d;
\r
6 * このクラスは、RFFパッケージが使う輪郭データのリストです。
\r
7 * リスト要素に対する計算機能と、リストの操作機能を提供します。
\r
10 public class VecLinearCoordinates
\r
14 * {@link NyARVecLinear2d}に輪郭強度値を追加したものです。
\r
16 public static class VecLinearCoordinatePoint extends NyARVecLinear2d
\r
19 * ベクトルの2乗値です。輪郭の強度値にもなります。
\r
21 public double scalar;
\r
22 public static VecLinearCoordinatePoint[] createArray(int i_length)
\r
24 VecLinearCoordinatePoint[] r=new VecLinearCoordinatePoint[i_length];
\r
25 for(int i=0;i<i_length;i++){
\r
26 r[i]=new VecLinearCoordinatePoint();
\r
32 * [read only] リストの有効な長さです。
\r
37 * この長さは、有効なデータの長さで無いことに注意してください。有効な長さは、{@link #length}から得られます。
\r
39 public VecLinearCoordinatePoint[] items;
\r
46 public VecLinearCoordinates(int i_length)
\r
49 this.items = VecLinearCoordinatePoint.createArray(i_length);
\r
52 * この関数は、要素のベクトルを、1,2象限方向に制限します。
\r
54 public final void limitQuadrantTo12()
\r
56 for (int i = this.length - 1; i >= 0; i--) {
\r
57 VecLinearCoordinates.VecLinearCoordinatePoint target1 = this.items[i];
\r
58 if (target1.dy < 0) {
\r
65 * この関数は、輪郭配列からキーのベクトル(絶対値の大きいベクトル)を抽出して、そのインデクスを配列に返します。
\r
66 * 抽出したベクトルの順序は、元の配列と同じです。
\r
68 * インデクス番号を受け取る配列。受け取るインデックスの個数は、この配列の数と同じになります。
\r
70 public void getOrderdKeyCoordIndexes(int[] o_index)
\r
72 getKeyCoordIndexes(o_index);
\r
74 int out_len_1 = o_index.length - 1;
\r
75 for (int i = 0; i < out_len_1;) {
\r
76 if (o_index[i] > o_index[i + 1]) {
\r
78 o_index[i] = o_index[i + 1];
\r
88 * この関数は、輪郭配列からキーのベクトル(絶対値の大きいベクトル)を抽出して、そのインデクスを配列に返します。
\r
89 * 抽出したベクトルの順序は、元の配列と異なります。そのかわり、{@link #getOrderdKeyCoordIndexes}より若干高速です。
\r
91 * インデクス番号を受け取る配列。受け取るインデックスの個数は、この配列の数と同じになります。
\r
93 public void getKeyCoordIndexes(int[] o_index)
\r
95 VecLinearCoordinatePoint[] vp = this.items;
\r
96 assert (o_index.length <= this.length);
\r
98 int out_len = o_index.length;
\r
99 int out_len_1 = out_len - 1;
\r
100 for (i = out_len - 1; i >= 0; i--) {
\r
103 // sqdistでソートする(B->S)
\r
104 for (i = 0; i < out_len_1;) {
\r
105 if (vp[o_index[i]].scalar < vp[o_index[i + 1]].scalar) {
\r
106 int t = o_index[i];
\r
107 o_index[i] = o_index[i + 1];
\r
108 o_index[i + 1] = t;
\r
114 // 先に4個をsq_distでソートしながら格納
\r
115 for (i = out_len; i < this.length; i++) {
\r
117 for (int i2 = 0; i2 < out_len; i2++) {
\r
118 if (vp[i].scalar > vp[o_index[i2]].scalar) {
\r
120 for (int i3 = out_len - 1; i3 > i2; i3--) {
\r
121 o_index[i3] = o_index[i3 - 1];
\r
132 * この関数は、輪郭配列からキーのベクトル(絶対値の大きいベクトル)を抽出して、そのオブジェクトの参照値を配列に返します。
\r
133 * 抽出したベクトルの順序は、元の配列と異なります。
\r
135 * オブジェクトの参照値を受け取る配列。受け取るオブジェクトの個数は、この配列の数と同じになります。
\r
137 public void getKeyCoord(VecLinearCoordinatePoint[] o_index)
\r
139 VecLinearCoordinatePoint[] vp = this.items;
\r
140 assert (o_index.length <= this.length);
\r
142 int out_len = o_index.length;
\r
143 int out_len_1 = out_len - 1;
\r
144 for (i = out_len - 1; i >= 0; i--) {
\r
145 o_index[i] = vp[i];
\r
147 // sqdistでソートする(B->S)
\r
148 for (i = 0; i < out_len_1;) {
\r
149 if (o_index[i].scalar < o_index[i + 1].scalar) {
\r
150 VecLinearCoordinatePoint t = o_index[i];
\r
151 o_index[i] = o_index[i + 1];
\r
152 o_index[i + 1] = t;
\r
158 // 先に4個をsq_distでソートしながら格納
\r
159 for (i = out_len; i < this.length; i++) {
\r
161 for (int i2 = 0; i2 < out_len; i2++) {
\r
162 if (vp[i].scalar > o_index[i2].scalar) {
\r
164 for (int i3 = out_len - 1; i3 > i2; i3--) {
\r
165 o_index[i3] = o_index[i3 - 1];
\r
168 o_index[i2] = vp[i];
\r
177 * この関数は、最も大きいベクトル成分のインデクスを返します。
\r
181 public final int getMaxCoordIndex()
\r
183 VecLinearCoordinatePoint[] vp = this.items;
\r
185 double max_dist = vp[0].scalar;
\r
186 for (int i = this.length - 1; i > 0; i--) {
\r
187 if (max_dist < vp[i].scalar) {
\r
188 max_dist = vp[i].scalar;
\r
198 * この関数は、リストから大きさ(sq_dist)が0のベクトルを削除して、要素を前方に詰めます。
\r
200 public void removeZeroDistItem()
\r
204 final int len=this.length;
\r
205 for(int i=0;i<len;i++){
\r
206 if(this.items[i].scalar!=0){
\r
210 for(i=i+1;i<len;i++){
\r
211 if(this.items[i].scalar!=0){
\r
212 VecLinearCoordinatePoint temp = this.items[i];
\r
213 this.items[i]=this.items[idx];
\r
214 this.items[idx]=temp;
\r