Beispiel #1
0
        /**
         * @param i_width
         * @param i_height
         */
        public NyARColorPatt_PseudoAffine(int i_width, int i_height)
        {
            this._size        = new NyARIntSize(i_width, i_height);
            this._patdata     = new int[i_height * i_width];
            this._pixelreader = new NyARRgbPixelReader_INT1D_X8R8G8B8_32(this._patdata, this._size);
            //疑似アフィン変換のパラメタマトリクスを計算します。
            //長方形から計算すると、有効要素がm00,m01,m02,m03,m10,m11,m20,m23,m30になります。
            NyARDoubleMatrix44 mat = this._invmat;

            mat.m00 = 0;
            mat.m01 = 0;
            mat.m02 = 0;
            mat.m03 = 1.0;
            mat.m10 = 0;
            mat.m11 = i_width - 1;
            mat.m12 = 0;
            mat.m13 = 1.0;
            mat.m20 = (i_width - 1) * (i_height - 1);
            mat.m21 = i_width - 1;
            mat.m22 = i_height - 1;
            mat.m23 = 1.0;
            mat.m30 = 0;
            mat.m31 = 0;
            mat.m32 = i_height - 1;
            mat.m33 = 1.0;
            mat.inverse(mat);
            return;
        }
        /**
         * コンストラクタです。
         * @param i_width
         * このラスタの幅
         * @param i_height
         * このラスタの高さ
         * @
         */
        public NyARColorPatt_PseudoAffine(int i_width, int i_height)
            : base(i_width, i_height, true)
        {
            //疑似アフィン変換のパラメタマトリクスを計算します。
            //長方形から計算すると、有効要素がm00,m01,m02,m03,m10,m11,m20,m23,m30になります。
            NyARDoubleMatrix44 mat = this._invmat;

            mat.m00 = 0;
            mat.m01 = 0;
            mat.m02 = 0;
            mat.m03 = 1.0;
            mat.m10 = 0;
            mat.m11 = i_width - 1;
            mat.m12 = 0;
            mat.m13 = 1.0;
            mat.m20 = (i_width - 1) * (i_height - 1);
            mat.m21 = i_width - 1;
            mat.m22 = i_height - 1;
            mat.m23 = 1.0;
            mat.m30 = 0;
            mat.m31 = 0;
            mat.m32 = i_height - 1;
            mat.m33 = 1.0;
            mat.inverse(mat);
            return;
        }
Beispiel #3
0
        /**
         * 画面上の点と原点を結ぶ直線と任意姿勢の平面の交差点を、平面の座標系で取得します。
         * ARToolKitの本P175周辺の実装と同じです。
         * <p>
         * このAPIは繰り返し使用には最適化されていません。同一なi_matに繰り返しアクセスするときは、展開してください。
         * </p>
         * @param ix
         * スクリーン上の座標
         * @param iy
         * スクリーン上の座標
         * @param i_mat
         * 平面の姿勢行列です。
         * @param o_pos
         * 結果を受け取るオブジェクトです。
         * @return
         * 計算に成功すると、trueを返します。
         */
        public bool unProjectOnMatrix(double ix, double iy, NyARDoubleMatrix44 i_mat, NyARDoublePoint3d o_pos)
        {
            //交点をカメラ座標系で計算
            unProjectOnCamera(ix, iy, i_mat, o_pos);
            //座標系の変換
            NyARDoubleMatrix44 m = new NyARDoubleMatrix44();

            if (!m.inverse(i_mat))
            {
                return(false);
            }
            m.transform3d(o_pos, o_pos);
            return(true);
        }
 /**
  * 画面上の点と原点を結ぶ直線と任意姿勢の平面の交差点を、平面の座標系で取得します。
  * ARToolKitの本P175周辺の実装と同じです。
  * <p>
  * このAPIは繰り返し使用には最適化されていません。同一なi_matに繰り返しアクセスするときは、展開してください。
  * </p>
  * @param ix
  * スクリーン上の座標
  * @param iy
  * スクリーン上の座標
  * @param i_mat
  * 平面の姿勢行列です。
  * @param o_pos
  * 結果を受け取るオブジェクトです。
  * @return
  * 計算に成功すると、trueを返します。
  */
 public bool unProjectOnMatrix(double ix, double iy, NyARDoubleMatrix44 i_mat, NyARDoublePoint3d o_pos)
 {
     //交点をカメラ座標系で計算
     unProjectOnCamera(ix, iy, i_mat, o_pos);
     //座標系の変換
     NyARDoubleMatrix44 m = new NyARDoubleMatrix44();
     if (!m.inverse(i_mat))
     {
         return false;
     }
     m.transform3d(o_pos, o_pos);
     return true;
 }
        public virtual bool getParam(NyARIntPoint2d[] i_vertex, double[] o_param)
        {
            double ltx = this._local_x;
            double lty = this._local_y;
            double rbx = ltx + this._width;
            double rby = lty + this._height;
            double x1, x2, x3, x4;
            double y1, y2, y3, y4;
            x1 = i_vertex[0].x;
            x2 = i_vertex[1].x;
            x3 = i_vertex[2].x;
            x4 = i_vertex[3].x;
            y1 = i_vertex[0].y;
            y2 = i_vertex[1].y;
            y3 = i_vertex[2].y;
            y4 = i_vertex[3].y;


            NyARDoubleMatrix44 mat_x = new NyARDoubleMatrix44();
            mat_x.m00 = ltx; mat_x.m01 = lty; mat_x.m02 = -ltx * x1; mat_x.m03 = -lty * x1;
            mat_x.m10 = rbx; mat_x.m11 = lty; mat_x.m12 = -rbx * x2; mat_x.m13 = -lty * x2;
            mat_x.m20 = rbx; mat_x.m21 = rby; mat_x.m22 = -rbx * x3; mat_x.m23 = -rby * x3;
            mat_x.m30 = ltx; mat_x.m31 = rby; mat_x.m32 = -ltx * x4; mat_x.m33 = -rby * x4;
            mat_x.inverse(mat_x);
            NyARDoubleMatrix44 mat_y = new NyARDoubleMatrix44();
            mat_y.m00 = ltx; mat_y.m01 = lty; mat_y.m02 = -ltx * y1; mat_y.m03 = -lty * y1;
            mat_y.m10 = rbx; mat_y.m11 = lty; mat_y.m12 = -rbx * y2; mat_y.m13 = -lty * y2;
            mat_y.m20 = rbx; mat_y.m21 = rby; mat_y.m22 = -rbx * y3; mat_y.m23 = -rby * y3;
            mat_y.m30 = ltx; mat_y.m31 = rby; mat_y.m32 = -ltx * y4; mat_y.m33 = -rby * y4;
            mat_y.inverse(mat_y);
            double a = mat_x.m20 * x1 + mat_x.m21 * x2 + mat_x.m22 * x3 + mat_x.m23 * x4;
            double b = mat_x.m20 + mat_x.m21 + mat_x.m22 + mat_x.m23;
            double d = mat_x.m30 * x1 + mat_x.m31 * x2 + mat_x.m32 * x3 + mat_x.m33 * x4;
            double f = mat_x.m30 + mat_x.m31 + mat_x.m32 + mat_x.m33;

            double g = mat_y.m20 * y1 + mat_y.m21 * y2 + mat_y.m22 * y3 + mat_y.m23 * y4;
            double h = mat_y.m20 + mat_y.m21 + mat_y.m22 + mat_y.m23;
            double i = mat_y.m30 * y1 + mat_y.m31 * y2 + mat_y.m32 * y3 + mat_y.m33 * y4;
            double j = mat_y.m30 + mat_y.m31 + mat_y.m32 + mat_y.m33;

            NyARDoubleMatrix22 tm = new NyARDoubleMatrix22();
            tm.m00 = b;
            tm.m01 = -h;
            tm.m10 = f;
            tm.m11 = -j;
            tm.inverse(tm);


            double A, B, C, D, E, F, G, H;

            C = tm.m00 * (a - g) + tm.m01 * (d - i);	//C
            F = tm.m10 * (a - g) + tm.m11 * (d - i);	//F
            G = a - C * b;
            H = d - C * f;
            A = (mat_x.m00 * x1 + mat_x.m01 * x2 + mat_x.m02 * x3 + mat_x.m03 * x4) - C * (mat_x.m00 + mat_x.m01 + mat_x.m02 + mat_x.m03);
            B = (mat_x.m10 * x1 + mat_x.m11 * x2 + mat_x.m12 * x3 + mat_x.m13 * x4) - C * (mat_x.m10 + mat_x.m11 + mat_x.m12 + mat_x.m13);
            D = (mat_y.m00 * y1 + mat_y.m01 * y2 + mat_y.m02 * y3 + mat_y.m03 * y4) - F * (mat_y.m00 + mat_y.m01 + mat_y.m02 + mat_y.m03);
            E = (mat_y.m10 * y1 + mat_y.m11 * y2 + mat_y.m12 * y3 + mat_y.m13 * y4) - F * (mat_y.m10 + mat_y.m11 + mat_y.m12 + mat_y.m13);

            o_param[0] = A;
            o_param[1] = B;
            o_param[2] = C;
            o_param[3] = D;
            o_param[4] = E;
            o_param[5] = F;
            o_param[6] = G;
            o_param[7] = H;



            return true;
        }
