AGI.Foundation.Coordinates
命名空间中提供了各种平移和旋转坐标类型。这些类型提供了以通用n元组(n-tuple
)的方式,表示点的位置和轴的方向以及它们的导数。相关坐标之间可以进行相互转换。
1. 坐标
在STK组件中按照维度,坐标可分为:二维坐标、三维坐标和四维坐标。坐标类型可分为直线坐标和曲线坐标。
1.1. 二维坐标
- 直线坐标
-
Rectangular(x, y)
:直角坐标 -
UnitRectangular(x, y)
:单位直角坐标
-
- 曲线坐标
-
Polar(clock, radial)
:极坐标
-
1.2. 三维坐标
- 直线坐标
-
Cartesian(x, y, z)
:笛卡尔坐标 -
UnitCartesian(x, y, z)
:单位笛卡尔坐标
-
- 曲线坐标
-
AzimuthElevationRange(azimuth, elevation, range)
:由方位、仰角、距离组成的坐标 -
AzimuthHorizontalVertical(azimuth, horizontal, vertical)
:由方位、水平值、垂直值组成的坐标 -
Cartographic(longitude, latitude, height)
:由经度、纬度、高度组成的地理坐标 -
Cylindrical(clock, radial, z)
:由时角、半径、Z值组成的圆柱坐标 -
LongitudeLatitudeRadius (longitude, latitude, radius)
:经纬半径坐标 -
Pyramidal(zxAngle, zyAngle, z)
:金字塔坐标 -
Spherical (clock, cone, magnitude)
:球坐标 -
UnitSpherical (clock, cone)
:单位球坐标
-
1.3. 四维坐标
四维坐标用于表示三维空间的旋转:
Quaternion(w, x, y, z)
UnitQuaternion(w, x, y, z)
1.4. 示例
- 球坐标转为笛卡尔坐标
var spherical0 = new Spherical(Math.PI / 4, Math.PI / 8, 100.0);
var cartesian0 = new Cartesian(spherical0);
Console.WriteLine("球坐标:{0};笛卡尔坐标:{1}", spherical0, cartesian0);
- 笛卡尔坐标归一化
UnitCartesian unitCartesian1 = cartesian0.Normalize();
Console.WriteLine("单位矢量笛卡尔坐标:{0}", unitCartesian1);
- 地图坐标转为笛卡尔坐标
var cartographic2 = new Cartographic(Trig.DegreesToRadians(120),Trig.DegreesToRadians(30),100);
EarthCentralBody earth = CentralBodiesFacet.GetFromContext().Earth;
Cartesian cartesian2 = earth.Shape.CartographicToCartesian(cartographic2);
Console.WriteLine("地图坐标:{0};笛卡尔坐标:{1}", cartographic2, cartesian2);
- 笛卡尔坐标转为地图坐标
Cartographic cartographic3 = earth.Shape.CartesianToCartographic(cartesian2);
Console.WriteLine("笛卡尔坐标:{0};地图坐标:{1}", cartesian2, cartographic3);
2. 旋转
此处的旋转,是指原坐标系采用某种方式旋转成新坐标系。旋转矩阵×原向量,得到新坐标系中的新向量值。
2.1. 旋转方式
-
AngleAxisRotation(angle, axis)
:绕任意轴旋转指定的角度 -
ElementaryRotation(axis, angle)
:绕主轴旋转指定的角度 -
EulerSequence(angle1, angle2, angle3, sequence)
:按照指定的顺序进行三次坐标旋转,后一次旋转是在前一次旋转产生的新坐标系的基础上进行 -
YawPitchRoll(angle1, angle2, angle3, sequence)
:按照指定的顺序进行三次坐标旋转,每次旋转都是绕原始坐标系的主轴
2.2. 旋转矩阵
结构Matrix3By3
表示3×3的旋转矩阵,可以由不同的旋转方式得到。旋转矩阵与某个3维向量相乘,即可得到该向量旋转后的向量。
2.3. 示例
- 新坐标系绕原坐标系z轴旋转90度,原向量(1,0,0)
var vector4 = new Cartesian(1, 0, 0);
var rotation4 = new ElementaryRotation(AxisIndicator.Third, Trig.DegreesToRadians(-90));
Cartesian newVector4 = new Matrix3By3(rotation4).Multiply(vector4);
Console.WriteLine("旋转前:{0};旋转后:{1}", vector4, newVector4);
- 欧拉旋转
var vector5 = new Cartesian(1, 0, 0);
double angle = Trig.DegreesToRadians(90);
var euler = new EulerSequence(angle, angle, angle, EulerSequenceIndicator.Euler321);
Cartesian newVector5 = new Matrix3By3(euler).Multiply(vector5);
Console.WriteLine("旋转前:{0};旋转后:{1}", vector5, newVector5);
- 偏航俯仰翻滚旋转
var vector6 = new Cartesian(1, 0, 0);
double angle6 = Trig.DegreesToRadians(90);
var ypr = new YawPitchRoll(angle, angle, angle, YawPitchRollIndicator.YPR);
Cartesian newVector6 = new Matrix3By3(ypr).Multiply(vector6);
Console.WriteLine("旋转前:{0};旋转后:{1}", vector6, newVector6);
源代码地址
https://github.com/icgp/STKComponentsTutorial/blob/master/Example004/Example004.cs
网友评论