コード例 #1
0
        /// <summary>
        /// CCD座標(cx,cy)->(az,alt)に変換
        /// </summary>
        //
        //   CCD座標(cx,cy):CCD中心からの誤差座標[pix]    Std. Cam が基準(cx = x-xc, cy = y-yc)
        //   中心位置(az_c,alt_c)と視野回転(theta_c)
        //   fl:焦点距離[mm], ccdpx,ccdpy:ピクセル間隔[mm]

        public void cxcy2azalt(double cx, double cy,
                               double az_c, double alt_c, int mode, double theta_c,
                               double fl, double ccdpx, double ccdpy,
                               ref double az, ref double alt)
        {
            double rad = Math.PI / 180.0;
            double cxmm, cymm;

            //ターゲットの方向余弦
            if (mode == mmEast)
            {
                cxmm = -cx * ccdpx; // +ccd -az
                cymm = +cy * ccdpy; // +ccd +alt
            }
            else
            {                       //mmWest
                cxmm = +cx * ccdpx; // +ccd +az
                cymm = -cy * ccdpy; // +ccd -alt
            }
            CvMat v1 = new CvMat(3, 1, MatrixType.F64C1);

            v1.Set2D(0, 0, fl);
            v1.Set2D(1, 0, -cxmm);
            v1.Set2D(2, 0, cymm);
            v1.Normalize(v1);// 方向余弦化

            CvMat v2 = new CvMat(3, 1, MatrixType.F64C1);
            CvMat Rx = new CvMat(3, 3, MatrixType.F64C1);
            CvMat Rz = new CvMat(3, 3, MatrixType.F64C1);
            CvMat Ry = new CvMat(3, 3, MatrixType.F64C1);

            //Rx.rotX(-theta_c * rad); // 回転マトリクスをセット
            double sin = Math.Sin(-theta_c * rad);
            double cos = Math.Cos(-theta_c * rad);

            Rx.Set2D(0, 0, 1); Rx.Set2D(0, 1, 0); Rx.Set2D(0, 2, 0);
            Rx.Set2D(1, 0, 0); Rx.Set2D(1, 1, cos); Rx.Set2D(1, 2, -sin);
            Rx.Set2D(2, 0, 0); Rx.Set2D(2, 1, sin); Rx.Set2D(2, 2, cos);


            //Rz.rotZ(-az_c   *rad ); // 天球座標系と回転方向が逆なのでマイナス
            sin = Math.Sin(-az_c * rad);
            cos = Math.Cos(-az_c * rad);
            Rz.Set2D(0, 0, cos); Rz.Set2D(0, 1, -sin); Rz.Set2D(0, 2, 0);
            Rz.Set2D(1, 0, sin); Rz.Set2D(1, 1, cos); Rz.Set2D(1, 2, 0);
            Rz.Set2D(2, 0, 0); Rz.Set2D(2, 1, 0); Rz.Set2D(2, 2, 1);

            //Ry.rotY(-alt_c  *rad ); // 回転マトリクスをセット
            sin = Math.Sin(-alt_c * rad);
            cos = Math.Cos(-alt_c * rad);
            Ry.Set2D(0, 0, cos); Ry.Set2D(0, 1, 0); Ry.Set2D(0, 2, sin);
            Ry.Set2D(1, 0, 0); Ry.Set2D(1, 1, 1); Ry.Set2D(1, 2, 0);
            Ry.Set2D(2, 0, -sin); Ry.Set2D(2, 1, 0); Ry.Set2D(2, 2, cos);
            v2 = Rz * (Ry * (Rx * v1)); // 順番注意(画像中心をx軸に一致させている状態がスタート)

            // Retrun Val
            az = Math.Atan2(-v2.Get2D(1, 0), v2.Get2D(0, 0)) / rad;
            if (az < 0)
            {
                az += 360;
            }
            alt = Math.Asin(v2.Get2D(2, 0)) / rad;

            //    //Az_Cとの距離が近い値を採用
            //    double az2 = az - 360;
            //    double az3 = az + 360;
            //    double dis1 = Math.Abs(az - az_c);
            //    double dis2 = Math.Abs(az2 - az_c);
            //    double dis3 = Math.Abs(az3 - az_c);
            //    if (dis1 > dis2) az = az2;
            //    if (dis1 > dis3) az = az3;
        }