Beispiel #6
0
        public virtual bool getParam(NyARIntPoint2d[] i_vertex, double[] o_param)
        {
            double ltx = this._local_x;
            double lty = this._local_y;
            double rbx = ltx + this._width;
            double rby = lty + this._height;
            double x1, x2, x3, x4;
            double y1, y2, y3, y4;

            x1 = i_vertex[0].x;
            x2 = i_vertex[1].x;
            x3 = i_vertex[2].x;
            x4 = i_vertex[3].x;
            y1 = i_vertex[0].y;
            y2 = i_vertex[1].y;
            y3 = i_vertex[2].y;
            y4 = i_vertex[3].y;


            NyARDoubleMatrix44 mat_x = new NyARDoubleMatrix44();

            mat_x.m00 = ltx; mat_x.m01 = lty; mat_x.m02 = -ltx * x1; mat_x.m03 = -lty * x1;
            mat_x.m10 = rbx; mat_x.m11 = lty; mat_x.m12 = -rbx * x2; mat_x.m13 = -lty * x2;
            mat_x.m20 = rbx; mat_x.m21 = rby; mat_x.m22 = -rbx * x3; mat_x.m23 = -rby * x3;
            mat_x.m30 = ltx; mat_x.m31 = rby; mat_x.m32 = -ltx * x4; mat_x.m33 = -rby * x4;
            mat_x.inverse(mat_x);
            NyARDoubleMatrix44 mat_y = new NyARDoubleMatrix44();

            mat_y.m00 = ltx; mat_y.m01 = lty; mat_y.m02 = -ltx * y1; mat_y.m03 = -lty * y1;
            mat_y.m10 = rbx; mat_y.m11 = lty; mat_y.m12 = -rbx * y2; mat_y.m13 = -lty * y2;
            mat_y.m20 = rbx; mat_y.m21 = rby; mat_y.m22 = -rbx * y3; mat_y.m23 = -rby * y3;
            mat_y.m30 = ltx; mat_y.m31 = rby; mat_y.m32 = -ltx * y4; mat_y.m33 = -rby * y4;
            mat_y.inverse(mat_y);
            double a = mat_x.m20 * x1 + mat_x.m21 * x2 + mat_x.m22 * x3 + mat_x.m23 * x4;
            double b = mat_x.m20 + mat_x.m21 + mat_x.m22 + mat_x.m23;
            double d = mat_x.m30 * x1 + mat_x.m31 * x2 + mat_x.m32 * x3 + mat_x.m33 * x4;
            double f = mat_x.m30 + mat_x.m31 + mat_x.m32 + mat_x.m33;

            double g = mat_y.m20 * y1 + mat_y.m21 * y2 + mat_y.m22 * y3 + mat_y.m23 * y4;
            double h = mat_y.m20 + mat_y.m21 + mat_y.m22 + mat_y.m23;
            double i = mat_y.m30 * y1 + mat_y.m31 * y2 + mat_y.m32 * y3 + mat_y.m33 * y4;
            double j = mat_y.m30 + mat_y.m31 + mat_y.m32 + mat_y.m33;

            NyARDoubleMatrix22 tm = new NyARDoubleMatrix22();

            tm.m00 = b;
            tm.m01 = -h;
            tm.m10 = f;
            tm.m11 = -j;
            tm.inverse(tm);


            double A, B, C, D, E, F, G, H;

            C = tm.m00 * (a - g) + tm.m01 * (d - i);    //C
            F = tm.m10 * (a - g) + tm.m11 * (d - i);    //F
            G = a - C * b;
            H = d - C * f;
            A = (mat_x.m00 * x1 + mat_x.m01 * x2 + mat_x.m02 * x3 + mat_x.m03 * x4) - C * (mat_x.m00 + mat_x.m01 + mat_x.m02 + mat_x.m03);
            B = (mat_x.m10 * x1 + mat_x.m11 * x2 + mat_x.m12 * x3 + mat_x.m13 * x4) - C * (mat_x.m10 + mat_x.m11 + mat_x.m12 + mat_x.m13);
            D = (mat_y.m00 * y1 + mat_y.m01 * y2 + mat_y.m02 * y3 + mat_y.m03 * y4) - F * (mat_y.m00 + mat_y.m01 + mat_y.m02 + mat_y.m03);
            E = (mat_y.m10 * y1 + mat_y.m11 * y2 + mat_y.m12 * y3 + mat_y.m13 * y4) - F * (mat_y.m10 + mat_y.m11 + mat_y.m12 + mat_y.m13);

            o_param[0] = A;
            o_param[1] = B;
            o_param[2] = C;
            o_param[3] = D;
            o_param[4] = E;
            o_param[5] = F;
            o_param[6] = G;
            o_param[7] = H;



            return(true);
        }