基于STM32的虛線繪制函數改造

改造前:

uint16_t DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
//  GUI_DrawLine( x1,  y1,  x2,  y2);
//  return 1;int16_t   deltaX, deltaY;int16_t   error, stepErrorLT, stepErrorGE;int16_t   stepX, stepY;int16_t   steep;int16_t   temp;int16_t   style, type;if (x1 == x2){if (y1 > y2){temp = y1;y1 = y2;y2 = temp;}for (temp = y1; temp < y2 + 1; temp++){MoveToPixel(x1, temp);*pixel_P = 1;}return (1);}if (y1 == y2){if (x1 > x2){temp = x1;x1 = x2;x2 = temp;}MoveToPixel(x1, y1);for (temp = x1; temp < x2 + 1; temp++){*pixel_P = 1;pixel_P += 8;}return (1);}stepX = 0;deltaX = x2 - x1;if (deltaX < 0){deltaX = -deltaX;--stepX;}else{++stepX;}stepY = 0;deltaY = y2 - y1;if (deltaY < 0){deltaY = -deltaY;--stepY;}else{++stepY;}steep = 0;if (deltaX < deltaY){++steep;temp = deltaX;deltaX = deltaY;deltaY = temp;temp = x1;x1 = y1;y1 = temp;temp = stepX;stepX = stepY;stepY = temp;PutPixel(y1, x1);}else{PutPixel(x1, y1);}// If the current error greater or equal zerostepErrorGE = deltaX << 1;// If the current error less than zerostepErrorLT = deltaY << 1;// Error for the first pixelerror = stepErrorLT - deltaX;style = 0;type = 1;while (--deltaX >= 0){if (error >= 0){y1 += stepY;error -= stepErrorGE;}x1 += stepX;error += stepErrorLT;if ((++style) == 0){type ^= 1;style = 0;}if (type){if (steep){PutPixel(y1, x1);}else{PutPixel(x1, y1);}}}   // end of whilereturn (1);
}

改造后的虛線繪制函數:

uint16_t DrawDashedLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint8_t dashLen)
{int16_t deltaX, deltaY;int16_t error, stepErrorLT, stepErrorGE;int16_t stepX, stepY;int16_t steep;int16_t temp;uint16_t pixelCount = 0;  // 用于計算虛線間隔的計數器// 處理垂直線特殊情況if (x1 == x2) {if (y1 > y2) {temp = y1;y1 = y2;y2 = temp;}for (temp = y1; temp < y2 + 1; temp++) {if ((pixelCount / dashLen) % 2 == 0) {  // 畫線段PutPixel(x1, temp);}pixelCount++;}return 1;}// 處理水平線特殊情況if (y1 == y2) {if (x1 > x2) {temp = x1;x1 = x2;x2 = temp;}for (temp = x1; temp < x2 + 1; temp++) {if ((pixelCount / dashLen) % 2 == 0) {  // 畫線段PutPixel(temp, y1);}pixelCount++;}return 1;}// 通用斜線處理stepX = (x2 > x1) ? 1 : -1;deltaX = (x2 > x1) ? (x2 - x1) : (x1 - x2);stepY = (y2 > y1) ? 1 : -1;deltaY = (y2 > y1) ? (y2 - y1) : (y1 - y2);steep = (deltaY > deltaX);if (steep) {// 交換x和y的值temp = deltaX; deltaX = deltaY; deltaY = temp;temp = x1; x1 = y1; y1 = temp;temp = stepX; stepX = stepY; stepY = temp;}stepErrorGE = deltaX << 1;stepErrorLT = deltaY << 1;error = stepErrorLT - deltaX;while (deltaX-- >= 0) {if ((pixelCount / dashLen) % 2 == 0) {  // 畫線段if (steep) {PutPixel(y1, x1);} else {PutPixel(x1, y1);}}pixelCount++;if (error >= 0) {y1 += stepY;error -= stepErrorGE;}error += stepErrorLT;x1 += stepX;}return 1;
}

使用說明
參數說明:

x1, y1: 起點坐標

x2, y2: 終點坐標

dashLen: 虛線每段的長度(像素數)

調用示例:

// 繪制從(10,10)到(100,50)的虛線,每段長度5像素
DrawDashedLine(10, 10, 100, 50, 5);

優化版本(支持自定義樣式)

uint16_t DrawStyledLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t pattern)
{int16_t deltaX, deltaY;int16_t error, stepErrorLT, stepErrorGE;int16_t stepX, stepY;int16_t steep;int16_t temp;uint16_t pixelCount = 0;uint16_t mask = 0x8000;  // 16位樣式掩碼// ... (前面的特殊情況和初始化代碼與上面相同)while (deltaX-- >= 0) {if (pattern & mask) {  // 根據樣式掩碼決定是否繪制if (steep) {PutPixel(y1, x1);} else {PutPixel(x1, y1);}}// 更新樣式掩碼mask = (mask >> 1) | (mask << 15);pixelCount++;// ... (后面的誤差計算與上面相同)}return 1;
}

