public void pca(double[] i_v1, double[] i_v2, int i_number_of_point, NyARDoubleMatrix22 o_evec, double[] o_ev, double[] o_mean)
        {
            NyARMat input = this.__pca_input;// 次処理で初期化される。

            // pcaの準備
            input.realloc(i_number_of_point, 2);
            double[][] input_array = input.getArray();
            for (int i = 0; i < i_number_of_point; i++)
            {
                input_array[i][0] = i_v1[i];
                input_array[i][1] = i_v2[i];
            }
            // 主成分分析
            input.pca(this.__pca_evec, this.__pca_ev, this.__pca_mean);
            double[]   mean_array = this.__pca_mean.getArray();
            double[][] evec_array = this.__pca_evec.getArray();
            double[]   ev_array   = this.__pca_ev.getArray();
            o_evec.m00 = evec_array[0][0];
            o_evec.m01 = evec_array[0][1];
            o_evec.m10 = evec_array[1][0];
            o_evec.m11 = evec_array[1][1];
            o_ev[0]    = ev_array[0];
            o_ev[1]    = ev_array[1];
            o_mean[0]  = mean_array[0];
            o_mean[1]  = mean_array[1];
            return;
        }
	    public void pca(double[] i_v1,double[] i_v2,int i_number_of_point,NyARDoubleMatrix22 o_evec, double[] o_ev,double[] o_mean)
        {
            NyARMat input = this.__pca_input;// 次処理で初期化される。		
            // pcaの準備
            input.realloc(i_number_of_point, 2);
            double[][] input_array = input.getArray();
            for (int i = 0; i < i_number_of_point; i++)
            {
                input_array[i][0] = i_v1[i];
                input_array[i][1] = i_v2[i];
            }
            // 主成分分析
            input.pca(this.__pca_evec, this.__pca_ev, this.__pca_mean);
            double[] mean_array = this.__pca_mean.getArray();
            double[][] evec_array = this.__pca_evec.getArray();
            double[] ev_array = this.__pca_ev.getArray();
            o_evec.m00 = evec_array[0][0];
            o_evec.m01 = evec_array[0][1];
            o_evec.m10 = evec_array[1][0];
            o_evec.m11 = evec_array[1][1];
            o_ev[0] = ev_array[0];
            o_ev[1] = ev_array[1];
            o_mean[0] = mean_array[0];
            o_mean[1] = mean_array[1];
            return;
        }
示例#3
0
        /**
         * 輪郭点集合からay+bx+c=0の直線式を計算します。
         * @param i_st
         * @param i_ed
         * @param i_xcoord
         * @param i_ycoord
         * @param i_cood_num
         * @param o_line
         * @return
         * @throws NyARException
         */
        public bool coord2Line(int i_st, int i_ed, int[] i_xcoord, int[] i_ycoord, int i_cood_num, NyARLinear o_line)
        {
            //頂点を取得
            int    n, st, ed;
            double w1;

            //探索区間の決定
            if (i_ed >= i_st)
            {
                //頂点[i]から頂点[i+1]までの輪郭が、1区間にあるとき
                w1 = (double)(i_ed - i_st + 1) * 0.05 + 0.5;
                //探索区間の決定
                st = (int)(i_st + w1);
                ed = (int)(i_ed - w1);
            }
            else
            {
                //頂点[i]から頂点[i+1]までの輪郭が、2区間に分かれているとき
                w1 = (double)((i_ed + i_cood_num - i_st + 1) % i_cood_num) * 0.05 + 0.5;
                //探索区間の決定
                st = ((int)(i_st + w1)) % i_cood_num;
                ed = ((int)(i_ed + i_cood_num - w1)) % i_cood_num;
            }
            //探索区間数を確認
            if (st <= ed)
            {
                //探索区間は1区間
                n = ed - st + 1;
                this._dist_factor.observ2IdealBatch(i_xcoord, i_ycoord, st, n, this._xpos, this._ypos, 0);
            }
            else
            {
                //探索区間は2区間
                n = ed + 1 + i_cood_num - st;
                this._dist_factor.observ2IdealBatch(i_xcoord, i_ycoord, st, i_cood_num - st, this._xpos, this._ypos, 0);
                this._dist_factor.observ2IdealBatch(i_xcoord, i_ycoord, 0, ed + 1, this._xpos, this._ypos, i_cood_num - st);
            }
            //要素数の確認
            if (n < 2)
            {
                // nが2以下でmatrix.PCAを計算することはできないので、エラー
                return(false);
            }
            //主成分分析する。
            NyARDoubleMatrix22 evec = this.__getSquareLine_evec;

            double[] mean = this.__getSquareLine_mean;


            this._pca.pca(this._xpos, this._ypos, n, evec, this.__getSquareLine_ev, mean);
            o_line.dy = evec.m01;                                     // line[i][0] = evec->m[1];
            o_line.dx = -evec.m00;                                    // line[i][1] = -evec->m[0];
            o_line.c  = -(o_line.dy * mean[0] + o_line.dx * mean[1]); // line[i][2] = -(line[i][0]*mean->v[0] + line[i][1]*mean->v[1]);

            return(true);
        }
        private const double PCA_VZERO = 1e-16; // #define VZERO 1e-16

        #endregion Fields

        #region Methods

        //override
        public void pca(double[] i_v1, double[] i_v2, int i_number_of_point, NyARDoubleMatrix22 o_evec, double[] o_ev, double[] o_mean)
        {
            PCA_PCA(i_v1, i_v2, i_number_of_point, o_evec, o_ev, o_mean);

            double sum = o_ev[0] + o_ev[1];
            // For順変更禁止
            o_ev[0] /= sum;// ev->v[i] /= sum;
            o_ev[1] /= sum;// ev->v[i] /= sum;
            return;
        }
