/** * 画面上の点が、このターゲットを包括する矩形の内側にあるかを判定します。 * この関数は、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); }
/** * このデータが初期チェック(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); }