从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;
}
}
}
运行结果如下: