OSDN Git Service

git-svn-id: http://svn.sourceforge.jp/svnroot/nyartoolkit/NyARToolkit/trunk@786 7cac0...
[nyartoolkit-and/nyartoolkit-and.git] / lib / 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 edition ARToolKit class library.\r
11  * Copyright (C)2008-2009 Ryo Iizuka\r
12  *\r
13  * This program is free software: you can redistribute it and/or modify\r
14  * it under the terms of the GNU General Public License as published by\r
15  * the Free Software Foundation, either version 3 of the License, or\r
16  * (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 program.  If not, see <http://www.gnu.org/licenses/>.\r
25  * \r
26  * For further information please contact.\r
27  *      http://nyatla.jp/nyatoolkit/\r
28  *      <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
29  * \r
30  */\r
31 package jp.nyatla.nyartoolkit.core;\r
32 \r
33 import jp.nyatla.nyartoolkit.NyARException;\r
34 \r
35 \r
36 /**\r
37  * このクラスは、ARToolKit由来のベクトル値計算関数を提供します。\r
38  * <p>memo:\r
39  * このクラスは、今後統合・削除する可能性があります。\r
40  * </p>\r
41  */\r
42 public class NyARVec\r
43 {\r
44         /** ベクトルの列数*/\r
45         private int clm;\r
46         /** ベクトル値を格納する配列*/\r
47         private double[] v;\r
48 \r
49 \r
50         /**\r
51          * コンストラクタです。\r
52          * 列数を指定して、インスタンスを生成します。\r
53          * @param i_clm\r
54          * 列数です。\r
55          */\r
56         public NyARVec(int i_clm)\r
57         {\r
58                 v = new double[i_clm];\r
59                 clm = i_clm;\r
60         }\r
61 \r
62         /**\r
63          * ベクトルのバッファサイズを、i_clmに十分になるように変更します。\r
64          * 実行後、列の各値は不定になります。\r
65          * @param i_clm\r
66          * 新しい列数\r
67          */\r
68         public void realloc(int i_clm)\r
69         {\r
70                 if (i_clm <= this.v.length) {\r
71                         // 十分な配列があれば何もしない。\r
72                 } else {\r
73                         // 不十分なら取り直す。\r
74                         v = new double[i_clm];\r
75                 }\r
76                 this.clm = i_clm;\r
77         }\r
78 \r
79         /**\r
80          * ベクトルの列数を返します。\r
81          * @return\r
82          * ベクトルの列数\r
83          */\r
84         public int getClm()\r
85         {\r
86                 return clm;\r
87         }\r
88 \r
89         /**\r
90          * ベクトル値を格納した配列の参照値を返します。\r
91          * @return\r
92          * 配列の参照値\r
93          */\r
94         public double[] getArray()\r
95         {\r
96                 return v;\r
97         }\r
98 \r
99         /**\r
100          * arVecInnerproduct関数の同等品です。\r
101          * この関数は動作チェックをしておらず、機能しません。\r
102          * 詳細は不明です。\r
103          * @param y\r
104          * 不明。\r
105          * @param i_start\r
106          * 演算開始列(よくわからないけどarVecTridiagonalizeの呼び出し元でなんかしてる)\r
107          * @return\r
108          * 不明。\r
109          * @throws NyARException\r
110          */\r
111         public double vecInnerproduct(NyARVec y, int i_start) throws NyARException\r
112         {\r
113                 NyARException.trap("この関数は動作確認できていません。");\r
114                 double result = 0.0;\r
115                 // double[] x_array=x.v;.getArray();\r
116                 // double[] y_array=y.getArray();\r
117 \r
118                 if (this.clm != y.clm) {\r
119                         throw new NyARException();// exit();\r
120                 }\r
121                 for (int i = i_start; i < this.clm; i++) {\r
122                         NyARException.trap("未チェックのパス");\r
123                         result += this.v[i] * y.v[i];// result += x->v[i] * y->v[i];\r
124                 }\r
125                 return result;\r
126         }\r
127 \r
128         /**\r
129          * arVecHousehold関数の同等品です。\r
130          * 詳細は不明です。\r
131          * @param i_start\r
132          * 演算開始列(よくわからないけどarVecTridiagonalizeの呼び出し元でなんかしてる)\r
133          * @return\r
134          * 不明。\r
135          * @throws NyARException\r
136          */\r
137         public double vecHousehold(int i_start) throws NyARException\r
138         {\r
139                 NyARException.trap("この関数は動作確認できていません。");\r
140                 double s, t;\r
141                 s = Math.sqrt(this.vecInnerproduct(this, i_start));\r
142                 // double[] x_array=x.getArray();\r
143                 if (s != 0.0) {\r
144                         NyARException.trap("未チェックのパス");\r
145                         if (this.v[i_start] < 0) {\r
146                                 s = -s;\r
147                         }\r
148                         NyARException.trap("未チェックのパス");\r
149                         {\r
150                                 this.v[i_start] += s;// x->v[0] += s;\r
151                                 t = 1 / Math.sqrt(this.v[i_start] * s);// t = 1 / sqrt(x->v[0] * s);\r
152                         }\r
153                         for (int i = i_start; i < this.clm; i++) {\r
154                                 NyARException.trap("未チェックのパス");\r
155                                 this.v[i] *= t;// x->v[i] *= t;\r
156                         }\r
157                 }\r
158                 return -s;\r
159         }\r
160 \r
161         /**\r
162          * 現在ラップしている配列を取り外して、新しい配列と、列数をセットします。\r
163          * @param i_array\r
164          * 新しく設定する配列です。この配列は、thisが所有します。\r
165          * @param i_clm\r
166          * 新しいVectorの列数です。\r
167          */\r
168         public void setNewArray(double[] i_array, int i_clm)\r
169         {\r
170                 this.v = i_array;\r
171                 this.clm = i_clm;\r
172         }\r
173 }\r