基于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.mzph.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;类似于基础的钢琴曲、背景音乐片段。 我们使…