/** * p1->p2とp2->p3の作る角のsin値の絶対値を得ます。 * @param p1 * @param p2 * @param p3 * @return */ public static double getAbsSin(NyARDoublePoint2d p1, NyARDoublePoint2d p2, NyARDoublePoint2d p3) { double cp = NyARDoublePoint2d.crossProduct3Point(p1, p2, p3); cp /= (Math.Sqrt(p1.sqDist(p2)) * Math.Sqrt(p2.sqDist(p3))); return(cp > 0?cp:-cp); }
/** * 画面上の点が、このターゲットを構成する頂点の内側にあるか判定します。 * (範囲ではなく、頂点の内側であることに注意してください。) * この関数は、Known/Unknownターゲットに使用できます。 * @param i_x * @param i_y * @return */ public bool isInnerVertexPoint2d(int i_x, int i_y) { Debug.Assert(this._target_type == RT_UNKNOWN || this._target_type == RT_KNOWN); NyARDoublePoint2d[] vx=((NyARRectTargetStatus)(this._ref_tracktarget._ref_status)).vertex; for(int i=3;i>=0;i--){ if(NyARDoublePoint2d.crossProduct3Point(vx[i],vx[(i+1)%4],i_x,i_y)<0) { return false; } } return true; }
/** * 4頂点を巡回して、正の外積の個数を数える。 * @param p * @param order * @return */ private static int countPlusExteriorProduct(NyARDoublePoint2d[] p, int[] order) { int ret = 0; for (int i = 0; i < 4; i++) { if (0 < NyARDoublePoint2d.crossProduct3Point(p[order[i + 0]], p[order[(i + 1) % 4]], p[order[(i + 2) % 4]])) { ret++; } } return(ret); }