示例#5
0
        /**
         * static int PCA( ARMat *input, ARMat *output, ARVec *ev )
         *
         * @param output
         * @param o_ev
         * @
         */
        private void PCA_PCA(double[] i_v1, double[] i_v2, int i_number_of_data, NyARDoubleMatrix22 o_matrix, double[] o_ev, double[] o_mean)
        {
            // double[] mean_array=mean.getArray();
            // mean.zeroClear();

            //PCA_EXの処理
            double sx = 0;
            double sy = 0;

            for (int i = 0; i < i_number_of_data; i++)
            {
                sx += i_v1[i];
                sy += i_v2[i];
            }
            sx = sx / i_number_of_data;
            sy = sy / i_number_of_data;

            //PCA_CENTERとPCA_xt_by_xを一緒に処理
            double srow = Math.Sqrt((double)i_number_of_data);
            double w00, w11, w10;

            w00 = w11 = w10 = 0.0;// *out = 0.0;
            for (int i = 0; i < i_number_of_data; i++)
            {
                double x = (i_v1[i] - sx) / srow;
                double y = (i_v2[i] - sy) / srow;
                w00 += (x * x); // *out += *in1 * *in2;
                w10 += (x * y); // *out += *in1 * *in2;
                w11 += (y * y); // *out += *in1 * *in2;
            }
            o_matrix.m00 = w00;
            o_matrix.m01 = o_matrix.m10 = w10;
            o_matrix.m11 = w11;

            //PCA_PCAの処理
            PCA_QRM(o_matrix, o_ev);
            // m2 = o_output.m;// m2 = output->m;
            if (o_ev[0] < PCA_VZERO)
            {                       // if( ev->v[i] < VZERO ){
                o_ev[0]      = 0.0; // ev->v[i] = 0.0;
                o_matrix.m00 = 0.0; // *(m2++) = 0.0;
                o_matrix.m01 = 0.0; // *(m2++) = 0.0;
            }

            if (o_ev[1] < PCA_VZERO)
            {                       // if( ev->v[i] < VZERO ){
                o_ev[1]      = 0.0; // ev->v[i] = 0.0;
                o_matrix.m10 = 0.0; // *(m2++) = 0.0;
                o_matrix.m11 = 0.0; // *(m2++) = 0.0;
            }
            o_mean[0] = sx;
            o_mean[1] = sy;
            // }
            return;
        }