樣式示例:

// 點線:0xAAAA (1010101010101010)
DrawStyledLine(10, 10, 100, 50, 0xAAAA);// 點劃線:0xF8F8 (1111100011111000)
DrawStyledLine(10, 30, 100, 70, 0xF8F8);

這個改造后的函數保留了原Bresenham算法的效率,同時增加了虛線繪制功能,適用于嵌入式系統。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77678.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77678.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77678.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java高頻面試之并發編程-10

hello啊&#xff0c;各位觀眾姥爺們&#xff01;&#xff01;&#xff01;本baby今天來報道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面試官&#xff1a;ThreadLocalMap 怎么解決 Hash 沖突的&#xff1f; ThreadLocalMap 是 ThreadLocal 的核心實現&#xff0c;它采用 開放…

AI應用實戰:Excel表的操作工具

有個小需求是這樣的&#xff0c;需要在一份數據表里&#xff0c;將1000多個客戶的月報數據分別單獨截圖存檔&#xff0c;有客戶需要的時候就要發給客戶&#xff0c;截圖下來的也是以客戶為命名&#xff0c;這樣查找時也比較容易匹配上。 在沒有寫工具之前&#xff0c;以往財務…

使用 DoH 查詢域名 —— 以 core.tantanapp.com 為例的實戰分析

前言 在現代 iOS 應用中&#xff0c;為了確保 DNS 查詢的隱私和完整性&#xff0c;我們可以使用 DoH&#xff08;DNS over HTTPS&#xff09; 來查詢域名信息。 本文將以 https://cloudflare-dns.com/dns-query?namecore.tantanapp.com&typeA 為例&#xff0c;通過 Postm…

Python----卷積神經網絡(卷積為什么能識別圖像)

一、卷積的概念 卷積是一種數學運算&#xff0c;通常用于信號處理和圖像分析。在卷積神經網絡中&#xff0c;卷積操作用于提取輸入數據&#xff08;如圖像&#xff09;中的特征。通過將輸入數據與卷積核&#xff08;濾波器&#xff09;進行卷積運算&#xff0c;CNN能夠識別圖像…

linux FTP服務器搭建

FTP服務器搭建 系統環境&#xff1a;ubuntu 搭建方式&#xff1a;win系統下通過ssh連接ubuntu&#xff0c;搭建FTP服務 一、ssh連接 ssh -p 端口 用戶名IP ssh -p 22 ubuntu192.168.1.109 密碼&#xff1a;ubuntu123456 二、安裝配置FTP服務器 1、安裝 sudo apt install v…

語音合成之十韻律之美:TTS如何模擬語音的節奏和語調

韻律之美&#xff1a;TTS如何模擬語音的節奏和語調 1. 引言&#xff1a;韻律在語音合成中的重要性1.1 追求自然的TTS&#xff1a;超越可懂度1.2 定義韻律&#xff1a;語音的音樂1.3 韻律為何重要&#xff1a;傳遞意義、情感與自然度 2. TTS韻律建模的基礎技術2.1 利用文本&…

基于強化學習的用于非剛性圖像配準的引導式超聲采集|文獻速遞-深度學習醫療AI最新文獻

Title 題目 Guided ultrasound acquisition for nonrigid image registration usingreinforcement learning 基于強化學習的用于非剛性圖像配準的引導式超聲采集 01 文獻速遞介紹 超聲成像通常用于引導手術和其他醫療程序&#xff0c;在這些過程中&#xff0c;臨床醫生會持…

數據庫中DDL、DML、DCL的區別是什么?

數據庫中DDL、DML、DCL的區別是什么&#xff1f; 在數據庫的使用過程中&#xff0c;SQL&#xff08;結構化查詢語言&#xff09;常常被用來執行不同的操作&#xff0c;主要分為三類&#xff1a;DDL&#xff08;數據定義語言&#xff09;、DML&#xff08;數據操縱語言&#xf…

海量聊天消息處理:ShardingJDBC分庫分表、ClickHouse冷熱數據分離、ES復合查詢方案、Flink實時計算與SpringCloud集成

海量聊天消息處理&#xff1a;ShardingJDBC分庫分表、ClickHouse冷熱數據分離、ES復合查詢方案、Flink實時計算與SpringCloud集成 一、背景介紹 每天有2000萬條聊天消息&#xff0c;一年下來幾千萬億海量數據。為應對這種規模的數據存儲和處理需求&#xff0c;本文將從以下幾…

Vim 中替換字符或文本

