1 package jp.nyatla.nyartoolkit.rpf.utils;
\r
3 import jp.nyatla.nyartoolkit.NyARException;
\r
4 import jp.nyatla.nyartoolkit.core.types.*;
\r
7 * このクラスは、4本の直線式から、凸包の頂点を計算する機能を提供します。
\r
9 public class LineBaseVertexDetector
\r
11 /** 頂点の組合せテーブル(4,5頂点用)*/
\r
12 private final static int[][] _45vertextable={
\r
13 {1,2,4,3},{0,2,5,3},{0,1,5,4},{0,1,5,4},{0,2,5,3},{1,2,4,3}};
\r
14 /** 頂点組合せテーブル。(6頂点用)*/
\r
15 private final static int[][] _order_table={{0,1,5,4},{0,2,5,3},{1,2,4,3}};
\r
17 private NyARDoublePoint2d[] __wk_v=NyARDoublePoint2d.createArray(6);
\r
19 * 4直線の交点から、凸包の頂点座標を計算します。
\r
21 * 直線式の配列です。要素数は4である必要があります。
\r
23 * 検出した頂点の座標です。要素数は4である必要があります。
\r
25 * 凸包を計算できると、trueを返します。
\r
26 * @throws NyARException
\r
28 public boolean line2SquareVertex(VecLinearCoordinates.VecLinearCoordinatePoint[] i_line,NyARDoublePoint2d[] o_point) throws NyARException
\r
31 NyARDoublePoint2d[] v=this.__wk_v;
\r
32 int number_of_vertex=0;
\r
35 for(int i=0;i<3;i++){
\r
36 for(int i2=i+1;i2<4;i2++){
\r
37 if(i_line[i].crossPos(i_line[i2],v[ptr])){
\r
47 switch(number_of_vertex){
\r
50 //正の外積の数を得る。0,4ならば、目的の図形
\r
51 num_of_plus=countPlusExteriorProduct(v,_45vertextable[non_vertexid]);
\r
52 target_order=_45vertextable[non_vertexid];
\r
55 //(0-5),(1-4),(2-3)の頂点ペアの組合せを試す。頂点の検索順は、(0,1,5,4),(0,2,5,3),(1,2,4,3)
\r
56 //3パターンについて、正の外積の数を得る。0,4のものがあればOK
\r
59 for(int i=0;i<3;i++){
\r
60 num_of_plus=countPlusExteriorProduct(v,_order_table[i]);
\r
61 if(num_of_plus%4==0){
\r
69 target_order=_order_table[order_id];
\r
75 //回転方向の正規化(ここパラメータ化しようよ)
\r
76 switch(num_of_plus){
\r
79 for(int i=0;i<4;i++){
\r
80 o_point[i].setValue(v[target_order[3-i]]);
\r
85 for(int i=0;i<4;i++){
\r
86 o_point[i].setValue(v[target_order[i]]);
\r
96 * 4頂点を巡回して、正の外積数を数えます。
\r
100 * 頂点のインデクス配列。4要素である事。
\r
104 private final static int countPlusExteriorProduct(NyARDoublePoint2d[] p,int[] order)
\r
107 for(int i=0;i<4;i++){
\r
108 if(0<NyARDoublePoint2d.crossProduct3Point(p[order[i+0]],p[order[(i+1)%4]],p[order[(i+2)%4]])){
\r