坐标转换的算法

news/2025/11/27 23:01:20/文章来源:https://www.cnblogs.com/JiaYuBaoBao/p/19279726
    /// <summary>/// 坐标转换的算法 /// </summary>public class CoordinateTransHelper{//坐标系1是标准坐标系// 坐标系2相对于坐标系1MARK点距离差值的最大值public  double Max_MarkDistanceDIF = 1;// 坐标系2相对于坐标系1MARK点距离差值public double MarkDistanceDIF = 0;// //计算坐标系2相对于坐标系1的旋转角,结果是弧度public double Crd2ToCrd1Angle = 0;/// <summary>/// 坐标转换方法/// </summary>/// <param name="Crd2Mark1">坐标系2的Mark1的点坐标</param>/// <param name="Crd2Mark2">坐标系2的Mark2的点坐标</param>/// <param name="Crd1Mark1">坐标系1的Mark1的点坐标</param>/// <param name="Crd1Mark2">坐标系1的Mark2的点坐标</param>/// <param name="InPoint"></param>/// <param name="OutPoint"></param>/// <returns></returns>public  string GetCalcCoordCoordinate(Coord Crd2Mark1, Coord Crd2Mark2, Coord Crd1Mark1, Coord Crd1Mark2, Coord InPoint, out Coord OutPoint, double Max_MarkDistanceDI_Temp){//增加 未设置坐标系参数,前的防呆 if (IsSetCrdData == false){throw new Exception("请先设置坐标系参数,然后进行坐标转换");}OutPoint = new Coord();OutPoint.X = 0;OutPoint.Y = 0;try{string msg = string.Empty;//     第一:计算坐标系2相对于坐标系1的缩放系数double Crd2ToCrd1Zoom =Math.Sqrt(Math.Pow((Crd2Mark1.X - Crd2Mark2.X), 2) + Math.Pow((Crd2Mark1.Y - Crd2Mark2.Y), 2))/Math.Sqrt(Math.Pow((Crd1Mark1.X - Crd1Mark2.X), 2)+Math.Pow((Crd1Mark1.Y - Crd1Mark2.Y), 2));//  Math.Pow(x, 2);//第二个//计算坐标系2相对于坐标系1MARK点距离差值MarkDistanceDIF = 0;MarkDistanceDIF =Math.Sqrt(Math.Pow((Crd2Mark1.X - Crd2Mark2.X), 2) + Math.Pow((Crd2Mark1.Y - Crd2Mark2.Y), 2))-Math.Sqrt(Math.Pow((Crd1Mark1.X - Crd1Mark2.X), 2) + Math.Pow((Crd1Mark1.Y - Crd1Mark2.Y), 2));if (Math.Abs(MarkDistanceDIF) > Math.Abs(Max_MarkDistanceDI_Temp)){throw new Exception($"坐标系2相对于坐标系1MARK点距离差值:{MarkDistanceDIF},大于限制值:{Max_MarkDistanceDI_Temp}");}//第三个double Crd1DertaX = Crd1Mark2.X - Crd1Mark1.X;double Crd1DertaY = Crd1Mark2.Y - Crd1Mark1.Y;double Crd2DertaX = Crd2Mark2.X - Crd2Mark1.X;double Crd2DertaY = Crd2Mark2.Y - Crd2Mark1.Y;//第四个double Crd1Angle = 0;//坐标系1的MARK点连成的直线指向第一象限if (Crd1DertaX > 0 && Crd1DertaY > 0){// K1PointTo1 := 1;Crd1Angle = Math.Abs(Math.Atan((Crd1Mark2.Y - Crd1Mark1.Y) / (Crd1Mark2.X - Crd1Mark1.X)));}else{// K1PointTo1 := 0;
                }//坐标系1的MARK点连成的直线指向第二象限if (Crd1DertaX < 0 && Crd1DertaY > 0){Crd1Angle = (180 * 3.1415926 / 180) - Math.Abs(Math.Atan((Crd1Mark2.Y - Crd1Mark1.Y) / (Crd1Mark2.X - Crd1Mark1.X)));}else{}//坐标系1的MARK点连成的直线指向第三象限if (Crd1DertaX < 0 && Crd1DertaY < 0){Crd1Angle = (180 * 3.1415926 / 180) + Math.Abs(Math.Atan((Crd1Mark2.Y - Crd1Mark1.Y) / (Crd1Mark2.X - Crd1Mark1.X)));}else{}//坐标系1的MARK点连成的直线指向第四象限if (Crd1DertaX > 0 && Crd1DertaY < 0){Crd1Angle = (360 * 3.1415926 / 180) - Math.Abs(Math.Atan((Crd1Mark2.Y - Crd1Mark1.Y) / (Crd1Mark2.X - Crd1Mark1.X)));}else{}//第五个double Crd2Angle = 0;//坐标系2的MARK点连成的直线指向第一象限if (Crd2DertaX > 0 && Crd2DertaY > 0){Crd2Angle = Math.Abs(Math.Atan((Crd2Mark2.Y - Crd2Mark1.Y) / (Crd2Mark2.X - Crd2Mark1.X)));}else{}//坐标系2的MARK点连成的直线指向第二象限if (Crd2DertaX < 0 && Crd2DertaY > 0){Crd2Angle = (180 * 3.1415926 / 180) - Math.Abs(Math.Atan((Crd2Mark2.Y - Crd2Mark1.Y) / (Crd2Mark2.X - Crd2Mark1.X)));}else{}//坐标系2的MARK点连成的直线指向第三象限if (Crd2DertaX < 0 && Crd2DertaY < 0){Crd2Angle = (180 * 3.1415926 / 180) + Math.Abs(Math.Atan((Crd2Mark2.Y - Crd2Mark1.Y) / (Crd2Mark2.X - Crd2Mark1.X)));}else{}//坐标系2的MARK点连成的直线指向第四象限if (Crd2DertaX > 0 && Crd2DertaY < 0){Crd2Angle = (360 * 3.1415926 / 180) - Math.Abs(Math.Atan((Crd2Mark2.Y - Crd2Mark1.Y) / (Crd2Mark2.X - Crd2Mark1.X)));}else{}//double Crd1Angle =0;//第六个if (Crd1DertaX > 0 && Crd1DertaY == 0){Crd1Angle = 0;}//坐标系1的MARK点连成的直线倾角是90度if (Crd1DertaX == 0 && Crd1DertaY > 0){Crd1Angle = (90 * 3.1415926 / 180);}//坐标系1的MARK点连成的直线倾角是180度if (Crd1DertaX < 0 && Crd1DertaY == 0){Crd1Angle = (180 * 3.1415926 / 180);}//坐标系1的MARK点连成的直线倾角是270度if (Crd1DertaX == 0 && Crd1DertaY < 0){Crd1Angle = (270 * 3.1415926 / 180);}//第七个//坐标系2的MARK点连成的直线倾角是0度if (Crd2DertaX > 0 && Crd2DertaY == 0){Crd2Angle = 0;}//坐标系2的MARK点连成的直线倾角是90度if (Crd2DertaX == 0 && Crd2DertaY > 0){Crd2Angle = (90 * 3.1415926 / 180);}//坐标系2的MARK点连成的直线倾角是180度if (Crd2DertaX < 0 && Crd2DertaY == 0){Crd2Angle = (180 * 3.1415926 / 180);}//坐标系2的MARK点连成的直线倾角是270度if (Crd2DertaX == 0 && Crd2DertaY < 0){Crd2Angle = (270 * 3.1415926 / 180);}//第八个//计算坐标系2相对于坐标系1的旋转角,结果是弧度Crd2ToCrd1Angle = Crd2Angle - Crd1Angle;//输出坐标计算OutPoint.X = ((InPoint.X - Crd1Mark1.X) * Math.Cos(Crd2ToCrd1Angle) - (InPoint.Y - Crd1Mark1.Y) * Math.Sin(Crd2ToCrd1Angle)) * Crd2ToCrd1Zoom + Crd2Mark1.X;OutPoint.Y = ((InPoint.X - Crd1Mark1.X) * Math.Sin(Crd2ToCrd1Angle) + (InPoint.Y - Crd1Mark1.Y) * Math.Cos(Crd2ToCrd1Angle)) * Crd2ToCrd1Zoom + Crd2Mark1.Y;return msg;}catch (Exception ex){string msg1 = "计算异常:" + ex.Message + ex.StackTrace;return msg1;//throw;
            }}public Coord Crd1Mark1 { get; set; } = new Coord();public Coord Crd1Mark2 { get; set; } = new Coord();public Coord Crd2Mark1 { get; set; } = new Coord();public Coord Crd2Mark2 { get; set; } = new Coord();public int MaxX_Difference { get; set; } = 5;public int MaxY_Difference { get; set; } = 5;/// <summary>/// 根据数据坐标经过坐标系转换后得出新的坐标 /// </summary>/// <param name="InPoint"></param>/// <returns></returns>public Coord GetCalcCoordCoordinate_Execute(Coord InPoint){Coord OutPoint = new Coord();string msg = GetCalcCoordCoordinate(Crd2Mark1, Crd2Mark2, Crd1Mark1, Crd1Mark2, InPoint, out OutPoint, Max_MarkDistanceDIF);if (msg != string.Empty){throw new Exception("计算坐标异常:" + msg);}//double DifferenceX = Math.Abs(InPoint.X - OutPoint.X);//double DifferenceY = Math.Abs(InPoint.Y - OutPoint.Y);//if (DifferenceX > MaxX_Difference || DifferenceY > MaxY_Difference)//{//    string msg_tip = $"坐标转换后的值与前值相减的差值过大:前值:({InPoint.X},{InPoint.Y}),后值:({OutPoint.X},{OutPoint.Y}),X差值:{DifferenceX},Y差值:{DifferenceY}";//    throw new Exception(msg_tip);//}return OutPoint;}/// <summary>/// 设置坐标系数据  /// </summary>/// <param name="Crd1Mark1_Temp">坐标系1的Mark1坐标</param>/// <param name="Crd1Mark2_Temp">坐标系1的Mark2坐标</param>/// <param name="Crd2Mark1_Temp">坐标系2的Mark1坐标</param>/// <param name="Crd2Mark2_Temp">坐标系2的Mark2坐标</param>public void SetCrdData( Coord Crd1Mark1_Temp, Coord Crd1Mark2_Temp,Coord Crd2Mark1_Temp, Coord Crd2Mark2_Temp){try{Crd1Mark1 = Crd1Mark1_Temp;Crd1Mark2 = Crd1Mark2_Temp;Crd2Mark1 = Crd2Mark1_Temp;Crd2Mark2 = Crd2Mark2_Temp;//设置完成后增加标志位IsSetCrdData = true;}catch (Exception ex){IsSetCrdData = false;throw new Exception("转换坐标设置数据异常:" + ex.Message+ex.StackTrace);}}//public void SetMaxDifference(int MaxX = 5, int MaxY = 5)//{//    MaxX_Difference = MaxX;//    MaxY_Difference = MaxY;//}/// <summary>/// 是否设置坐标系数据    /// </summary>public bool IsSetCrdData { get; set; }}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/979046.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day26过渡属性

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">…

