/* * PROJECT: NyARToolkit(Extension) * -------------------------------------------------------------------------------- * The NyARToolkit is Java edition ARToolKit class library. * Copyright (C)2008-2009 Ryo Iizuka * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * For further information please contact. * http://nyatla.jp/nyatoolkit/ * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp> * */ package jp.nyatla.nyartoolkit.core.utils; import jp.nyatla.nyartoolkit.NyARException; import jp.nyatla.nyartoolkit.core.types.matrix.*; /** * このクラスは、遠近法を用いてPerspectiveパラメータを計算します。 * 遠近法を可読性を重視して実装している為、若干低速です。 * 高速化をした{@link NyARPerspectiveParamGenerator_O1}関数を使用してください。 */ public class NyARPerspectiveParamGenerator_Reference extends NyARPerspectiveParamGenerator { /** * コンストラクタです。 * @param i_local_x * パラメータ計算の基準点を指定します。 * @param i_local_y * パラメータ計算の基準点を指定します。 */ public NyARPerspectiveParamGenerator_Reference(int i_local_x,int i_local_y) { super(i_local_x,i_local_y); return; } /** * この関数は、遠近法のパラメータを計算して、返却します。 */ public final boolean getParam(int i_dest_w,int i_dest_h,double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4,double[] o_param)throws NyARException { double ltx=this._local_x; double lty=this._local_y; double rbx=ltx+i_dest_w; double rby=lty+i_dest_h; NyARDoubleMatrix44 mat_x=new NyARDoubleMatrix44(); mat_x.m00=ltx; mat_x.m01=lty; mat_x.m02=-ltx*x1; mat_x.m03=-lty*x1; mat_x.m10=rbx; mat_x.m11=lty; mat_x.m12=-rbx*x2; mat_x.m13=-lty*x2; mat_x.m20=rbx; mat_x.m21=rby; mat_x.m22=-rbx*x3; mat_x.m23=-rby*x3; mat_x.m30=ltx; mat_x.m31=rby; mat_x.m32=-ltx*x4; mat_x.m33=-rby*x4; mat_x.inverse(mat_x); NyARDoubleMatrix44 mat_y=new NyARDoubleMatrix44(); mat_y.m00=ltx; mat_y.m01=lty; mat_y.m02=-ltx*y1; mat_y.m03=-lty*y1; mat_y.m10=rbx; mat_y.m11=lty; mat_y.m12=-rbx*y2; mat_y.m13=-lty*y2; mat_y.m20=rbx; mat_y.m21=rby; mat_y.m22=-rbx*y3; mat_y.m23=-rby*y3; mat_y.m30=ltx; mat_y.m31=rby; mat_y.m32=-ltx*y4; mat_y.m33=-rby*y4; mat_y.inverse(mat_y); double a=mat_x.m20*x1+mat_x.m21*x2+mat_x.m22*x3+mat_x.m23*x4; double b=mat_x.m20+mat_x.m21+mat_x.m22+mat_x.m23; double d=mat_x.m30*x1+mat_x.m31*x2+mat_x.m32*x3+mat_x.m33*x4; double f=mat_x.m30+mat_x.m31+mat_x.m32+mat_x.m33; double g=mat_y.m20*y1+mat_y.m21*y2+mat_y.m22*y3+mat_y.m23*y4; double h=mat_y.m20+mat_y.m21+mat_y.m22+mat_y.m23; double i=mat_y.m30*y1+mat_y.m31*y2+mat_y.m32*y3+mat_y.m33*y4; double j=mat_y.m30+mat_y.m31+mat_y.m32+mat_y.m33; NyARDoubleMatrix22 tm=new NyARDoubleMatrix22(); tm.m00=b; tm.m01=-h; tm.m10=f; tm.m11=-j; tm.inverse(tm); double A,B,C,D,E,F,G,H; C=tm.m00*(a-g)+tm.m01*(d-i); //C F=tm.m10*(a-g)+tm.m11*(d-i); //F G=a-C*b; H=d-C*f; 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); 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); 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); 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); o_param[0]=A; o_param[1]=B; o_param[2]=C; o_param[3]=D; o_param[4]=E; o_param[5]=F; o_param[6]=G; o_param[7]=H; return true; } }