二维平面坐标转换的主要类型、基本原理及代码实现
坐标转换是测量与定位领域经常设计到的话题,本次就二维平面上的几种主要坐标转换类型和原理进行介绍,并且编写了小Demo进行实现。本文主要用于记录坐标转换原理和开发Demo的使用介绍。
1. 平面坐标转换主要类型及基本原理
Demo可以实现的坐标转换类型有5种,其分别是:
- 相似变换(Similar Transformation)
- 仿射变换(Affine Transformation)
- 多项式变换(Polynomial Transformation)
- 双线性变换(Bilinear Transformation)
- 投影变换(Projective Transformation)
2. Demo实现功能
使用C#配合MathNet中的矩阵功能和LiveChart控件编制了一个小Demo用于实现以上二维坐标转换。【源代码下载路径: 】主要功能有:
- 根据同一批点在坐标系A下坐标和坐标系B下坐标,确定坐标系间的转换参数。
- 人为给出坐标系A与C之间的转换参数,将坐标系A下已知点位坐标转换到坐标系C下对应点坐标。
3. Demo程序模块介绍:
3.1基本类
Degree、Point、CoordinateSystemPoints都是为了服务于整个程序,所定义的基础类,用于度分秒和弧度、点位信息以及某一坐标系下的点坐标列表等。
3.2窗体类
Demo中定义了两个窗体,一个是MainWindow为主窗体,一个是TransConfig窗体,用于进行坐标转换过程中参数的设置。
3.3枚举类
枚举类型SimilarTransParameterType是在SimilarTransfomation过程中定义的,因为在相似变换参数拟合过程中,分别用旋转角的方式和参数方式进行了实现,结果一致,这个枚举用于区分采用哪种类型,但是在实际的程序展示过程中,仅仅在后台进行了固定(个人固定应用的是旋转角方式。);SketchType用于表示绘制点位草图的类型,有两种,分别是大图和小图,对应的是主界面上坐标点位列表下方的缩略图和右侧的整体缩略图。
3.4参数拟合相关类
坐标系转换过程中参数拟合模块的设计,由于不同的拟合过程具有一定的程式上的相近行,所以设计了一个参数基类ParametersBase,其中包含有各种参数转换都要用到的基本方法,这些方法采用virtual可被子类根据自身情况进行override。而其他物种平面参数转换类SimilarTransParameters、AffineTransparameters、PolynomialTransParameters、BilinearTransParameters和ProjectiveTransParameters都是继承ParametersBase父类,并在其基础上进行的操作。整体上来说,这一部分都是服务于参数的最小二乘获取。
3.5坐标转换
定义了TransPoint类,其中能够实现针对不同类型转换通过输入转换参数进行点坐标转换的功能。
//具体的类中的属性、方法可以查看程序中的类图DemoDiagram.cd。
4. Demo使用
4.1必要的插件和库
矩阵运算采用了MathNet库,绘图采用了LiveChart库,安装过程如下:
其中LiveChartCore的版本比较新,请在LiveChart官网,采用命令行的方式通过Nuget进行安装。LiveChart官网 https://lvcharts.com/docs/wpf/2.0.0-beta.220/Overview.Installation
4.2界面说明
主界面如下所示:
4.3文本格式
输入文本格式,中间采用\t进行分割:
输出文本,选中.txt文本进行输出:
4.3坐标参数拟合
菜单栏中File菜单主要是点位的输入,其中Input file xy是输入坐标系A下的source points,而Input file XY则是输入转换坐标系下对应的target points。这两个数据将分别显示在Coordinate SystemA 和 Coordinate SystemB中。Save则是再进行操作后可以将数据输出成.txt文本。
完成数据输入以后选择转换参数拟合的模型。
进而直接点击Start Calculation Parameters 按钮,结果将显示在左下角 Trans Parameters栏中。通过右侧的Sketch可以显示出点位的分布。
4.4坐标转换
通过Input file xy输入待转换点坐标,通过Transformation Type Setting设置转换类型,点击Start Points Transformation 按钮,会弹出TransConfig转换设置窗体。
转换参数的设置有两种模式,第一种Transformation result just now是采用刚刚进行坐标系转换参数拟合所获得的结果进行转换。Import parameters则是自行输入转换参数结果。
- 采用第一种模式,点击Finish,即可完成转换。
- 采用第二种方式,需要先点击Parameters Templete获取参数设置模板,然后在模板中进行更改参数后,点击Submit Params,最后点击Finish完成。(注意在更改参数的过程中不要改变对应格式,建议将内容copy到.txt文本中进行更改后再粘贴回文本框。)
4.5注意事项
请随时关注程序窗体左下角的Tips提示信息,其中会显示操作无法进行的具体原因。完成一次操作后最好点击Clear All按钮清除所有数据,再进行下一操作。另外,在右侧Sketch选择ComoboItem进行绘图的过程中,如果左侧数据进行了更新,无法做到数据实时更新绘制,需要重新选择图像的呈现模式,重新绘制。所有的文件input和save都采用.txt文本格式进行。
5.结语
此程序仅仅是个人的一次尝试,主要是实现平面二维坐标的转换和二维坐标系间转换参数的确定,涉及到了五种主要的方法,应用到了多台和继承以及部分反射的内容,但是仍然比较幼稚和不成熟。本程序的结果经过检核,较为准确。仅供学习参考,也欢迎更多同学对其进行更改和完善。
案例Example:
本程序结果与其不完全一致,但整体差距不大,原因可能是进行了多次迭代,矩阵库的计算过程中的一些截断误差等造成。
【源代码下载路径:二维平面坐标系转换参数拟合及坐标变换程序(原理+源代码)-包含相似变换、仿射变换、多项式变换、双线性变换、投影变换】