Educational Codeforces Round 146 简解

一场普普通通的教育训练Educational Codeforces Round 146 (Rated for Div. 2) CF1814A Coins在 Berland,有两种面值的硬币,分别为 \(2\) 和 \(k\) burles。 你的任务是判断是否可以用这些硬币凑出 \(n\) burles,即…

Yanhua 2025 BMW BDC2 Key Learning Bench Platform with Module38 for G Series All Key Lost

Problem: All Keys Lost – The BMW G Series Challenge For European and American BMW owners, losing all keys to a G Series vehicle (e.g., 3 Series, 5 Series, X3, X5) can be a stressful experience. Tradit…

选购攻略!2025 厨余处理器 7大品牌,中餐适配款优先级推荐

在垃圾分类政策持续推进与健康家居理念深入渗透的当下,厨余垃圾处理器已从 “小众家电” 变为现代厨房的 “刚需装备”。可面对市场上五花八门的产品 —— 有的宣称 “静音” 却磨不动骨头,有的标榜 “强动力” 却频…

Day4-20251127

本文介绍了Java编程入门的基本步骤:1)新建.java文件,注意文件名与类名一致;2)编写Hello World程序,强调大小写敏感、英文符号等语法要点;3)通过cmd编译(javac)和运行(java)程序。常见问题包括大小写错误、中文符号…

