OSDN Git Service

Merge branch 'git-svn'
[nyartoolkit-and/nyartoolkit-and.git] / branches / 1.2.0-last / src / jp / nyatla / nyartoolkit / core / NyARVec.java
1 /* \r
2  * PROJECT: NyARToolkit\r
3  * --------------------------------------------------------------------------------\r
4  * This work is based on the original ARToolKit developed by\r
5  *   Hirokazu Kato\r
6  *   Mark Billinghurst\r
7  *   HITLab, University of Washington, Seattle\r
8  * http://www.hitl.washington.edu/artoolkit/\r
9  *\r
10  * The NyARToolkit is Java version ARToolkit class library.\r
11  * Copyright (C)2008 R.Iizuka\r
12  *\r
13  * This program is free software; you can redistribute it and/or\r
14  * modify it under the terms of the GNU General Public License\r
15  * as published by the Free Software Foundation; either version 2\r
16  * of the License, or (at your option) any later version.\r
17  * \r
18  * This program is distributed in the hope that it will be useful,\r
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
21  * GNU General Public License for more details.\r
22  * \r
23  * You should have received a copy of the GNU General Public License\r
24  * along with this framework; if not, write to the Free Software\r
25  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
26  * \r
27  * For further information please contact.\r
28  *      http://nyatla.jp/nyatoolkit/\r
29  *      <airmail(at)ebony.plala.or.jp>\r
30  * \r
31  */\r
32 package jp.nyatla.nyartoolkit.core;\r
33 \r
34 import jp.nyatla.nyartoolkit.NyARException;\r
35 \r
36 \r
37 \r
38 public class NyARVec\r
39 {\r
40     private int clm;\r
41     public NyARVec(int i_clm)\r
42     {\r
43         v=new double[i_clm];\r
44         clm=i_clm;\r
45     }\r
46     private double[] v;\r
47     /**\r
48      * i_clmサイズの列を格納できるように列サイズを変更します。\r
49      * 実行後、列の各値は不定になります。\r
50      * @param i_clm\r
51      */\r
52     public void realloc(int i_clm)\r
53     {\r
54         if(i_clm<=this.v.length)\r
55         {\r
56             //十分な配列があれば何もしない。\r
57         }else{\r
58             //不十分なら取り直す。\r
59             v=new double[i_clm];\r
60         }\r
61         this.clm=i_clm;\r
62     }    \r
63     public int getClm()\r
64     {\r
65         return clm;\r
66     }\r
67     public double[] getArray()\r
68     {\r
69         return v;\r
70     }\r
71     /**\r
72      * arVecDispの代替品\r
73      * @param value\r
74      * @return\r
75      */\r
76     public int arVecDisp() throws NyARException\r
77     {\r
78         NyARException.trap("未チェックのパス");\r
79         System.out.println(" === vector ("+clm+") ===\n");//printf(" === vector (%d) ===\n", v->clm);\r
80         System.out.print(" |");//printf(" |");\r
81         for(int c = 0; c < clm; c++ ){//for( c = 0; c < v->clm; c++ ){\r
82                 System.out.print(" "+v[c]);//printf( " %10g", v->v[c] );\r
83         }\r
84         System.out.println(" |");//printf(" |\n");\r
85         System.out.println(" ===================");//printf(" ===================\n");\r
86         return 0;\r
87     }\r
88     /**\r
89      * arVecInnerproduct関数の代替品\r
90      * @param x\r
91      * @param y\r
92      * @param i_start\r
93      * 演算開始列(よくわからないけどarVecTridiagonalizeの呼び出し元でなんかしてる)\r
94      * @return\r
95      * @throws NyARException\r
96      */\r
97     public double vecInnerproduct(NyARVec y,int i_start) throws NyARException\r
98     {\r
99         NyARException.trap("この関数は動作確認できていません。");    \r
100         double result = 0.0;\r
101 //        double[] x_array=x.v;.getArray();\r
102 //        double[] y_array=y.getArray();\r
103     \r
104         if(this.clm!= y.clm){\r
105             throw new NyARException();//exit();\r
106         }\r
107         for(int i = i_start; i < this.clm; i++ ) {\r
108             NyARException.trap("未チェックのパス");\r
109             result += this.v[i] * y.v[i];//result += x->v[i] * y->v[i];\r
110         }    \r
111         return result;\r
112     }\r
113     /**\r
114      * double arVecHousehold関数の代替品\r
115      * @param x\r
116      * @param i_start\r
117      * 演算開始列(よくわからないけどarVecTridiagonalizeの呼び出し元でなんかしてる)\r
118      * @return\r
119      * @throws NyARException\r
120      */\r
121     public double vecHousehold(int i_start) throws NyARException\r
122     {\r
123         NyARException.trap("この関数は動作確認できていません。");\r
124         double s, t;\r
125         s = Math.sqrt(this.vecInnerproduct(this,i_start));\r
126 //        double[] x_array=x.getArray();\r
127         if( s != 0.0 ){\r
128             NyARException.trap("未チェックのパス");\r
129             if(this.v[i_start]< 0){\r
130                 s = -s;\r
131             }\r
132             NyARException.trap("未チェックのパス");{\r
133                 this.v[i_start]+=s;//x->v[0] += s;\r
134             t = 1 / Math.sqrt(this.v[i_start]* s);//t = 1 / sqrt(x->v[0] * s);\r
135             }\r
136             for(int i = i_start; i < this.clm; i++){\r
137                 NyARException.trap("未チェックのパス");\r
138                 this.v[i]*=t;//x->v[i] *= t;\r
139             }\r
140         }\r
141         return -s;\r
142     }\r
143 //    /**\r
144 //     * arVecTridiagonalize関数の代替品\r
145 //     * a,d,e間で演算をしてる。何をどうしているかはさっぱりさっぱり\r
146 //     * @param a\r
147 //     * @param d\r
148 //     * @param e\r
149 //     * @param i_e_start\r
150 //     * 演算開始列(よくわからないけどarVecTridiagonalizeの呼び出し元でなんかしてる)\r
151 //     * @return\r
152 //     * @throws NyARException\r
153 //     */\r
154 //    public static void vecTridiagonalize(NyARMat a, NyARVec d, NyARVec e,int i_e_start) throws NyARException\r
155 //    {\r
156 //      NyARVec vec,vec2;\r
157 //      double[][] a_array=a.getArray();\r
158 //      double  s, t, p, q;\r
159 //      int     dim;\r
160 //\r
161 //      if(a.getClm()!=a.getRow()){\r
162 //          throw new NyARException();\r
163 //      }\r
164 //      if(a.getClm() != d.clm){\r
165 //          throw new NyARException();\r
166 //      }\r
167 //      if(a.getClm() != e.clm){\r
168 //          throw new NyARException();\r
169 //      }\r
170 //      dim = a.getClm();\r
171 //\r
172 //      for(int k = 0; k < dim-2; k++ ){\r
173 //          vec=a.getRowVec(k);\r
174 ////        double[] vec_array=vec.getArray();\r
175 //          NyARException.trap("未チェックパス"); \r
176 //          d.v[k]=vec.v[k];//d.set(k,v.get(k));    //d->v[k] = v[k];\r
177 //\r
178 //          //wv1.clm = dim-k-1;\r
179 //          //wv1.v = &(v[k+1]);\r
180 //          NyARException.trap("未チェックパス"); \r
181 //          e.v[k+i_e_start]=vec.vecHousehold(k+1);//e->v[k] = arVecHousehold(&wv1);\r
182 //          if(e.v[k+i_e_start]== 0.0 ){\r
183 //              continue;\r
184 //          }\r
185 //\r
186 //          for(int i = k+1; i < dim; i++ ){\r
187 //              s = 0.0;\r
188 //              for(int j = k+1; j < i; j++ ) {\r
189 //                  NyARException.trap("未チェックのパス");\r
190 //                  s += a_array[j][i] * vec.v[j];//s += a.get(j*dim+i) * v.get(j);//s += a->m[j*dim+i] * v[j];\r
191 //              }\r
192 //              for(int j = i; j < dim; j++ ) {\r
193 //                  NyARException.trap("未チェックのパス");\r
194 //                  s += a_array[i][j] * vec.v[j];//s += a.get(i*dim+j) * v.get(j);//s += a->m[i*dim+j] * v[j];\r
195 //              }\r
196 //              NyARException.trap("未チェックのパス");\r
197 //              d.v[i]=s;//d->v[i] = s;\r
198 //          }\r
199 //\r
200 //\r
201 //          //wv1.clm = wv2.clm = dim-k-1;\r
202 //          //wv1.v = &(v[k+1]);\r
203 //          //wv2.v = &(d->v[k+1]);\r
204 //          vec=a.getRowVec(k);\r
205 ////        vec_array=vec.getArray();\r
206 //          NyARException.trap("未チェックパス"); \r
207 //          t = vec.vecInnerproduct(d,k+1)/ 2;\r
208 //          for(int i = dim-1; i > k; i-- ) {\r
209 //              NyARException.trap("未チェックパス"); \r
210 //              p = vec.v[i];//p = v.get(i);//p = v[i];\r
211 //              d.v[i]-=t*p;q=d.v[i];//q = d->v[i] -= t*p;\r
212 //              for(int j = i; j < dim; j++ ){\r
213 //                  NyARException.trap("未チェックパス"); \r
214 //                  a_array[i][j]-=p*(d.v[j] + q*vec.v[j]);//a->m[i*dim+j] -= p*(d->v[j]) + q*v[j];\r
215 //              }\r
216 //          }\r
217 //      }\r
218 //\r
219 //      if( dim >= 2) {\r
220 //          d.v[dim-2]=a_array[dim-2][dim-2];//d->v[dim-2] = a->m[(dim-2)*dim+(dim-2)];\r
221 //          e.v[dim-2+i_e_start]=a_array[dim-2][dim-1];//e->v[dim-2] = a->m[(dim-2)*dim+(dim-1)];\r
222 //      }\r
223 //\r
224 //      if( dim >= 1 ){\r
225 //          d.v[dim-1]=a_array[dim-1][dim-1];//d->v[dim-1] = a->m[(dim-1)*dim+(dim-1)];\r
226 //      }\r
227 //\r
228 //      for(int k = dim-1; k >= 0; k--) {\r
229 //          vec=a.getRowVec(k);//v = a.getPointer(k*dim);//v = &(a->m[k*dim]);\r
230 //          if( k < dim-2 ) {\r
231 //              for(int i = k+1; i < dim; i++ ){\r
232 //                  //wv1.clm = wv2.clm = dim-k-1;\r
233 //                  //wv1.v = &(v[k+1]);\r
234 //                  //wv2.v = &(a->m[i*dim+k+1]);\r
235 //                  vec2=a.getRowVec(i);\r
236 //\r
237 //                  t = vec.vecInnerproduct(vec2,k+1);\r
238 //                  for(int j = k+1; j < dim; j++ ){\r
239 //                      NyARException.trap("未チェックパス"); \r
240 //                      a_array[i][j]-=t*vec.v[j];//a.subValue(i*dim+j,t*v.get(j));//a->m[i*dim+j] -= t * v[j];\r
241 //                  }\r
242 //              }\r
243 //          }\r
244 //          for(int i = 0; i < dim; i++ ){\r
245 //              vec.v[i]=0.0;//v.set(i,0.0);//v[i] = 0.0;\r
246 //          }\r
247 //          vec.v[k]=1;//v.set(k,1);//v[k] = 1;\r
248 //      }\r
249 //    }\r
250     /**\r
251      * 現在ラップしている配列を取り外して、新しい配列をラップします。\r
252      * @param i_v\r
253      * @param i_clm\r
254      */\r
255     public void setNewArray(double[] i_array,int i_clm)\r
256     {\r
257         this.v=i_array;\r
258         this.clm=i_clm; \r
259     }\r
260 }\r