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.pswp.cn/news/896366.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896366.shtml
英文地址,請注明出處:http://en.pswp.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;長距離遷徙、挖洞、覓食和躲避捕食者。該算法通過模擬這些行為來解決復雜的優化問題…