Example #1
0
        /**
         * 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);
        }
Example #2
0
	    /**
	     * 画面上の点が、このターゲットを構成する頂点の内側にあるか判定します。
	     * (範囲ではなく、頂点の内側であることに注意してください。)
	     * この関数は、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;
	    }
Example #3
0
        /**
         * 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);
        }