/*
* PROJECT: NyARToolkit
* --------------------------------------------------------------------------------
* This work is based on the original ARToolKit developed by
* Hirokazu Kato
* Mark Billinghurst
* HITLab, University of Washington, Seattle
* http://www.hitl.washington.edu/artoolkit/
*
* 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.squaredetect;
import jp.nyatla.nyartoolkit.core.types.*;
/**
* このクラスは、矩形情報を格納します。
* ARToolKitのARMarkerInfoに相当しますが、このクラスは理想座標のみを取り扱います。
*/
public class NyARSquare
{
/** 矩形の辺の直線式です。*/
public NyARLinear[] line = NyARLinear.createArray(4);
/** 矩形の頂点です。 line[n]と、line[(n+3)%4]の交点でもあります。*/
public NyARDoublePoint2d[] sqvertex = NyARDoublePoint2d.createArray(4);
/**
* この関数は、矩形の中心点を計算します。
* @param o_out
* 結果を格納するバッファ。
*/
public void getCenter2d(NyARDoublePoint2d o_out)
{
o_out.x=(this.sqvertex[0].x+this.sqvertex[1].x+this.sqvertex[2].x+this.sqvertex[3].x)/4;
o_out.y=(this.sqvertex[0].y+this.sqvertex[1].y+this.sqvertex[2].y+this.sqvertex[3].y)/4;
return;
}
/**
* この関数は、頂点同士の距離から、頂点のシフト量(回転量)を返します。
* よく似た2つの矩形の頂点同士の、頂点の対応を取るために使用します。
* @param i_square
* 比較対象の矩形
* @return
* シフト量を数値で返します。
* シフト量はthis-i_squareです。1の場合、this.sqvertex[0]とi_square.sqvertex[1]が対応点になる(shift量1)であることを示します。
*/
public int checkVertexShiftValue(NyARSquare i_square)
{
NyARDoublePoint2d[] a=this.sqvertex;
NyARDoublePoint2d[] b=i_square.sqvertex;
//3-0番目
int min_dist=Integer.MAX_VALUE;
int min_index=0;
int xd,yd;
for(int i=3;i>=0;i--){
int d=0;
for(int i2=3;i2>=0;i2--){
xd= (int)(a[i2].x-b[(i2+i)%4].x);
yd= (int)(a[i2].y-b[(i2+i)%4].y);
d+=xd*xd+yd*yd;
}
if(min_dist>d){
min_dist=d;
min_index=i;
}
}
return min_index;
}
/** 4とnの最大公約数テーブル*/
private final static int[] _gcd_table4={-1,1,2,1};
/**
* この関数は、頂点を左回転して、矩形を回転させます。
* @param i_shift
* シフト量。4未満、0以上である事。
*/
public void rotateVertexL(int i_shift)
{
assert(i_shift<4);
NyARDoublePoint2d vertext;
NyARLinear linet;
if(i_shift==0){
return;
}
int t1,t2;
int d, i, j, mk;
int ll=4-i_shift;
d = _gcd_table4[ll];//NyMath.gcn(4,ll);
mk = (4-ll) % 4;
for (i = 0; i < d; i++) {
linet=this.line[i];
vertext=this.sqvertex[i];
for (j = 1; j < 4/d; j++) {
t1=(i + (j-1)*mk) % 4;
t2=(i + j*mk) % 4;
this.line[t1]=this.line[t2];
this.sqvertex[t1]=this.sqvertex[t2];
}
t1=(i + ll) % 4;
this.line[t1]=linet;
this.sqvertex[t1]=vertext;
}
}
}