嵌入式开发中的机器人表情绘制
机器人的表情有两种,一种是贴图,一钟是调用图形API自绘。
贴图效果相对比较好,在存储空间大的情况下是可以采用的。
自绘比较麻烦,但在资源和空缺少的情况下,也是很有用的。而且自绘很容易通过调整参数加入随机效果,产生各种让人惊叹的作品。自绘特别适合一些平台配置低,api少的场合,比如有些平台只有点线等基本函数,画个圆或者正方形都需要自己使用手动实现。
在屏幕上绘图一般使用直角坐标或者极坐标,事实上往往取决于平台的处理器和硬件配置和需要的复杂度来取舍。这个十分简单,只用到高中解析几何的知识,
通过基本api画圆
//如果不画圆圈画圆面,把圆的方式if ((i-x)*(i-x)+(j -y)*(j-y)==r*r)改为<=,
//这种方式很容易理解,但效率低,循环次数和比较次数都很多
void drawCircle(int x, int y, int r) {display.clear();for (int i = x - r; i <= x + r; i++) {for (int j = y - r; j <= y + r; j++) {if ((i - x) * (i - x) + (j - y) * (j - y) <= r * r) {display.drawPixel(i, j, SSD1306_WHITE);}}}display.update();
}
//对比一下,这样就省了一层循环
void drawCircle2(int x, int y, int r) {display.clear();for (int i = x - r; i <= x + r; i++) {//for (int j = y - r; j <= y + r; j++) {// if ((i - x) * (i - x) + (j - y) * (j - y) == r * r) {// display.drawPixel(i, j, SSD1306_WHITE);// }//}int _x =i;int _y = sqrt(r*r - (_x-x)*(_x-x))+y;int __y = y - sqrt(r*r - (_x-x)*(_x-x));display.drawPixel(_x, _y, SSD1306_WHITE);display.drawPixel(_x, __y, SSD1306_WHITE);}display.update();
}
//极坐标,可以通过步数优化效率,也可以把所有的点存起来,这样浪费空间但节省一半计算
void drawCircle3(int x, int y, int r) {display.clear();for (int theta = 0; theta <= 360; theta += 2) {float rad = theta * 3.14159 / 180;int _x = x + r*cos(rad);int _y = y + r*sin(rad);float rad2 = (theta-2) * 3.14159 / 180;int _x1 = x + r*cos(rad2);int _y1 = y + r*sin(rad2);display.drawLine(_x1, _y1, _x, _y, SSD1306_WHITE);}display.update();
}
通过研究常见的圆方程和绘制方式,就可以举一翻三,利用抛物线,双曲线,心形,螺旋线,画出各种特殊的图形,还可以加上动画,比如笑脸,心形,眩晕等表情:
这是使用心形曲线

这是使用螺旋曲线

这是使用大圆小圆相交

相关文章:
嵌入式开发中的机器人表情绘制
机器人的表情有两种,一种是贴图,一钟是调用图形API自绘。 贴图效果相对比较好,在存储空间大的情况下是可以采用的。 自绘比较麻烦,但在资源和空缺少的情况下,也是很有用的。而且自绘很容易通过调整参数加入随机效果&…...
orm01
静态文件处理 静态文件:如:图片、音频、视频、css、js等静态文件的相关配置也在 项目名/项目名/settings.py 文件中进行配置 - 配置静态文件的访问路径STATIC_URL- 功能:通过哪个 url 地址找静态文件- 默认配置:STATIC_URL /sta…...
Maven 测试和单元测试介绍
一、测试介绍 二、单元测试 1)介绍 2)快速入门 添加依赖 <dependencies><!-- junit依赖 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.9…...
Postman接口测试03|执行接口测试、全局变量和环境变量、接口关联、动态参数、断言
目录 七、Postman 1、安装 2、postman的界面介绍 八、Postman执行接口测试 1、请求页签 3、响应页签 九、Postman的环境变量和全局变量 1、创建环境变量和全局变量可以解决的问题 2、postman中的操作-全局变量 1️⃣手动设置 2️⃣代码设置 3️⃣界面获取 4️⃣代…...
UE5 丧尸类杂兵的简单AI
A、思路 1、关卡初始化时,自动产生随机巡逻点,小兵到达后,去另一个随机巡逻点。 2、加入视力,发现主角后,不再巡逻,而开始追击主角并攻击。条件循环。 3、加入听力。主角的奔跑与射击会产生噪音…...
Linux字符设备驱动开发的三种方式(分析+对比+示例)
文章目录 一. 字符设备的驱动方法二. 三种方法的对比三. 开发环境四. 代码示例1. 传统设备驱动模型2. 总线设备驱动模型3. 设备树驱动模型 五. 相关链接 一. 字符设备的驱动方法 字符设备驱动 是指在I/O传输过程中以字节流进行读写操作的设备。典型的如LCD、蜂鸣器、SPI、触摸屏…...
C++设计模式之行为型模式概述,它们的目的与特点
行为型设计模式需要解决的问题 行为型设计模式主要关注对象之间的责任分配和交互。它们解决的问题包括: 对象之间的通信:如何让对象之间高效地通信,同时保持松耦合。算法的封装与复用:如何将算法或行为封装起来,使其…...
把Huggingface下载的arrow数据集转化为json格式
Arrow2json 使用默认的Huggingface路径 以allenai/tulu-3-sft-mixture数据集为例。 使用load_dataset即可: from datasets import load_dataset# 加载数据集 dataset load_dataset("allenai/tulu-3-sft-mixture")# 指定保存路径 output_dir "~/…...
复习打卡大数据篇——Hadoop YARN
目录 1.什么是yarn 2.yarn的三大角色 3.任务(MR)提交到YARN运行流程 4. 调度器Scheduler 5.YARN HA 高可用 1.什么是yarn YARN(Yet Another Resource Negotiator)是一个资源管…...
fpga系列 HDL:ModelSim显示模拟波形以及十进制格式数值
FPGA中使用数字滤波器时,可通过观察模拟波形更好地查看滤波效果。可以通过ModelSim中的波形格式设置来实现更直观的波形显示。 右键波形->Format-> Analog 效果 不同的数值格式显示:右键波形->Radix-> Decimal 效果 示例代码 ver…...
Linux 基本指令
目录 1.常见指令 1.1 ls指令 1.2 pwd指令 1.3 cd指令 1.4 touch指令 1.5 mkdir指令 1.6 rm和rmdir指令 1.7 man指令 1.8 cp指令 1.9 mv指令 编辑 1.10 cat指令 1.11 more指令 1.12 less指令 1.13 head指令 1.14.tail指令 1.15 时间相关的指令 1.16 cal…...
GO语言基础面试题
一、字符串和整型怎么相互转换 1、使用 strconv 包中的函数 FormatInt 、ParseInt 等进行转换 2、转换10进制的整形时,可以使用 strconv.Atoi、strconv.Itoa: Atoi是ParseInt(s, 10, 0) 的简写 Itoa是FormatInt(i, 10) 的简写 3、整形转为字符型时&#…...
要查询 `user` 表中 `we_chat_subscribe` 和 `we_chat_union_id` 列不为空的用户数量
文章目录 1、we_chat_subscribe2、we_chat_union_id 1、we_chat_subscribe 要查询 user 表中 we_chat_subscribe 列不为空的用户数量,你可以使用以下 SQL 查询语句: SELECT COUNT(*) FROM user WHERE we_chat_subscribe IS NOT NULL;解释: …...
小程序基础 —— 10 如何调试小程序代码
如何调试小程序代码 在进行项目开发的时候,不可避免需要进行调试,那么如何调试小程序呢? 打开微信开发者工具后,有一个模拟器,通过模拟器能够实时预览自己写的页面,如下: 在上部工具栏中有一个…...
Vue项目如何设置多个静态文件;如何自定义静态文件目录
Vite实现方案 安装插件 npm i vite-plugin-static-copy在vite.config.ts引入 import { viteStaticCopy } from vite-plugin-static-copy配置 plugins: [viteStaticCopy({targets: [{src: "要设置的静态文件目录的相对路径 相对于vite.config.ts的", dest: ./, // …...
CentOS Stream 9 安装 JDK
安装前检查 java --version注:此时说明已安装过JDK,否则为未安装。如若已安装过JDK可以跳过安装步骤直接使用,或者先卸载已安装的JDK版本重新安装。 安装JDK 官网下载地址:https://www.oracle.com/java/technologies/downloads…...
前端(htmlcss)
前端页面 Web页面 PC端程序页面 移动端APP页面 ... HTML页面 HTML超文本标记页面 超文本:文本,声音,图片,视频,表格,链接 标记:由许多标签组成 HTML页面运行到浏览器上面 vscode便捷插件使用 vs…...
py打包工具
pyinstaller 安装 大佬文档参考 pip install pyinstallerpyinstaller 参数 -i 给应用程序添加图标 -F 只生成一个exe格式的文件 -D 创建一个目录,包含exe文件,但会依赖很多文件(默认选项) -c 有黑窗口 -w 去掉黑窗口pyinstalle…...
华为OD E卷(100分)39-最长子字符串的长度(二)
前言 工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力…...
Selenium+Java(21):Jenkins发送邮件报错Not sent to the following valid addresses解决方案
问题现象 小月妹妹近期在做RobotFrameWork自动化测试,并且使用Jenkins发送测试邮件的时候,发现报错Not sent to the following valid addresses,明明各个配置项看起来都没有问题,但是一到邮件发送环节,就是发送不出去,而且还不提示太多有用的信息,急的妹妹脸都红了,于…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
