/** * このデータが初期チェック(CoordからRectへの遷移)をパスするかチェックします。 * 条件は、 * 1.検出四角形の対角点は元の検出矩形内か? * 2.一番長い辺と短い辺の比は、0.1~10の範囲か? * 3.位置倍長い辺、短い辺が短すぎないか? * @param i_sample_area * この矩形を検出するために使った元データの範囲(ターゲット検出範囲) */ private bool checkInitialRectCondition(NyARIntRect i_sample_area) { NyARDoublePoint2d[] this_vx=this.vertex; //検出した四角形の対角点が検出エリア内か? int cx=(int)(this_vx[0].x+this_vx[1].x+this_vx[2].x+this_vx[3].x)/4; int cy=(int)(this_vx[0].y+this_vx[1].y+this_vx[2].y+this_vx[3].y)/4; if(!i_sample_area.isInnerPoint(cx,cy)){ return false; } //一番長い辺と短い辺の比を確認(10倍の比があったらなんか変) int max = int.MinValue; int min = int.MaxValue; for(int i=0;i<4;i++){ int t=(int)this_vx[i].sqDist(this_vx[(i+1)%4]); if(t>max){max=t;} if(t<min){min=t;} } //比率係数の確認 if(max<(5*5) ||min<(5*5)){ return false; } //10倍スケールの2乗 if((10*10)*min/max<(3*3)){ return false; } return true; }
/** * 画面上の点が、このターゲットを包括する矩形の内側にあるかを判定します。 * この関数は、Known/Unknownターゲットに使用できます。 * @param i_x * @param i_y * @return * <p>メモ:この関数にはnewが残ってるので注意</p> */ public bool isInnerRectPoint2d(int i_x, int i_y) { Debug.Assert(this._target_type == RT_UNKNOWN || this._target_type == RT_KNOWN); NyARIntRect rect=new NyARIntRect(); NyARDoublePoint2d[] vx=((NyARRectTargetStatus)(this._ref_tracktarget._ref_status)).vertex; rect.setAreaRect(vx,4); return rect.isInnerPoint(i_x, i_y); }