基于STM32的中點圓算法,畫空心圓的函數

中點圓算法(Midpoint Circle Algorithm)是一種高效繪制圓的算法,它利用圓的對稱性和整數運算來避免浮點計算,非常適合嵌入式系統使用。

空心圓繪制函數實現

/*** @brief  使用中點圓算法繪制空心圓* @param  x0: 圓心x坐標* @param  y0: 圓心y坐標* @param  r: 圓的半徑* @retval 無*/
void DrawCircle(int16_t x0, int16_t y0, int16_t r)
{int16_t x = r;int16_t y = 0;int16_t err = 0;while (x >= y){// 利用圓的八分對稱性,一次繪制8個點PutPixel(x0 + x, y0 + y);PutPixel(x0 + y, y0 + x);PutPixel(x0 - y, y0 + x);PutPixel(x0 - x, y0 + y);PutPixel(x0 - x, y0 - y);PutPixel(x0 - y, y0 - x);PutPixel(x0 + y, y0 - x);PutPixel(x0 + x, y0 - y);if (err <= 0){y += 1;err += 2*y + 1;}if (err > 0){x -= 1;err -= 2*x + 1;}}
}

算法說明
基本原理:

從圓的最右側點(r, 0)開始繪制

每次迭代決定下一個像素是在當前像素的右側還是右下側

利用圓的八分對稱性,一次計算并繪制8個對稱點

誤差項計算:

err表示中點與圓的實際位置的誤差

當err <= 0時,選擇右側像素

當err > 0時,選擇右下側像素

優化特點:

僅使用整數運算,無浮點計算

避免三角函數計算

每次迭代最多繪制8個像素點

使用示例

int main(void)
{LCD_Init();  // 初始化LCD// 設置繪制顏色為紅色SetColor(RED);// 在屏幕中心(160,120)繪制半徑為50的圓DrawCircle(160, 120, 50);while(1);
}
int main(void)
{LCD_Init();  // 初始化LCD// 設置繪制顏色為紅色SetColor(RED);// 在屏幕中心(160,120)繪制半徑為50的圓DrawCircle(160, 120, 50);while(1);
}

性能優化建議
如果LCD支持批量寫入,可以緩存8個點的坐標后一次性寫入

對于小半徑的圓,可以適當減少迭代次數

如果不需要完整圓,可以修改循環條件繪制圓弧

這個實現比基于三角函數的版本效率高得多,特別適合STM32等嵌入式平臺使用。

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

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

相關文章

Android Kotlin 項目完整集成 Bugly 異常監控指南

Android Kotlin 項目集成 Bugly 異常監控完整指南 一、Bugly 簡介 Bugly 是騰訊提供的專業移動應用異常監控平臺&#xff0c;支持&#xff1a; 崩潰報告&#xff08;Java/Native&#xff09;錯誤分析性能監控熱更新功能&#xff08;需額外配置&#xff09; 二、集成步驟 1…

【電腦維修】MERCURY水星無線網卡導致 Windows 網絡適配器無法連接的一種情況

故障現象 Powershell 無法啟動&#xff0c; Terminal 無法啟動&#xff0c; CMD 無法啟動。 操作1 重新拔插 MERCURY 無線USB網卡&#xff0c;上述各種終端恢復相應。 分析 應該是MERCURY驅動故障導致卡死 操作2 磁盤出現 MERCURY 盤。里面是一個 MERCURY.exe 驅動安裝程…

Docker 打上 Tag 和 Push 的意思

在 Docker 中&#xff0c;打 Tag&#xff08;Tagging&#xff09; 和 Push&#xff08;Pushing&#xff09; 是兩個關鍵操作&#xff0c;用于管理鏡像的版本并上傳到鏡像倉庫&#xff08;如 Docker Hub、阿里云 ACR、Harbor 等&#xff09;。 1. 打 Tag&#xff08;Tagging&…

簡化excel校驗提高開發效率

業務背景&#xff1a;上傳excel文件進行基礎數據校驗&#xff0c;然而東西太多寫著寫著就...自然成了測試的KPI了 解決思路&#xff1a;使用現有的注解處理&#xff0c;原理使用validate注解原理 直接上干貨&#xff0c;一行代碼搞定校驗&#xff1a; ValidateUtils.validat…

基于Koa實現的服務端渲染 ?

前段時間剛寫完畢業論文&#xff0c;現在一上來就是“基于”&#xff0c;哈哈。&#x1f92f; 這篇文章持續更新&#xff0c;涉及到的技術棧是Koa、Vue和Vite &#xff08;用React手搓服務端渲染好麻煩&#xff09;。但是現在能上生產的服務端渲染估計是Next&#xff08;配合Re…

Linux運維——Vim基礎

Vim基礎 一、移動光標1.1、基礎移動1.2、屏幕滾動 二、編輯操作2.1、插入模式2.2、刪除與修改2.3、復制粘貼 三、搜索與替換3.1、搜索3.2、替換 4、分屏與窗口管理4.1、分屏操作4.2、窗口調整 五、宏與批量操作六、效率技巧七、操作符7.1、內置操作符7.2、操作符 文本對象&…

git操作合集

更新文件 在 Git 中更新已經上傳到倉庫的文件 1、檢查當前狀態 首先&#xff0c;打開終端或命令行工具&#xff0c;進入你的 Git 倉庫目錄&#xff08;即包含 .git 文件夾的目錄&#xff09;。運行以下命令來查看當前倉庫的狀態&#xff1a; git status 此命令會顯示哪些文…

【筆記】深度學習模型訓練的 GPU 內存優化之旅⑤:內存分配篇

開設此專題&#xff0c;目的一是梳理文獻&#xff0c;目的二是分享知識。因為筆者讀研期間的研究方向是單卡上的顯存優化&#xff0c;所以最初思考的專題名稱是“顯存突圍&#xff1a;深度學習模型訓練的 GPU 內存優化之旅”&#xff0c;英文縮寫是 “MLSys_GPU_Memory_Opt”。…

SQL Server 存儲過程開發手冊

SQL Server 存儲過程開發手冊&#xff08;更新版&#xff09; 根據要求&#xff0c;重新整理并加入了事務控制、異常日志記錄和返回狀態碼的設計。以下是詳細說明&#xff1a; 1. 總則 1.1 目標 本手冊旨在為 SQL Server 存儲過程的編寫提供一套完整的規范&#xff0c;確保系…

深海科技服務博客簡介

人人可學&#xff0c;人人可用&#xff0c;IT與AI不是高不可攀&#xff01; 博客宗旨 深海科技服務博客致力于&#xff1a; 推廣IT與AI的實際應用&#xff0c;降低入門門檻&#xff0c;讓更多個人和中小企業能夠以最少投入、高效實現信息化、智能化。 分享開源免費軟件、簡單…

本地大模型編程實戰(29)查詢圖數據庫NEO4J(2)

上一篇文章 用大語言模型LLM查詢圖數據庫NEO4J(1) 介紹了使用GraphQACypherChain查詢NEO4J。用它實現簡單快捷&#xff0c;但是不容易定制&#xff0c;在生產環境中可能會面臨挑戰。 本文將基于langgraph 框架&#xff0c;用LLM(大語言模型)查詢圖數據庫NEO4J。它可以定義清晰復…

RPG_5.角色動畫

1.創建一個動畫實例 2.創建該實例的c子類 3.繼續創建該類的子類&#xff0c;但是作用是用來鏈接&#xff08;以后會詳細解釋&#xff09; 4.基于PlayerAnimInstance類創建一個子類 5.目前一共創建了四個c類&#xff0c; 最基的類 角色的類 玩家控制的角色的類 玩家控制的角…

Sigmoid函數導數推導詳解

Sigmoid函數導數推導詳解 在邏輯回歸中&#xff0c;Sigmoid函數的導數推導是一個關鍵步驟&#xff0c;它使得梯度下降算法能夠高效地計算。 1. Sigmoid函數定義 首先回顧Sigmoid函數的定義&#xff1a; g ( z ) 1 1 e ? z g(z) \frac{1}{1 e^{-z}} g(z)1e?z1? 2. 導…

MS31860T——8 通道串行接口低邊驅動器

MS31860T 是一款 8 通道低邊驅動器&#xff0c;包含 SPI 串口通信、 PWM斬波器配置、過流保護、短路保護、欠壓鎖定和過熱關斷功能&#xff0c; 芯片可以讀取每個通道的狀態。MS31860T 可以診斷開路的負載情況&#xff0c;并可以讀取故障信息。外部故障引腳指示芯片的故障狀態。…

騰訊 Kuikly 正式開源,了解一下這個基于 Kotlin 的全平臺框架

在 3月的時候通過 《騰訊 TDF 即將開源 Kuikly 跨端框架&#xff0c;Kotlin 支持全平臺》 我們大致知道了 Kuikly 的基本情況&#xff0c;Kuikly 是一個面向終端技術棧的跨端開發框架&#xff0c;完全基于kotlin語言開發&#xff0c;提供原生的性能和體驗。 按照官方的說法&…

AI驅動UI自動化測試框架調研

隨著應用復雜度增加&#xff0c;手動測試變得費時且易出錯&#xff0c;而自動化測試可提高效率和可靠性。如何借助大模型和一些自動化測試框架進行自動化測試&#xff0c;是一個研發團隊很重要的訴求。 目前主流的自動化測試框架很多&#xff0c;Midscene.js結合Playwright提供…

關系型數據庫設計指南

1. 前言 在自己獨立開發一個項目的過程中&#xff0c;我發現了一些以往寫小 Demo 從來沒有遇到過的問題。 最近在獨立制作一個全棧的通知管理平臺。一開始我沒有考慮太多&#xff0c;直接根據頭腦中零星的想法就開擼后端數據庫 model 和 API&#xff0c;用的是學了半成品的 M…

詳解TypeScript中的類型斷言及其繞過類型檢查機制

TypeScript中的類型斷言及其繞過類型檢查機制 一、類型斷言的本質與工作原理編譯時與運行時的區別TypeScript編譯器處理類型斷言的步驟 二、類型斷言的詳細語法與進階用法基礎語法對比鏈式斷言斷言修飾符1. 非空斷言操作符 (!)代碼分析1. getLength 函數分析用法說明&#xff1…

XLSX.utils.sheet_to_json設置了blankrows:true,但無法獲取到開頭的空白行

在用sheetJs的XLSX庫做導入&#xff0c;遇到一個bug。如果開頭行是空白行的話&#xff0c;調用sheet_to_json轉數組獲得的數據也是沒有包含空白行的。這樣會導致在設置對應的起始行時&#xff0c;解析數據不生效。 目前是直接跳過了開頭的兩行空白行 正確應該獲得一下數據 問…

PostgreSQL 數據庫下載和安裝

官網&#xff1a; PostgreSQL: Downloads 推薦下載網站&#xff1a;EDB downloads postgresql 我選了 postgresql-15.12-1-windows-x64.exe 鼠標雙擊&#xff0c;開始安裝&#xff1a; 安裝路徑&#xff1a; Installation Directory: D:\Program Files\PostgreSQL\15 Serv…