在 Vim 中替換字符或文本可以使用 替換命令&#xff08;substitute&#xff09;&#xff0c;其基本語法為&#xff1a; :[range]s/old/new/[flags]1. 基本替換 命令說明:s/foo/bar/替換當前行的第一個 foo 為 bar:s/foo/bar/g替換當前行的 所有 foo 為 bar:%s/foo/bar/g替換 …

當傳統美術館遇上數字革命:觀眾體驗將迎來哪些顛覆性變革?

當數字科技與藝術創作深度交織&#xff0c;美術館與藝術機構正經歷前所未有的顛覆性浪潮。這是否宣告傳統展覽空間已正式跨入數字媒介主導的新紀元&#xff1f;投影映射與虛擬現實技術不斷突破物理限制&#xff0c;畫布與雕塑的邊界在光影與代碼中逐漸消融。這場革命不僅重構了…

內容/社區APP增長:用Deeplink讓用戶分享的內容“一鍵直達”

對于內容平臺和互動社區APP而言&#xff0c;優質內容的自發傳播是用戶增長和活躍度提升的核心驅動力之一。用戶發現一篇深度好文、一個精彩視頻或是一個引人入勝的討論帖&#xff0c;自然而然地想要分享給好友。然而&#xff0c;這個看似簡單的分享動作&#xff0c;卻往往在觸達…

Uniapp:vite.config.js全局配置

目錄 一、基本概述二、配置自動引入插件一、基本概述 vite.config.js 是一個可選的配置文件,如果項目的根目錄中存在這個文件,那么它會被自動加載,一般用于配置 vite 的編譯選項 二、配置自動引入插件 在項目命令行終端中執行如下代碼 npm install unplugin-auto-import…

JavaScript 與 Java 學習筆記

一、JavaScript 簡介 1. 定義 瀏覽器腳本語言&#xff1a;主要用于實現網頁交互功能&#xff08;鼠標點擊、鍵盤輸入響應等&#xff09; 服務器端擴展&#xff1a;通過 Node.js 運行時環境可進行后端開發 2. 核心特點 動態性&#xff1a;可實時修改 DOM 結構&#xff08;增…

Shell腳本-隨機數實戰案例

在Shell腳本編程中&#xff0c;生成隨機數是一項非常實用的技能。無論是用于模擬、測試、游戲開發還是安全相關的應用&#xff08;如生成密碼&#xff09;&#xff0c;能夠靈活地生成隨機數都是非常有用的。本文將通過幾個實際的應用案例來展示如何在Shell腳本中使用隨機數解決…

面試算法高頻08-動態規劃-03

練習題 題目描述 你是一個專業的小偷&#xff0c;計劃偷竊沿街的房屋。每間房內都藏有一定的現金&#xff0c;影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統&#xff0c;如果兩間相鄰的房屋在同一晚上被小偷闖入&#xff0c;系統會自動報警。 給定一個代表每…

基于 EFISH-SBC-RK3588 的無人機多光譜/紅外熱成像邊緣計算方案

一、硬件架構設計? ?核心算力平臺&#xff08;EFISH-SBC-RK3588&#xff09;? ?處理器性能?&#xff1a;搭載 8 核 ARM 架構&#xff08;4Cortex-A762.4GHz 4Cortex-A551.8GHz&#xff09;&#xff0c;集成 6 TOPS NPU 與 Mali-G610 GPU&#xff0c;支持多光譜圖像實時融…

Python小酷庫系列:pyNest,把FastAPI程序寫出Spring的味道

pyNest&#xff0c;把FastAPI程序寫出Spring的風格 快速入門1、安裝pyNest2、創建項目3、編寫app_module.py4、編寫app_service.py5、編寫app_controller.py6、編寫main.py7、啟動程序 核心概念1、Modules2、Controllers3、Providers4、ORM Provider NestJS是風靡于Node.js圈的…

HTML 詳解:從基礎結構到語義標簽

目錄 一、HTML 是什么&#xff1f;二、HTML 的基本結構? 簡要說明&#xff1a; 三、常見 HTML 標簽講解3.1 標題標簽 <h1> ~ <h6>3.2 段落和換行3.3 超鏈接3.4 圖像插入3.5 列表無序列表&#xff1a;有序列表&#xff1a; 3.6 表格結構 四、HTML 語義化標簽詳解五…

用Python做有趣的AI項目 6:AI音樂生成器(LSTM Melody Generator)

&#x1f3b5; 項目名稱&#xff1a;AI音樂生成器&#xff08;LSTM Melody Generator&#xff09; &#x1f9e0; 項目簡介 這個項目的目標是&#xff1a;用 AI 來自動生成簡單的旋律&#xff08;MIDI格式&#xff09;&#xff0c;類似于基礎的鋼琴曲、背景音樂片段。 我們使…