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
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
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
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
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
25 package jp.nyatla.nyartoolkit.core.utils;
\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
32 * 遠近法を用いたPerspectiveパラメータを計算するクラスです。
\r
35 public class NyARPerspectiveParamGenerator
\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
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
51 public boolean getParam(final NyARIntPoint2d[] i_vertex,double[] o_param)throws NyARException
\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
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
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
91 NyARDoubleMatrix22 tm=new NyARDoubleMatrix22();
\r
99 double A,B,C,D,E,F,G,H;
\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
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