示例#6
0
        //override
        public void pca(double[] i_v1, double[] i_v2, int i_number_of_point, NyARDoubleMatrix22 o_evec, double[] o_ev, double[] o_mean)
        {
            PCA_PCA(i_v1, i_v2, i_number_of_point, o_evec, o_ev, o_mean);

            double sum = o_ev[0] + o_ev[1];

            // For順変更禁止
            o_ev[0] /= sum; // ev->v[i] /= sum;
            o_ev[1] /= sum; // ev->v[i] /= sum;
            return;
        }
        public bool inverse(NyARDoubleMatrix22 i_src)
	    {
		    double a11,a12,a21,a22;
		    a11=i_src.m00;
		    a12=i_src.m01;
		    a21=i_src.m10;
		    a22=i_src.m11;
		    double det=a11*a22-a12*a21;
		    if(det==0){
			    return false;
		    }
		    det=1/det;
		    this.m00=a22*det;
		    this.m01=-a12*det;
		    this.m10=-a21*det;
		    this.m11=a11*det;
		    return true;
	    }
        public bool inverse(NyARDoubleMatrix22 i_src)
        {
            double a11, a12, a21, a22;

            a11 = i_src.m00;
            a12 = i_src.m01;
            a21 = i_src.m10;
            a22 = i_src.m11;
            double det = a11 * a22 - a12 * a21;

            if (det == 0)
            {
                return(false);
            }
            det      = 1 / det;
            this.m00 = a22 * det;
            this.m01 = -a12 * det;
            this.m10 = -a21 * det;
            this.m11 = a11 * det;
            return(true);
        }
        private const double PCA_VZERO = 1e-16; // #define VZERO 1e-16

        /**
         * static int QRM( ARMat *a, ARVec *dv )の代替関数
         * 
         * @param a
         * @param dv
         * @throws NyARException
         */
	    private static void PCA_QRM(NyARDoubleMatrix22 o_matrix, double[] dv)
	    {
            double w, t, s, x, y, c;
            double ev1;
            double dv_x, dv_y;
            double mat00, mat01, mat10, mat11;
            // <this.vecTridiagonalize2d(i_mat, dv, ev);>
            dv_x = o_matrix.m00;// this.m[dim - 2][dim - 2];// d.v[dim-2]=a.m[dim-2][dim-2];//d->v[dim-2]=a->m[(dim-2)*dim+(dim-2)];
            ev1 = o_matrix.m01;// this.m[dim - 2][dim - 1];// e.v[dim-2+i_e_start]=a.m[dim-2][dim-1];//e->v[dim-2] = a->m[(dim-2)*dim+(dim-1)];
            dv_y = o_matrix.m11;// this.m[dim - 1][dim - 1];// d.v[dim-1]=a_array[dim-1][dim-1];//d->v[dim-1] =a->m[(dim-1)*dim+(dim-1)];
            // 単位行列にする。
            mat00 = mat11 = 1;
            mat01 = mat10 = 0;
            // </this.vecTridiagonalize2d(i_mat, dv, ev);>

            // int j = 1;
            // // while(j>0 && fabs(ev->v[j])>EPS*(fabs(dv->v[j-1])+fabs(dv->v[j])))
            // while (j > 0 && Math.abs(ev1) > PCA_EPS * (Math.abs(dv.x) + Math.abs(dv.y))) {
            // j--;
            // }
            // if (j == 0) {
            int iter = 0;
            do
            {
                iter++;
                if (iter > PCA_MAX_ITER)
                {
                    break;
                }
                w = (dv_x - dv_y) / 2;// w = (dv->v[h-1] -dv->v[h]) / 2;//ここ?
                t = ev1 * ev1;// t = ev->v[h] * ev->v[h];
                s = Math.Sqrt(w * w + t);
                if (w < 0)
                {
                    s = -s;
                }
                x = dv_x - dv_y + t / (w + s);// x = dv->v[j] -dv->v[h] +t/(w+s);
                y = ev1;// y = ev->v[j+1];

                if (Math.Abs(x) >= Math.Abs(y))
                {
                    if (Math.Abs(x) > PCA_VZERO)
                    {
                        t = -y / x;
                        c = 1 / Math.Sqrt(t * t + 1);
                        s = t * c;
                    }
                    else
                    {
                        c = 1.0;
                        s = 0.0;
                    }
                }
                else
                {
                    t = -x / y;
                    s = 1.0 / Math.Sqrt(t * t + 1);
                    c = t * s;
                }
                w = dv_x - dv_y;// w = dv->v[k] -dv->v[k+1];
                t = (w * s + 2 * c * ev1) * s;// t = (w * s +2 * c *ev->v[k+1]) *s;
                dv_x -= t;// dv->v[k] -= t;
                dv_y += t;// dv->v[k+1] += t;
                ev1 += s * (c * w - 2 * s * ev1);// ev->v[k+1]+= s * (c* w- 2* s *ev->v[k+1]);

                x = mat00;// x = a->m[k*dim+i];
                y = mat10;// y = a->m[(k+1)*dim+i];
                mat00 = c * x - s * y;// a->m[k*dim+i] = c * x - s* y;
                mat10 = s * x + c * y;// a->m[(k+1)*dim+i] = s* x + c * y;

                x = mat01;// x = a->m[k*dim+i];
                y = mat11;// y = a->m[(k+1)*dim+i];
                mat01 = c * x - s * y;// a->m[k*dim+i] = c * x - s* y;
                mat11 = s * x + c * y;// a->m[(k+1)*dim+i] = s* x + c * y;
            } while (Math.Abs(ev1) > PCA_EPS * (Math.Abs(dv_x) + Math.Abs(dv_y)));
            // }

            t = dv_x;// t = dv->v[h];
            if (dv_y > t)
            {// if( dv->v[i] > t ) {
                t = dv_y;// t = dv->v[h];
                dv_y = dv_x;// dv->v[h] = dv->v[k];
                dv_x = t;// dv->v[k] = t;
                // 行の入れ替え
                o_matrix.m00 = mat10;
                o_matrix.m01 = mat11;
                o_matrix.m10 = mat00;
                o_matrix.m11 = mat01;

            }
            else
            {
                // 行の入れ替えはなし
                o_matrix.m00 = mat00;
                o_matrix.m01 = mat01;
                o_matrix.m10 = mat10;
                o_matrix.m11 = mat11;
            }
            dv[0] = dv_x;
            dv[1] = dv_y;
            return;
        }
        /**
         * static int PCA( ARMat *input, ARMat *output, ARVec *ev )
         * 
         * @param output
         * @param o_ev
         * @throws NyARException
         */
     	private void PCA_PCA(double[] i_v1,double[] i_v2,int i_number_of_data,NyARDoubleMatrix22 o_matrix, double[] o_ev,double[] o_mean)
        {
            // double[] mean_array=mean.getArray();
            // mean.zeroClear();

            //PCA_EXの処理
            double sx = 0;
            double sy = 0;
            for (int i = 0; i < i_number_of_data; i++)
            {
                sx += i_v1[i];
                sy += i_v2[i];
            }
            sx = sx / i_number_of_data;
            sy = sy / i_number_of_data;

            //PCA_CENTERとPCA_xt_by_xを一緒に処理
            double srow = Math.Sqrt((double)i_number_of_data);
            double w00, w11, w10;
            w00 = w11 = w10 = 0.0;// *out = 0.0;
            for (int i = 0; i < i_number_of_data; i++)
            {
			    double x = (i_v1[i] - sx) / srow;
			    double y = (i_v2[i] - sy) / srow;
                w00 += (x * x);// *out += *in1 * *in2;
                w10 += (x * y);// *out += *in1 * *in2;
                w11 += (y * y);// *out += *in1 * *in2;
            }
            o_matrix.m00 = w00;
            o_matrix.m01 = o_matrix.m10 = w10;
            o_matrix.m11 = w11;

            //PCA_PCAの処理
            PCA_QRM(o_matrix, o_ev);
            // m2 = o_output.m;// m2 = output->m;
            if (o_ev[0] < PCA_VZERO)
            {// if( ev->v[i] < VZERO ){
                o_ev[0] = 0.0;// ev->v[i] = 0.0;
                o_matrix.m00 = 0.0;// *(m2++) = 0.0;
                o_matrix.m01 = 0.0;// *(m2++) = 0.0;
            }

            if (o_ev[1] < PCA_VZERO)
            {// if( ev->v[i] < VZERO ){
                o_ev[1] = 0.0;// ev->v[i] = 0.0;
                o_matrix.m10 = 0.0;// *(m2++) = 0.0;
                o_matrix.m11 = 0.0;// *(m2++) = 0.0;
            }
            o_mean[0] = sx;
            o_mean[1] = sy;
            // }
            return;
        }
示例#11
0
        private const double PCA_VZERO = 1e-16; // #define VZERO 1e-16

        /**
         * static int QRM( ARMat *a, ARVec *dv )の代替関数
         *
         * @param a
         * @param dv
         * @
         */
        private static void PCA_QRM(NyARDoubleMatrix22 o_matrix, double[] dv)
        {
            double w, t, s, x, y, c;
            double ev1;
            double dv_x, dv_y;
            double mat00, mat01, mat10, mat11;

            // <this.vecTridiagonalize2d(i_mat, dv, ev);>
            dv_x = o_matrix.m00; // this.m[dim - 2][dim - 2];// d.v[dim-2]=a.m[dim-2][dim-2];//d->v[dim-2]=a->m[(dim-2)*dim+(dim-2)];
            ev1  = o_matrix.m01; // this.m[dim - 2][dim - 1];// e.v[dim-2+i_e_start]=a.m[dim-2][dim-1];//e->v[dim-2] = a->m[(dim-2)*dim+(dim-1)];
            dv_y = o_matrix.m11; // this.m[dim - 1][dim - 1];// d.v[dim-1]=a_array[dim-1][dim-1];//d->v[dim-1] =a->m[(dim-1)*dim+(dim-1)];
            // 単位行列にする。
            mat00 = mat11 = 1;
            mat01 = mat10 = 0;
            // </this.vecTridiagonalize2d(i_mat, dv, ev);>

            // int j = 1;
            // // while(j>0 && fabs(ev->v[j])>EPS*(fabs(dv->v[j-1])+fabs(dv->v[j])))
            // while (j > 0 && Math.abs(ev1) > PCA_EPS * (Math.abs(dv.x) + Math.abs(dv.y))) {
            // j--;
            // }
            // if (j == 0) {
            int iter = 0;

            do
            {
                iter++;
                if (iter > PCA_MAX_ITER)
                {
                    break;
                }
                w = (dv_x - dv_y) / 2; // w = (dv->v[h-1] -dv->v[h]) / 2;//ここ?
                t = ev1 * ev1;         // t = ev->v[h] * ev->v[h];
                s = Math.Sqrt(w * w + t);
                if (w < 0)
                {
                    s = -s;
                }
                x = dv_x - dv_y + t / (w + s); // x = dv->v[j] -dv->v[h] +t/(w+s);
                y = ev1;                       // y = ev->v[j+1];

                if (Math.Abs(x) >= Math.Abs(y))
                {
                    if (Math.Abs(x) > PCA_VZERO)
                    {
                        t = -y / x;
                        c = 1 / Math.Sqrt(t * t + 1);
                        s = t * c;
                    }
                    else
                    {
                        c = 1.0;
                        s = 0.0;
                    }
                }
                else
                {
                    t = -x / y;
                    s = 1.0 / Math.Sqrt(t * t + 1);
                    c = t * s;
                }
                w     = dv_x - dv_y;               // w = dv->v[k] -dv->v[k+1];
                t     = (w * s + 2 * c * ev1) * s; // t = (w * s +2 * c *ev->v[k+1]) *s;
                dv_x -= t;                         // dv->v[k] -= t;
                dv_y += t;                         // dv->v[k+1] += t;
                ev1  += s * (c * w - 2 * s * ev1); // ev->v[k+1]+= s * (c* w- 2* s *ev->v[k+1]);

                x     = mat00;                     // x = a->m[k*dim+i];
                y     = mat10;                     // y = a->m[(k+1)*dim+i];
                mat00 = c * x - s * y;             // a->m[k*dim+i] = c * x - s* y;
                mat10 = s * x + c * y;             // a->m[(k+1)*dim+i] = s* x + c * y;

                x     = mat01;                     // x = a->m[k*dim+i];
                y     = mat11;                     // y = a->m[(k+1)*dim+i];
                mat01 = c * x - s * y;             // a->m[k*dim+i] = c * x - s* y;
                mat11 = s * x + c * y;             // a->m[(k+1)*dim+i] = s* x + c * y;
            } while (Math.Abs(ev1) > PCA_EPS * (Math.Abs(dv_x) + Math.Abs(dv_y)));
            // }

            t = dv_x;        // t = dv->v[h];
            if (dv_y > t)
            {                // if( dv->v[i] > t ) {
                t    = dv_y; // t = dv->v[h];
                dv_y = dv_x; // dv->v[h] = dv->v[k];
                dv_x = t;    // dv->v[k] = t;
                // 行の入れ替え
                o_matrix.m00 = mat10;
                o_matrix.m01 = mat11;
                o_matrix.m10 = mat00;
                o_matrix.m11 = mat01;
            }
            else
            {
                // 行の入れ替えはなし
                o_matrix.m00 = mat00;
                o_matrix.m01 = mat01;
                o_matrix.m10 = mat10;
                o_matrix.m11 = mat11;
            }
            dv[0] = dv_x;
            dv[1] = dv_y;
            return;
        }
        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;
        }
示例#13
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);
        }