本篇讨论的主题是在平面坐标系中如何将一个坐标系(目标坐标系,以下简称目标系)中的所有点投射到另一个坐标系(基坐标系)中。平面坐标系之间的转化一般有三步操作:1、平移;2、旋转;3、拉伸。

在转化的过程中需要的几个已知条件分别是:1、目标系的一个已知点(特征点A)对应于基坐标系中的点(特征点A’)。2、目标系的原点(O)对应于基坐标系中的原点(O')。3、基座标系的原点(O‘’)。

一、坐标系拉伸

①、计算两坐标系X和Y轴分别对应的拉伸比例:

②、将A点按缩放比例映射到基坐标系中(A''):

二、坐标系旋转和平移

①:坐标系旋转

②坐标系平移加旋转

③得出公式

根据坐标系旋转和平移的规则,可以得出公式

我们的目标是求出θ。

设m = cos(θ),n=sin(θ),根据已知量可得出公式:

得出方程组的增广矩阵,根据高斯消除元法即可求得m,n:

再根据反三角函数求得θ,此时θ、a、b、T(坐标系倍数)的值都已经得到。

故任意目标系坐标(x、y)可通过公式映射到基坐标系(f(x)、f(y)):

C#代码:

public class CoorPoint{public double x { get; set; }public double y { get; set; }public CoorPoint(){ }public CoorPoint(double x, double y){this.x = x;this.y = y;}public CoorPoint(CoorPoint pt){this.x = pt.x;this.y = pt.y;}public static CoorPoint operator +(CoorPoint src, CoorPoint tar){CoorPoint result = new CoorPoint(src);result.x += tar.x;result.y += tar.y;return result;}public static CoorPoint operator -(CoorPoint src, CoorPoint tar){CoorPoint result = new CoorPoint(src);result.x -= tar.x;result.y -= tar.y;return result;}public static CoorPoint operator /(CoorPoint src, CoorPoint tar){CoorPoint result = new CoorPoint(src);result.x /= tar.x;result.y /= tar.y;return result;}public static CoorPoint operator *(CoorPoint src, CoorPoint tar){CoorPoint result = new CoorPoint(src);result.x *= tar.x;result.y *= tar.y;return result;}}class CoordinateSystemChg{/// <summary>/// 基坐标系:特征点(A')/// </summary>public CoorPoint baseCoor_basePoint { get; set; }/// <summary>/// 基坐标系:原点(O)/// </summary>public CoorPoint baseCoor_originPoint { get; set; }/// <summary>/// 现实坐标系:特征点(A)/// </summary>public CoorPoint realistic_basePoint { get; set; }/// <summary>/// 现实坐标系对应基坐标系拉伸后的点(A'')/// </summary>public CoorPoint realistic_basePointAfterZoom { get; set; }/// <summary>/// 现实坐标系:原点(O)/// </summary>public CoorPoint realistic_originPoint { get; set; }/// <summary>/// 现实坐标系对应基坐标系:原点(O')/// </summary>public CoorPoint realistic_originAsBaseCoorPoint { get; set; }   //定义原点时 已经统一缩放比例//第一步的结果//位移量:a(x轴),b(y轴)double a = 0;double b = 0;//坐标系倍数CoorPoint coorTimes;//坐标系夹角double offsetAngle;//第一步:得到坐标系之间的角度θ/// <summary>/// 计算出两坐标系的X,Y比例/// </summary>public void GetSale(){coorTimes = (realistic_basePoint - realistic_originPoint) / (baseCoor_basePoint - realistic_originAsBaseCoorPoint);if (coorTimes.x < 0)coorTimes.x = -coorTimes.x;if (coorTimes.y < 0)coorTimes.y = -coorTimes.y;}/// <summary>/// ①按比例缩放(实际坐标系的基点),使之与基坐标系统一/// </summary>public void DoZoom(){realistic_basePointAfterZoom = realistic_basePoint / coorTimes;}/// <summary>/// ②得到偏移角,入参实际坐标系原点坐标在基坐标系上的坐标/// </summary>public void GetOffsetAngle(){double[] x = new double[2];a = (realistic_originAsBaseCoorPoint.x - baseCoor_originPoint.x);b = (realistic_originAsBaseCoorPoint.y - baseCoor_originPoint.y);double[,] g = {{ realistic_basePointAfterZoom.x, realistic_basePointAfterZoom.y, (baseCoor_basePoint.x - a) },{ realistic_basePointAfterZoom.y, -realistic_basePointAfterZoom.x, (baseCoor_basePoint.y - b) }};GaussianElimination(g, x);// x[0]:θ角的余弦值;x[1]:θ角的正弦值offsetAngle = Math.Acos(x[0]);Console.WriteLine(x[0] + ":" + Math.Acos(x[0]));Console.WriteLine(x[1] + ":" + Math.Asin(x[1]));}//第二步:根据θ角求出在基坐标系中点的映射/// <summary>/// 将实际坐标系中的点转换到基坐标系中的点/// </summary>/// <param name="src"></param>/// <param name="rlt"></param>public void GetCoordinateBaseSystem(CoorPoint src, out CoorPoint rlt){double db1 = Math.Cos(offsetAngle);double db2 = Math.Sin(offsetAngle);rlt = new CoorPoint();rlt.x = ((src.x / coorTimes.x) * Math.Cos(offsetAngle) + (src.y / coorTimes.y) * Math.Sin(offsetAngle) + a);rlt.y = ((src.y / coorTimes.y) * Math.Cos(offsetAngle) - (src.x / coorTimes.x) * Math.Sin(offsetAngle) + b);}/// <summary>/// 将基坐标系中的点转换到实际坐标系中的点/// </summary>/// <param name="src"></param>/// <param name="rlt"></param>public void GetCoordinateRealisticSystem(CoorPoint src, out CoorPoint rlt){double[] x = new double[2];double[,] g = {{  Math.Cos(offsetAngle), Math.Sin(offsetAngle),(src.x - a)*coorTimes.x },{ -Math.Sin(offsetAngle), Math.Cos(offsetAngle),(src.y - b)*coorTimes.y }};GaussianElimination(g, x);rlt = new CoorPoint();rlt.x = x[0];rlt.y = x[1];}#region 数学方法//简单的高斯消元法;//输入要求解的扩展矩阵g[m,n];和存放结果的数组x[n];//返回值为计算结果数组x[n];public static double[] GaussianElimination(double[,] g, double[] x){int m = g.GetLength(0);//获得扩展矩阵的行(方程个数);int n = g.GetLength(1);//获得扩展矩阵的列(未知数个数+1);//========================================================//消元过程;for (int i = 1; i < m; i++){for (int j = i; j < m; j++){for (int k = n - 1; k > i - 2; k--){g[j, k] = g[j, k] - (g[j, i - 1] / g[i - 1, i - 1]) * (g[i - 1, k]);}}}//回代过程;//第一步:翻转;//换行;double tem;for (int i = 0; i < m / 2; i++)for (int j = 0; j < n; j++){tem = g[i, j];g[i, j] = g[m - i - 1, j];g[m - i - 1, j] = tem;}//倒序for (int i = 0; i < m; i++)for (int j = 0; j < n / 2; j++){tem = g[i, j];g[i, j] = g[i, n - 2 - j];g[i, n - 2 - j] = tem;}//第二步:消元;for (int i = 1; i < m; i++){for (int j = i; j < m; j++){for (int k = n - 1; k > i - 2; k--){g[j, k] = g[j, k] - (g[j, i - 1] / g[i - 1, i - 1]) * (g[i - 1, k]);}}}//第三步:翻回;//重新换行;for (int i = 0; i < m / 2; i++)for (int j = 0; j < n; j++){tem = g[i, j];g[i, j] = g[m - i - 1, j];g[m - i - 1, j] = tem;}//重新倒序;for (int i = 0; i < m; i++)for (int j = 0; j < n / 2; j++){tem = g[i, j];g[i, j] = g[i, n - 2 - j];g[i, n - 2 - j] = tem;}//取结果(这里是正序结果哦);for (int i = 0; i < m; i++)x[i] = g[i, n - 1] / g[i, i];return x;//返回计算结果;}#endregion}

不同平面直角坐标系之间的转换公式的推导及C#代码实现相关推荐

  1. 不同平面直角坐标系之间的坐标转换公式

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 1.单纯 ...

  2. 平面直角坐标系中的旋转公式_【数理之路】初中范围推导三角函数倍角正弦公式...

    更多精彩,请点击上方蓝字关注我们! 三角函数是基本初等函数之一,也是中学阶段很重要的一部分内容.初中阶段以直角三角形为基础,认识和了解锐角三角函数,而高中则是广义的三角函数,在平面直角坐标系中定义三角 ...

  3. 经纬度坐标映射到平面直角坐标系

    经纬度坐标映射到平面直角坐标系 一坐标系分类 1地心坐标系 2参心坐标系 3空间直角坐标系 4空间大地坐标系 5平面直角坐标系 二坐标系转换 三坐标系投影的实现source code 四坐标系投影的工 ...

  4. 中点坐标公式 矩形_2019南充第16题——平面直角坐标系、矩形、K字型相似、运动与最值...

    2019南充第16题--平面直角坐标系.矩形.K字型相似.运动与最值 2019广元第15题--抛物线.代数式的取值范围 2019广元第10题--正比例函数.直角三角形.面积.找规律 2019哈尔滨第2 ...

  5. 平面直角坐标系中的旋转公式_中考难点,旋转+动点的最值问题的构建

    数学的生命在于不断变换,凭借变换群充分发掘数学各部分的内在联系并获得应用实效.变换不但是解答难题的锐利武器,而且在现代数学理论中也发挥着巨大作用. 某些平面几何问题,由于图形中的几何性质比较隐晦,条件 ...

  6. 解析几何:第一章坐标系与坐标变换:平面直角坐标系、空间直角坐标系及其变换、极坐标系,圆柱面坐标系,球面坐标系

    §1 平面直角坐标系及其变换 1.直角坐标系(笛卡儿坐标系) 坐标系:O-XY 点M(x,y),x为横坐标,y为纵坐标. 在Ⅰ.Ⅱ.Ⅲ.Ⅳ四个象限中坐标x,y的符号为: 象限 Ⅰ Ⅱ Ⅲ Ⅳ x + ...

  7. 平面直角坐标系中的旋转公式_定比分点公式及定理

    摘要:在本文中,我们将探讨一下线段定比分点的性质. 我们来回顾一下定比分点的概念. 如上图所示,线段AB上有一点P分线段AB的比为 ,即 . 在平面直角坐标系中,已知A.B两点的坐标分为 , ,P点坐 ...

  8. 平面直角坐标系中的旋转公式_初中数学《平面直角坐标系》说课稿

    尊敬的各位考官大家好,我是今天的X号考生,今天我说课的题目是<平面直角坐标系>. 新课标指出:数学课程要面向全体学生,适应学生个性发展的需要,使得人人都能获得良好的数学教育,不同的人在数学 ...

  9. 高斯-克吕格尔平面直角坐标系详解

    高斯-克吕格尔平面直角坐标系 Gauss-Krüger plane rectangular coordinates system 根据高斯-克吕格尔投影所建立的平面坐标系,或简称高斯平面坐标系.它是大 ...

最新文章

  1. python 利用正则构建一个计算器
  2. json 反射java 实体_Java 将JSON反射到实体类
  3. 成功解决object at 0x000002463192BAC8
  4. 通过入侵JVM打印阵列
  5. andriod studio 运行 无结果_无负压静音供水设备下篇一
  6. android 行布局选择器,『自定义View实战』—— 银行种类选择器
  7. 实现阿里云容器镜像服务反向访问代理
  8. [转载] python 字符串包含某个字符_python字符串
  9. Java程序员必看的 14 本 Java 书籍!
  10. 中介效应分析及R实现
  11. Python中的切片(Slice)操作详解
  12. python小乌龟绘制迷宫_python小乌龟turtle数学作图
  13. C#异步执行方法的几种方式
  14. 第六章 更多监督训练
  15. 串扰(crosstalk)
  16. 【萧蕊冰】你知道ui设计属于什么行业吗?
  17. LinuxC TCP实现简易聊天室
  18. django 下mailgun的使用
  19. 跳槽加薪谋发展还是等公司配股?
  20. android穿山甲广告位id,Android自渲染Draw广告

热门文章

  1. FreeRTOS 任务管理之任务创建
  2. WebGL入门(四)-在JavaScript程序通过uniform变量向片元着色器传值
  3. 【无人驾驶一】【第一本无人驾驶技术书】最全的12篇无人驾驶技术系列文章
  4. 集合详解—Map集合
  5. 单声道”与“立体声”的区别
  6. TinyXML的TiXmlElement::GetText()返回NULL
  7. LC谐振电路应用太难了?其实这一步至关重要
  8. Arduino-光控灯的实现
  9. 米兔积木机器人与履带机甲零件差别_米兔积木机器人履带机甲版怎么样 米兔积木机器人孩子喜欢吗...
  10. linux添加人脸识别认证