1 package jp.nyatla.nyartoolkit.dev.rpf.utils;
\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
7 public class VecLinearCoordinates
\r
13 public static class NyARVecLinearPoint extends NyARVecLinear2d
\r
16 * ベクトルの2乗値です。輪郭の強度値にもなります。
\r
18 public double scalar;
\r
19 public static NyARVecLinearPoint[] createArray(int i_length)
\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
29 public NyARVecLinearPoint items[];
\r
31 public VecLinearCoordinates(int i_length)
\r
34 this.items = NyARVecLinearPoint.createArray(i_length);
\r
39 public final void limitQuadrantTo12()
\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
52 * 輪郭配列から、から、キーのベクトル(絶対値の大きいベクトル)を順序を壊さずに抽出します。
\r
58 * インデクス番号を受け取る配列。受け取るインデックスの個数は、この配列の数と同じになります。
\r
60 public void getOrderdKeyCoordIndexes(int[] o_index)
\r
62 getKeyCoordIndexes(o_index);
\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
68 o_index[i] = o_index[i + 1];
\r
77 public void getKeyCoordIndexes(int[] o_index)
\r
79 NyARVecLinearPoint[] vp = this.items;
\r
80 assert (o_index.length <= this.length);
\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
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
91 o_index[i] = o_index[i + 1];
\r
98 // 先に4個をsq_distでソートしながら格納
\r
99 for (i = out_len; i < this.length; i++) {
\r
101 for (int i2 = 0; i2 < out_len; i2++) {
\r
102 if (vp[i].scalar > vp[o_index[i2]].scalar) {
\r
104 for (int i3 = out_len - 1; i3 > i2; i3--) {
\r
105 o_index[i3] = o_index[i3 - 1];
\r
115 public void getKeyCoord(NyARVecLinearPoint[] o_index)
\r
117 NyARVecLinearPoint[] vp = this.items;
\r
118 assert (o_index.length <= this.length);
\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
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
136 // 先に4個をsq_distでソートしながら格納
\r
137 for (i = out_len; i < this.length; i++) {
\r
139 for (int i2 = 0; i2 < out_len; i2++) {
\r
140 if (vp[i].scalar > o_index[i2].scalar) {
\r
142 for (int i3 = out_len - 1; i3 > i2; i3--) {
\r
143 o_index[i3] = o_index[i3 - 1];
\r
146 o_index[i2] = vp[i];
\r
155 * 最も大きいベクトル成分のインデクスを返します。
\r
159 public final int getMaxCoordIndex()
\r
161 NyARVecLinearPoint[] vp = this.items;
\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
175 * ノイズレベルを指定して、ノイズ(だと思われる)ベクトルを削除します。
\r
178 * 大きさ(sq_dist)が0のベクトルを削除して、要素を前方に詰めます。
\r
180 public void removeZeroDistItem()
\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
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