OSDN Git Service

[upadate]NyARToolKit
[nyartoolkit-and/nyartoolkit-and.git] / trunk / src / jp / nyatla / nyartoolkit / core / utils / NyARPerspectiveParamGenerator.java
1 /* \r
2  * PROJECT: NyARToolkit(Extension)\r
3  * --------------------------------------------------------------------------------\r
4  * The NyARToolkit is Java edition ARToolKit class library.\r
5  * Copyright (C)2008-2009 Ryo Iizuka\r
6  *\r
7  * This program is free software: you can redistribute it and/or modify\r
8  * it under the terms of the GNU General Public License as published by\r
9  * the Free Software Foundation, either version 3 of the License, or\r
10  * (at your option) any later version.\r
11  * \r
12  * This program is distributed in the hope that it will be useful,\r
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
15  * GNU General Public License for more details.\r
16  *\r
17  * You should have received a copy of the GNU General Public License\r
18  * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r
19  * \r
20  * For further information please contact.\r
21  *      http://nyatla.jp/nyatoolkit/\r
22  *      <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
23  * \r
24  */\r
25 package jp.nyatla.nyartoolkit.core.utils;\r
26 \r
27 import jp.nyatla.nyartoolkit.NyARException;\r
28 import jp.nyatla.nyartoolkit.core.types.*;\r
29 import jp.nyatla.nyartoolkit.core.types.matrix.*;\r
30 \r
31 /**\r
32  * 遠近法を用いたPerspectiveパラメータを計算するクラスです。\r
33  *\r
34  */\r
35 public class NyARPerspectiveParamGenerator\r
36 {\r
37         protected int _local_x;\r
38         protected int _local_y;\r
39         protected int _width;\r
40         protected int _height;\r
41         public NyARPerspectiveParamGenerator(int i_local_x,int i_local_y,int i_width, int i_height)\r
42         {\r
43                 this._height=i_height;\r
44                 this._width=i_width;\r
45                 this._local_x=i_local_x;\r
46                 this._local_y=i_local_y;\r
47                 return;\r
48         }\r
49 \r
50         \r
51         public boolean getParam(final NyARIntPoint2d[] i_vertex,double[] o_param)throws NyARException\r
52         {\r
53                 double ltx=this._local_x;\r
54                 double lty=this._local_y;\r
55                 double rbx=ltx+this._width;\r
56                 double rby=lty+this._height;\r
57                 double x1,x2,x3,x4;\r
58                 double y1,y2,y3,y4;\r
59                 x1=i_vertex[0].x;\r
60                 x2=i_vertex[1].x;\r
61                 x3=i_vertex[2].x;\r
62                 x4=i_vertex[3].x;\r
63                 y1=i_vertex[0].y;\r
64                 y2=i_vertex[1].y;\r
65                 y3=i_vertex[2].y;\r
66                 y4=i_vertex[3].y;\r
67                 \r
68                 \r
69                 NyARDoubleMatrix44 mat_x=new NyARDoubleMatrix44();\r
70                 mat_x.m00=ltx;  mat_x.m01=lty;  mat_x.m02=-ltx*x1;      mat_x.m03=-lty*x1;\r
71                 mat_x.m10=rbx;  mat_x.m11=lty;  mat_x.m12=-rbx*x2;      mat_x.m13=-lty*x2;\r
72                 mat_x.m20=rbx;  mat_x.m21=rby;  mat_x.m22=-rbx*x3;      mat_x.m23=-rby*x3;\r
73                 mat_x.m30=ltx;  mat_x.m31=rby;  mat_x.m32=-ltx*x4;      mat_x.m33=-rby*x4;\r
74                 mat_x.inverse(mat_x);\r
75                 NyARDoubleMatrix44 mat_y=new NyARDoubleMatrix44();\r
76                 mat_y.m00=ltx;  mat_y.m01=lty;  mat_y.m02=-ltx*y1;      mat_y.m03=-lty*y1;\r
77                 mat_y.m10=rbx;  mat_y.m11=lty;  mat_y.m12=-rbx*y2;      mat_y.m13=-lty*y2;\r
78                 mat_y.m20=rbx;  mat_y.m21=rby;  mat_y.m22=-rbx*y3;      mat_y.m23=-rby*y3;\r
79                 mat_y.m30=ltx;  mat_y.m31=rby;  mat_y.m32=-ltx*y4;      mat_y.m33=-rby*y4;\r
80                 mat_y.inverse(mat_y);\r
81                 double a=mat_x.m20*x1+mat_x.m21*x2+mat_x.m22*x3+mat_x.m23*x4;\r
82                 double b=mat_x.m20+mat_x.m21+mat_x.m22+mat_x.m23;\r
83                 double d=mat_x.m30*x1+mat_x.m31*x2+mat_x.m32*x3+mat_x.m33*x4;\r
84                 double f=mat_x.m30+mat_x.m31+mat_x.m32+mat_x.m33;\r
85                 \r
86                 double g=mat_y.m20*y1+mat_y.m21*y2+mat_y.m22*y3+mat_y.m23*y4;\r
87                 double h=mat_y.m20+mat_y.m21+mat_y.m22+mat_y.m23;\r
88                 double i=mat_y.m30*y1+mat_y.m31*y2+mat_y.m32*y3+mat_y.m33*y4;\r
89                 double j=mat_y.m30+mat_y.m31+mat_y.m32+mat_y.m33;\r
90                 \r
91                 NyARDoubleMatrix22 tm=new NyARDoubleMatrix22();\r
92                 tm.m00=b;\r
93                 tm.m01=-h;\r
94                 tm.m10=f;\r
95                 tm.m11=-j;\r
96                 tm.inverse(tm);\r
97 \r
98                 \r
99                 double A,B,C,D,E,F,G,H;\r
100 \r
101                 C=tm.m00*(a-g)+tm.m01*(d-i);    //C\r
102                 F=tm.m10*(a-g)+tm.m11*(d-i);    //F\r
103                 G=a-C*b;\r
104                 H=d-C*f;\r
105                 A=(mat_x.m00*x1+mat_x.m01*x2+mat_x.m02*x3+mat_x.m03*x4)-C*(mat_x.m00+mat_x.m01+mat_x.m02+mat_x.m03);\r
106                 B=(mat_x.m10*x1+mat_x.m11*x2+mat_x.m12*x3+mat_x.m13*x4)-C*(mat_x.m10+mat_x.m11+mat_x.m12+mat_x.m13);\r
107                 D=(mat_y.m00*y1+mat_y.m01*y2+mat_y.m02*y3+mat_y.m03*y4)-F*(mat_y.m00+mat_y.m01+mat_y.m02+mat_y.m03);\r
108                 E=(mat_y.m10*y1+mat_y.m11*y2+mat_y.m12*y3+mat_y.m13*y4)-F*(mat_y.m10+mat_y.m11+mat_y.m12+mat_y.m13);\r
109 \r
110 \r
111                 o_param[0]=A;\r
112                 o_param[1]=B;\r
113                 o_param[2]=C;\r
114                 o_param[3]=D;\r
115                 o_param[4]=E;\r
116                 o_param[5]=F;\r
117                 o_param[6]=G;\r
118                 o_param[7]=H;\r
119                 \r
120 \r
121                 return true;\r
122 \r
123         }\r
124 }\r