C# | GDI+图像测距辅助线的实现思路

C# | GDI+图像测距辅助线的实现思路

文章目录

    • C# | GDI+图像测距辅助线的实现思路
      • 一、辅助线需求概述
      • 二、坐标系与角度计算
        • 2.1 笛卡尔坐标系
        • 2.2 线长和角度计算方法
        • 2.3 文本角度矫正计算方法
        • 2.4 坐标变换实现步骤
      • 三、与if判断方式对比
      • 四、总结

一、辅助线需求概述

在图像测量工具中,动态辅助线的数值标签需要满足两个核心要求:其一,标签方向需与辅助线走向保持一致;其二,无论辅助线处于何种角度,文本必须保持正面朝上显示。
在这里插入图片描述

二、坐标系与角度计算

2.1 笛卡尔坐标系

在屏幕坐标系中,Y轴方向与数学坐标系相反(向下为正方向)。两点间连线形成的角度范围在-π到π之间,对应屏幕空间的360度方向。

2.2 线长和角度计算方法

计算两点之间的距离:

double length = Math.Sqrt(Math.Pow(endPoint.X - startPoint.X, 2) + Math.Pow(endPoint.Y - startPoint.Y, 2));

计算线的反正切值,Math.Atan2 返回的值在 (-π, π] 之间,用于表示线的方向:

double atan = Math.Atan2(endPoint.Y - startPoint.Y, endPoint.X - startPoint.X);
2.3 文本角度矫正计算方法

调整反正切值,以确保显示的长度文本始终保持向上的方向。如果反正切值的绝对值大于 π/2,说明线的倾斜方向可能导致文本倒着显示。
此时通过 -(Math.PI - atan) 来调整反正切值,使其对应的文本方向向上。

atan = Math.Abs(atan) > Math.PI / 2 ? -(Math.PI - atan) : atan;
2.4 坐标变换实现步骤
  1. 平移坐标系至线段中点
  2. 应用旋转变换
  3. 垂直偏移避免覆盖线段

关键代码段:

// 计算中点位置
PointF midPoint = new PointF((startPoint.X + endPoint.X) / 2, (startPoint.Y + endPoint.Y) / 2);// 调整原点至两点中心
g.TranslateTransform(midPoint.X, midPoint.Y);
g.RotateTransform((float)(atan * 180 / Math.PI));

三、与if判断方式对比

使用if连环判断不但啰嗦还存在除零风险。

if (deltaX >= 0 && deltaY >= 0) // 第一象限
{angle = Math.Atan(deltaY / deltaX);
}
else if (deltaX <= 0 && deltaY >= 0) // 第二象限
{angle = Math.PI - Math.Atan(deltaY / -deltaX);
}
// 三、四...

四、总结

通过坐标变换矩阵验证法可检测实现效果:

  1. 当辅助线处于水平方向(0度)时,旋转角度为0
  2. 当辅助线垂直向上(-90度)时,实际应用90度旋转
  3. 当辅助线倾斜135度时,自动校正为-45度显示

综上,在0-360度全范围内均能保持文本正向显示,感谢阅读。

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

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

相关文章

记录此刻:历时两月,初步实现基于FPGA的NVMe SSD固态硬盘存储控制器设计!

背景 为满足实验室横向项目需求&#xff0c;在2024年12月中下旬导师提出基于FPGA的NVMe SSD控制器研发项目。项目核心目标为&#xff1a;通过PCIe 3.0 x4接口实现单盘3000MB/s的持续读取速率。 实现过程 调研 花了半个月的时间查阅了一些使用FPGA实现NVME SSD控制器的论文、…

python编写liunx服务器登陆自动巡检脚本

前言&#xff1a; 用户需要一份用Python编写的Linux系统巡检脚本&#xff0c;检查内存、磁盘、CPU使用率&#xff0c;还有网络连通性。 首先&#xff0c;我得确定用户的使用场景。可能用户是系统管理员&#xff0c;需要定期监控服务器状态&#xff0c;确保系统正常运行。 或者…

【二分查找】P9698 [GDCPC2023] Path Planning|普及

本文涉及的基础知识点 本博文代码打包下载 C二分查找 [GDCPC2023] Path Planning 题面翻译 【题目描述】 有一个 n n n 行 m m m 列的网格。网格里的每个格子都写着一个整数&#xff0c;其中第 i i i 行第 j j j 列的格子里写着整数 a i , j a_{i, j} ai,j​。从 0…

springboot015基于SpringBoot的在线视频教育平台的设计与实现(源码+数据库+文档)

源码地址&#xff1a;基于SpringBoot的在线视频教育平台的设计与实现 文章目录 1.项目简介2.部分数据库结构与测试用例3.系统功能结构4.包含的文件列表&#xff08;含论文&#xff09;前端运行截图后端运行截图 1.项目简介 ​ 随着科学技术的飞速发展&#xff0c;各行各业都在…

《深度剖析:生成对抗网络中生成器与判别器的高效协作之道》

在人工智能的前沿领域&#xff0c;生成对抗网络&#xff08;GAN&#xff09;以其独特的对抗学习机制&#xff0c;为数据生成和处理带来了革命性的变革。生成器与判别器作为GAN的核心组件&#xff0c;它们之间的协作效率直接决定了GAN在图像生成、数据增强、风格迁移等众多应用中…

学习Flask:[特殊字符] Day 3:数据库集成

学习目标&#xff1a;使用SQLAlchemy操作数据库 from flask_sqlalchemy import SQLAlchemyapp.config[SQLALCHEMY_DATABASE_URI] sqlite:///site.db db SQLAlchemy(app)class User(db.Model):id db.Column(db.Integer, primary_keyTrue)username db.Column(db.String(20),…