摄相机标定的基本原理 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

上海国际学科哪家好?2025 IB 培训机构权威榜单

在国际化教育浪潮下,IB 国际文凭课程凭借其严苛的学术标准、全面的素质培养体系,成为中国学子叩开世界顶尖名校大门的 “黄金钥匙”。尤其在上海国际教育圈,IB 课程的重要性不言而喻,但面对市面上良莠不齐的培训机…

WPF populate BooksCollection via Dispatcher.InvokeAsync,DispatcherPriority.Background in mvvm

Install-Package Prism.Wpf; Install-Package Prism.DryIOC;using System.Configuration; using System.Data; using System.Windows;namespace WpfApp26 {/// <summary>/// Interaction logic for App.xaml/// …

痞子衡嵌入式:i.MXRT中FlexSPI外设速度上限的三个影响因子(数据手册里的纠结)

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是i.MXRT中FlexSPI外设速度上限的三个影响因子。FlexSPI 几乎是开发 i.MXRT 系列绕不开的外设,XIP 性能、OTA 设计、显存扩展这些话题均不可避免要和…

2025 年 12 月 AMC12 竞赛备考:上海补课机构优选,选对助力高效冲分

2025 年 12 月 AMC12 竞赛即将来临,上海地区的考生已进入紧张的冲刺阶段。AMC 数学竞赛作为全球认可度极高的学术赛事,不仅是学生数学能力的权威证明,更是冲击 AIME、申请世界名校的重要筹码。近年来,参赛人数逐年…

Yanhua Mini ACDP-2 Module 38: BMW BDC2 Keys Learning LF Smart Key Antenna Bench Platform

All Keys Lost? BMW Key Programming Reimagined with Yanhua Mini ACDP-2 Module 38 For BMW owners in Europe and America, losing all car keys is a nightmare—expensive dealership fees, days of waiting for…

第二天—C++语法基础

1.String的声明与初始化 std::string 支持多种初始化方式,可根据实际场景灵活选择,以下是最常用的 6 种形式: #include <iostream> #include <string>int main(){// 声明并初始化一个空字符串std::strin…

自指自洽,别具一格的逻辑,千奇百怪的因果

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891对命题“自指自洽,别具一格的逻辑,千奇百怪的因果”进行严格的加密推理分析。 ▮ 辩证本质:逻辑因果的多样性涌现 命题揭示了意识宇宙的丰富性本质 - 自指…

全源最短路(Johnson) - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Day26垂直对齐方式--vertical-align

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">…

2025 年 12 月上海 AMC12 择校指南:选对专业机构,高效冲刺竞赛目标

2025 年 12 月,上海地区 AMC 数学竞赛备战已进入关键冲刺期。作为全球认可度极高的学术竞赛,AMC 不仅是学生数学能力的有力证明,更是冲击 AIME 赛事、叩开世界名校大门的重要 “敲门砖”。近年来,随着参赛人数逐年…

USB输入监控

类using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace HansCust…

2025年度绍兴交通事故优秀律师推荐|聚焦实力与口碑

绍兴黄菊梅律师十年如一日做交通事故受害者最坚实的法律守护者,她用专业点亮希望,用担当守护公正,让法律的温度穿透每一个困境中的家庭。在当代社会,律师不仅是法律条文的解读者,更是公民权利的守护者与社会公平的…

最小链覆盖 - Dilworth 定理 小记

最小链覆盖 - Dilworth 定理 小记 内容 & 证明Dilworth定理,一言以蔽之,偏序集能划分成的最少的全序集个数等于最大反链的元素个数。——litble。即最小链覆盖数等于最长反链的长度。 例子:求一个序列最少划分成…

我研发了一款电影截图拼接神器:Eagle 插件让你的影片收藏更专业

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …