利用七参数求解坐标转换(C#简单快速实现)

        从A空间直角坐标系到B空间直角坐标系的7个转换参数(3个平移参数ΔX,ΔY,ΔZ ,3个旋转参数εX,εY,εZ ,一个尺度变化参数m),请根据空间点在A空间直角坐标系中的坐标求该空间点在B空间直角坐标系中的坐标。

下面试代码:

using System;
namespace 坐标转换
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("请输入转换参数εx (格式为:ddd.mmss) =");
            double εx = 坐标转换.DEG(double.Parse(Console.ReadLine()));
            Console.Write("请输入转换参数εy (格式为:ddd.mmss) =");
            double εy = 坐标转换.DEG(double.Parse(Console.ReadLine()));
            Console.Write("请输入转换参数εz (格式为:ddd.mmss) =");
            double εz = 坐标转换.DEG(double.Parse(Console.ReadLine()));
            Console.Write("请输入转换参数ΔX0=");
            double ΔX0 = double.Parse(Console.ReadLine());
            Console.Write("请输入转换参数ΔY0=");
            double ΔY0 = double.Parse(Console.ReadLine());
            Console.Write("请输入转换参数ΔZ0=");
            double ΔZ0 = double.Parse(Console.ReadLine());
            Console.Write("请输入转换参数m=");
            double m = double.Parse(Console.ReadLine());
            坐标转换.设置参数(εx, εy, εz, ΔX0, ΔY0, ΔZ0, m);
            do
            {
                Console.Write("请输入XA[直接回车结束输入]=");
                string str = Console.ReadLine();
                if (str == "") break;
                double XA = double.Parse(str);
                Console.Write("请输入YA=");
                double YA = double.Parse(Console.ReadLine());
                Console.Write("请输入ZA=");
                double ZA = double.Parse(Console.ReadLine());
                double XB, YB, ZB;
                坐标转换.转换(XA, YA, ZA, out XB, out YB, out ZB);
                Console.WriteLine("该点在B坐标系中的坐标为({0},{1},{2})", XB, YB, ZB);
            } while (true);
        }
    }
    class 坐标转换
    {
        //转换参数
        static public double εx;
        static public double εy;
        static public double εz;
        static public double ΔX0;
        static public double ΔY0;
        static public double ΔZ0;
        static public double m;
        //将ddd.mmss转为弧度
        static public double DEG(double ang)
        {
            int 符号 = 1;
            if (ang < 0)
            {
                符号 = -1;
                ang = -ang;
            }
            ang += 1.0E-10;//加 1.0E-6 秒
            int 度 = (int)ang;
            double t = (ang - 度) * 100;
            int 分 = (int)(t);
            double 秒 = t - 分 - 1.0E-8;//减 1.0E-6 秒
            if (秒 < 0) 秒 = 0;
            return 符号 * (度 + 分 / 60.0 + 秒 / 36.0) / 180.0 * Math.PI;
        }
        //设置7参数
        static public void 设置参数(double εx, double εy, double εz, double ΔX0, double ΔY0, double ΔZ0, double m)
        {
            坐标转换.εx = εx;
            坐标转换.εy = εy;
            坐标转换.εz = εz;
            坐标转换.ΔX0 = ΔX0;
            坐标转换.ΔY0 = ΔY0;
            坐标转换.ΔZ0 = ΔZ0;
            坐标转换.m = m;
        }
        //7参数转换
        static public void 转换(double X1, double Y1, double Z1, out double X2, out double Y2, out double Z2)
        {
            double R11 = Math.Cos(εy) * Math.Cos(εz);
            double R12 = Math.Cos(εy) * Math.Sin(εz);
            double R13 = -Math.Sin(εy);
            double R21 = -Math.Cos(εx) * Math.Sin(εz) + Math.Sin(εx) * Math.Sin(εy) * Math.Cos(εz);
            double R22 = Math.Cos(εx) * Math.Cos(εz) + Math.Sin(εx) * Math.Sin(εy) * Math.Sin(εz);
            double R23 = Math.Sin(εx) * Math.Cos(εy);
            double R31 = Math.Sin(εx) * Math.Sin(εz) + Math.Cos(εx) * Math.Sin(εy) * Math.Cos(εz);
            double R32 = -Math.Sin(εx) * Math.Cos(εz) + Math.Cos(εx) * Math.Sin(εy) * Math.Sin(εz);
            double R33 = Math.Cos(εx) * Math.Cos(εy);
            X2 = (1 + m) * (R11 * X1 + R12 * Y1 + R13 * Z1) + ΔX0;
            Y2 = (1 + m) * (R21 * X1 + R22 * Y1 + R23 * Z1) + ΔY0;
            Z2 = (1 + m) * (R31 * X1 + R32 * Y1 + R33 * Z1) + ΔZ0;
        }
    }
}

运行结果如下:

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值