可以免费无限次下载PPT的网站

前言 最近发现了一个超实用的网站&#xff0c;想分享给大家。 在学习和工作的过程中&#xff0c;想必做PPT是一件让大家都很头疼的一件事。 想下载一些PPT模板减少做PPT的工作量&#xff0c;但网上大多精美的PPT都是需要付费才能下载使用。 即使免费也有次数限制&#xff0…

什么是 Java 中的线程安全?

回答 Java 中的线程安全&#xff08;Thread Safety&#xff09;指的是在多线程环境下&#xff0c;当多个线程同时访问和操作共享资源&#xff08;如对象、变量、数据结构等&#xff09;时&#xff0c;能够保证程序的正确性&#xff0c;不会出现数据不一致、竞争条件&#xff0…

建筑三维设计软件如何实现弯道超车?

三个问题 建筑三维设计软件属于工业设计软件的一种&#xff0c;在这个领域一直是国外公司垄断。前些年&#xff0c;在房地产高歌猛进的时代&#xff0c;很多公司也尝试投入到建筑三维设计软件的研发。随着房地产市场行业的下行&#xff0c;建筑三维设计软件的发展也受到了影响…

Android OpenGLES2.0开发(十一):渲染YUV

人生如逆旅&#xff0c;我亦是行人 Android OpenGLES开发&#xff1a;EGL环境搭建Android OpenGLES2.0开发&#xff08;一&#xff09;&#xff1a;艰难的开始Android OpenGLES2.0开发&#xff08;二&#xff09;&#xff1a;环境搭建Android OpenGLES2.0开发&#xff08;三&am…

深入miniqmt:创建交易对象的完整指南

深入miniqmt&#xff1a;创建交易对象的完整指南 在量化交易领域&#xff0c;miniqmt作为一个强大的工具&#xff0c;为开发者提供了执行程序化交易的接口。在进行任何交易操作之前&#xff0c;首先需要创建一个交易对象。本文将详细介绍如何在miniqmt中创建并配置交易对象&am…

日语Learn、英语的再认识

背单词这件事感觉到了某个瓶颈了&#xff0c;没有什么新的区域可以发现&#xff0c;变成了一种类似纯粹的机械记忆&#xff0c;感觉英语的规范程度很低&#xff0c;很多词明明可以通过相近的形式变换&#xff0c;达到更好的学习效果&#xff0c;但却做的很麻烦&#xff0c;同一…

内存泄漏指什么?常见的内存泄漏有哪些?

内存泄漏是指程序在运行过程中&#xff0c;由于某些原因导致程序无法释放已经不再使用的内存&#xff0c;使得这部分内存持续被占用&#xff0c;最终可能导致系统可用内存逐渐减少&#xff0c;严重时会影响系统性能甚至导致程序崩溃。&#xff08;内存泄漏是指程序中已经分配的…

文心一言AI创意画

介绍 文心一言是百度推出的新一代知识增强大语言模型&#xff0c;属于文心大模型家族的新成员。‌它能够与人对话互动、回答问题、协助创作&#xff0c;高效便捷地帮助人们获取信息、知识和灵感。‌ 特点 文心一言基于数万亿数据和数千亿知识进行融合学习&#xff0c;采用预训…

洛谷 P8705:[蓝桥杯 2020 省 B1] 填空题之“试题 E :矩阵” ← 卡特兰数

【题目来源】 https://www.luogu.com.cn/problem/P8705 【题目描述】 把 1∼2020 放在 21010 的矩阵里。要求同一行中右边的比左边大&#xff0c;同一列中下边的比上边的大。一共有多少种方案? 答案很大&#xff0c;你只需要给出方案数除以 2020 的余数即可。 【答案提交】 …

我是如何从 0 到 1 找到 Web3 工作的?

作者&#xff1a;Lotus的人生实验 关于我花了一个月的时间&#xff0c;从 0 到 1 学习 Web3 相关的知识和编程知识。然后找到了一个 Web3 创业公司实习的远程工作。 &#x1f447;&#x1f447;&#x1f447; 我的背景: 计算机科班&#xff0c;学历还可以(大厂门槛水平) 毕业工…

量子网络:构建与应用前景的展望

大家好,我是Echo_Wish,今天我们来探讨一个极具前瞻性的领域——量子网络的构建与应用前景。随着量子计算的发展,量子网络作为量子信息科学的重要组成部分,正在引起越来越多的关注。本文将深入解析量子网络的构建原理,并展望其应用前景。 量子网络的基本概念 量子网络是指…

数据库二三事(8)

高级数据查询 top词语法格式&#xff1a;TOP n &#xff08;percent&#xff09;&#xff08;with ties&#xff09; 查询前n&#xff08;%&#xff09;行数据&#xff0c;&#xff08;包括最后一行取值并列&#xff09; 搭配 order by case&#xff1a; CASE &#xff08;…

linux中conda3安装

1、下载安装包 清华源-》https://mirrors.tuna.tsinghua.edu.cn/# 本文使用Anaconda3-2022.10&#xff0c;对应的下载路径-》https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2022.10-Linux-x86_64.sh 2、将下载到的sh脚本放在Linux中用sh脚本解析器执行 …

2025最新智能优化算法:人工旅鼠算法(Artificial Lemming Algorithm, ALA)求解23个经典函数测试集,MATLAB

一、人工旅鼠优化算法 人工旅鼠算法&#xff08;Artificial Lemming Algorithm, ALA&#xff09;是2025年提出的一种新型生物启发式优化算法&#xff0c;受旅鼠的四种典型行为启发&#xff1a;长距离迁徙、挖洞、觅食和躲避捕食者。该算法通过模拟这些行为来解决复杂的优化问题…