当前位置: 首页 > news >正文

lcd画圆

//******************************************************************
//函数名:  _draw_circle_8
//功能:    8对称性画圆算法(内部调用)
//输入参数:(xc,yc) :圆中心坐标
//             (x,y):光标相对于圆心的坐标
//             c:填充的颜色
//返回值:  无
//修改记录:无
//******************************************************************  
static void _draw_circle_8(int xc, int yc, int x, int y, u16 c)
{
    LCD_DrawPoint(xc + x, yc + y, c);
    LCD_DrawPoint(xc - x, yc + y, c);
    LCD_DrawPoint(xc + x, yc - y, c);
    LCD_DrawPoint(xc - x, yc - y, c);
    LCD_DrawPoint(xc + y, yc + x, c);
    LCD_DrawPoint(xc - y, yc + x, c);
    LCD_DrawPoint(xc + y, yc - x, c);
    LCD_DrawPoint(xc - y, yc - x, c);
}

//******************************************************************
//函数名:  gui_circle
//功能:    在指定位置画一个指定大小的圆(填充)
//输入参数:(xc,yc) :圆中心坐标
//             c:填充的颜色
//             r:圆半径
//             fill:填充判断标志,1-填充,0-不填充
//返回值:  无
//修改记录:无
//******************************************************************  
void LCD_DrawCircle(int xc, int yc,u16 c,int r, int fill)
{
    int x = 0, y = r, yi, d;
    d = 3 - 2 * r;
    if (fill) 
    {
        // 如果填充(画实心圆)
        while (x <= y) {
            for (yi = x; yi <= y; yi++)
                _draw_circle_8(xc, yc, x, yi, c);

            if (d < 0) {
                d = d + 4 * x + 6;
            } else {
                d = d + 4 * (x - y) + 10;
                y--;
            }
            x++;
        }
    }else 
    {
        // 如果不填充(画空心圆)
        while (x <= y) {
            _draw_circle_8(xc, yc, x, y, c);
            if (d < 0) {
                d = d + 4 * x + 6;
            } else {
                d = d + 4 * (x - y) + 10;
                y--;
            }
            x++;
        }
    }
}

void LCD_DrawCircleSlow(int xc, int yc,u16 color,int r, int fill)
{
    #if  0//0
//    int x = 0, y = r, yi, d;
//    d = 3 - 2 * r;    
//        while (x <= y) {
//            _draw_circle_8(xc, yc, x, y, color);
//            if (d < 0) {
//                d = d + 4 * x + 6;
//            } else {
//                d = d + 4 * (x - y) + 10;
//                y--;
//            }
//            x++;
//            delay_ms(50);
//        }
    
        int x=0,y=r;
            while (x <= y) {
                if(x*x+y*y<r*r)x++;//圆内
                else y--;//圆外
                LCD_DrawPoint(xc+x,yc+y,color);
                LCD_DrawPoint(xc-x,yc+y,color);
                LCD_DrawPoint(xc-y,yc+x,color);
                LCD_DrawPoint(xc-y,yc-x,color);
                LCD_DrawPoint(xc+y,yc+x,color);
                LCD_DrawPoint(xc+y,yc-x,color);
                LCD_DrawPoint(xc+x,yc-y,color);
                LCD_DrawPoint(xc-x,yc-y,color);
            delay_ms(50);
        }
#else
//    #define lcd_draw_point LCD_DrawPoint
//     uint16_t i,y;
//      if((xc < r) || (yc < r))            //保证能画出完整的圆
//           return;
//         
//      for(i = xc-r; i <= xc; i++){
//           y = sqrt(pow(r,2)-pow((xc-i),2)); //求出在垂直坐标上的偏移
//           //画左上半圆
//           lcd_draw_point(i,yc-y,color);
//           //画左下半圆
//           lcd_draw_point(i,yc+y,color);
//           //画右上半圆
//           lcd_draw_point(xc*2-i,yc-y,color);
//           //画右下半圆
//           lcd_draw_point(xc*2-i,yc+y,color);
//          
//          delay_ms(50);
//      }
    int systick =  get_tick(); 
        int x=0,y=0;
        for(int i=-90;i<270;i+=2)// for(float i=0;i<360;i+=2)//顺时针
//        for(int i=270;i>-90;i-=2)//逆时针
        {
            #define  PI   3.1415926
            x=(int)(r*cos(PI*i/180));//+0.5;//2pi~360
            y=(int)(r*sin(PI*i/180));//+0.5;
            LCD_DrawPoint(40+x, 40+y,color);//20ms
            //LCD_DrawCircle(xc+x, yc+y,color,3-2,1);//1~59ms;2~122ms
//            LCD_ShowString(0,120, int2str(x*1000 ,4) ,WHITE,BLACK,16,0);
//            delay_ms(10);
        }
#endif
         int take_time =  get_tick()-systick; 
        LCD_ShowString(0,120, int2str(take_time ,4) ,WHITE,BLACK,16,0);delay_ms(1000);//59//122Ms
}
typedef struct
{
  int16_t hCos;
  int16_t hSin;
} Trig_Components;uint16_t const SINE_tabel[180/2]={0,
572,1144,1715,2286,2856,3425,3993,4560,
5126,5690,6252,6813,7371,7927,8481,9032,
9580,10126,10668,11207,11743,12275,12803,13328,
13848,14365,14876,15384,15886,16384,16877,17364,
17847,18324,18795,19261,19720,20174,20622,21063,
21498,21926,22348,22763,23170,23571,23965,24351,
24730,25102,25466,25822,26170,26510,26842,27166,
27482,27789,28088,28378,28660,28932,29197,29452,
29698,29935,30163,30382,30592,30792,30983,31164,
31336,31499,31651,31795,31928,32052,32166,32270,
32365,32449,32524,32588,32643,32688,32723,32748,
32763,
//    32768,32763,32748,32723,32688,32643,32588,
//32524,32449,32365,32270,32166,32052,31928,31795,
//31651,31499,31336,31164,30983,30792,30592,30382,
//30163,29935,29698,29452,29197,28932,28660,28378,
//28088,27789,27482,27166,26842,26510,26170,25822,
//25466,25102,24730,24351,23965,23170,22763,22348,
//21926,21498,21063,20174,19720,19261,18795,18324,
//17847,17364,16384,15886,15384,14876,14365,13848 ,
//13328 ,12803 ,12275 ,11743 ,11207 ,10668 ,10126 ,9580 ,
//9032 ,8481 ,7927 ,7371 ,6813 ,6252 ,5690 ,5126 ,
//4560 ,3993 ,3425 ,2856 ,2286 ,1715 ,1144 ,572 ,0 ,
};
extern Trig_Components MCM_Trig_Functions( int16_t hAngle );
void LCD_DrawCircleTable(int xc, int yc,u16 color,int r, int fill)
{
    Trig_Components sincos;
    int x=0,y=0;
    int systick =  get_tick(); 
//    #define  PI   3.1415926
    #define PI   3.1415926535898
        for(int i=0;i<360;i+=1)//+1 6ms;+2 3ms;
//    for(int i=-90;i<270;i+=2)// //顺时针
//        for(int i=270;i>-90;i-=2)//逆时针
        {
            //sincos=MCM_Trig_Functions(PI*i/180);
            if(i<90)//
            {
                 x=r*SINE_tabel[(90-i)%90]/32768;//r*sincos.hCos;//(int)(r*cos(PI*i/180));//+0.5;//2pi~360
                 y=r*SINE_tabel[(i)%90]/32768;(int)(r*sin(PI*i/180));//+0.5;
            }
            else if(i<180)
            {
                x=r*( -SINE_tabel[(i-90)%90])/32768;//r*sincos.hCos;//(int)(r*cos(PI*i/180));//+0.5;//2pi~360
                y=r*SINE_tabel[(180-i)%90]/32768;(int)(r*sin(PI*i/180));//+0.5;
            }
            else if(i<270)
            {
                x=r*( -SINE_tabel[(270-i)%90])/32768;//r*sincos.hCos;//(int)(r*cos(PI*i/180));//+0.5;//2pi~360
                y=r*( -SINE_tabel[(i-180)%90])/32768;(int)(r*sin(PI*i/180));//+0.5;
            }
            else  
            {
                x=r*SINE_tabel[(i-270)%90]/32768;//r*sincos.hCos;//(int)(r*cos(PI*i/180));//+0.5;//2pi~360
                y=r*( -SINE_tabel[(360-i)%90])/32768;(int)(r*sin(PI*i/180));//+0.5;
            }
            //LCD_DrawPoint(40+x, 40+y,color);//6ms
            LCD_DrawCircle(xc+x, yc+y,color,3-2,1);//1~42ms;2~105ms
            //LCD_ShowString(0,120, int2str(x*1000 ,4) ,WHITE,BLACK,16,0);
            //delay_ms(10);
        }
        int take_time =  get_tick()-systick; 
        LCD_ShowString(0,120, int2str(take_time ,4) ,WHITE,BLACK,16,0);delay_ms(1000);//42//105MS
}

相关文章:

lcd画圆

//****************************************************************** //函数名&#xff1a; _draw_circle_8 //功能&#xff1a; 8对称性画圆算法(内部调用) //输入参数&#xff1a;(xc,yc) :圆中心坐标 // (x,y):光标相对于圆心的坐标 // c:填…...

React组件详解

React组件分为两大类 1.函数组件 2.类组件&#xff08;最常用&#xff09; 组件化 import ReactDom from "react-dom";// // 1.通过函数创建一个组件 // 2.函数名字必须大写开头 // 3.函数必须有返回值 function Func1() {return <h2>这是一个基础组件</h…...

C++面试:内存溢出、内存泄漏的原因与解决

目录 内存溢出&#xff08;Memory Overflow&#xff09; 内存溢出介绍 解决内存溢出问题的方法 内存泄漏&#xff08;Memory Leak&#xff09; 内存泄露基础 解决内存泄漏问题的方法 内存溢出&#xff08;Memory Overflow&#xff09; 内存溢出介绍 内存溢出是指程序在执…...

【Java程序员面试专栏 算法思维】二 高频面试算法题:二分查找

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊二分查找,包括基础二分,寻找目标值的左右边界,搜索旋转数组以及波峰,以及x的平方根问题,所以放到一篇Blog中集中练习 题目关键字解题思路时间空…...

kaldi 详细安装教程、PyTorch-Kaldi、TIMIT下载、Librispeech下载

kaldi 详细安装教程 本kaldi 安装教程 转载于该链接kaldi 详细安装教程 安装系统依赖&#xff08;如果经常使用linux 服务器&#xff0c;一般都会有&#xff09; apt-get updateapt-get install -y --no-install-recommends g make automake autoconf bzip2 unzip wget sox …...

EtherCAT 转 ModbusTCP 网关

功能概述 本产品是 EtherCAT 和 Modbus TCP 网关&#xff0c;使用数据映射方式工作。 本产品在 EtherCAT 侧作为 EtherCAT 从站&#xff0c;接 TwinCAT 、CodeSYS 、PLC 等&#xff1b;在 ModbusTCP 侧做为 ModbusTCP 主站&#xff08;Client&#xff09;或从站&#xff08;Se…...

iMazing2024Windows和Mac的iOS设备管理软件(可以替代iTunes进行数据备份和管理)

iMazing2024是一款兼容 Windows 和 Mac 的 iOS 设备管理软件&#xff0c;可以替代 iTunes 进行数据备份和管理。以下是一些 iMazing 的主要功能和优点&#xff1a; 数据备份和恢复&#xff1a;iMazing 提供了强大的数据备份和恢复功能&#xff0c;可以备份 iOS 设备上的各种数据…...

carpower

车载android 电源管理 车载音响电源管理器_definitely的技术博客_51CTO博客...

数据结构2月25日

第一道&#xff1a; 第二道&#xff1a; 1、插入到prev和next中间 1.new(struct list_head*)malloc(sizeof(struct list_head*)); if(newNULL) { printf("失败\n"); return; } new->nextprev->next; prev->nextnew; return; 2、删除prve和next…...

改进 RAG:自查询检索

原文地址&#xff1a;Improving RAG: Self Querying Retrieval 2024 年 2 月 11 日 让我们来解决构建 RAG 系统时的一个大问题。 我们不能依赖语义搜索来完成每个检索任务。只有当我们追求单词的含义和意图时&#xff0c;语义搜索才有意义。 But in case&#xff0c;我们正…...

【Git企业实战开发】Git常用开发流操作总结

【Git企业实战开发】Git常用开发流操作总结 大家好 我是寸铁&#x1f44a; 总结了一篇Git常用开发流操作总结的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 现在刚做项目的伙伴&#xff0c;可能你之前学过git&#xff0c;但是一实战发现不熟悉 没关系&#xff0c;看寸铁这篇…...

vue2+element医院安全(不良)事件报告管理系统源代码

目录 安全不良事件类型 源码技术栈 医院安全&#xff08;不良&#xff09;事件报告管理系统采用无责的、自愿的填报不良事件方式&#xff0c;有效地减轻医护人员的思想压力&#xff0c;实现以事件为主要对象&#xff0c;可以自动、及时、实际地反应医院的安全、不良、近失事件…...

leetcode初级算法(python)- 字符串

文章目录 1.反转字符串常规算法pythonic 算法2.整数反转数学法字符串法3.字符串中的第一个唯一字符pythonic算法哈希算法4.有效的字母异位词常规算法进阶算法5.最长公共前缀1.反转字符串 输入:[‘h’,‘e’,‘l’,‘l’,‘o’] 输出:[‘o’,‘l’,‘l’,‘e’,‘h’]...

Python 鼠标模拟

鼠标模拟即&#xff1a;通过python 进行模拟鼠标操作 引入类库 示例如下&#xff1a; import win32api import win32con import time 设置鼠标位置 设置鼠标位置为窗口中的回收站。 示例如下&#xff1a; # 设置鼠标的位置 win32api.SetCursorPos([30, 40]) 双击图标 设置…...

Linux进程 ----- 信号处理

前言 从信号产生到信号保存&#xff0c;中间经历了很多&#xff0c;当操作系统准备对信号进行处理时&#xff0c;还需要判断时机是否 “合适”&#xff0c;在绝大多数情况下&#xff0c;只有在 “合适” 的时机才能处理信号&#xff0c;即调用信号的执行动作。 一、信号的处理…...

【数位】【数论】【分类讨论】2999. 统计强大整数的数目

作者推荐 动态规划的时间复杂度优化 本文涉及知识点 数位 数论 LeetCode2999. 统计强大整数的数目 给你三个整数 start &#xff0c;finish 和 limit 。同时给你一个下标从 0 开始的字符串 s &#xff0c;表示一个 正 整数。 如果一个 正 整数 x 末尾部分是 s &#xff08…...

MongoDB聚合运算符:$atan2

$atan2用来计算反正切&#xff0c;返回指定表达式的反正切值&#xff0c;与$antan的区别主要是参数不同。 语法 { $atan2: [<expression1>, <expression1>] }<expression>为可被解析为数值的表达式$atan2返回弧度&#xff0c;使用$radiansToDegrees运算符可…...

敏捷开发最佳实践:价值维度实践案例之ABTest中台化

22年敏捷白皮书调研发现&#xff0c;仅有14%的企业部分实现价值管理闭环&#xff0c;8%的企业能够做到企业战略和业务目标与价值管理紧密结合。这一现象说明了大部分中国企业还不能在敏捷实践中实现需求价值的体系化及多维度价值度量&#xff0c;因此推广优秀的敏捷实践至关重要…...

爬虫基本库的使用(requests库的详细解析)

注&#xff1a;本文一共4万多字&#xff0c;希望读者能耐心读完&#xff01;&#xff01;&#xff01; 前面,我们了解了urllib库的基本用法&#xff08;爬虫基本库的使用(urllib库的详细解析)-CSDN博客&#xff09;。其中&#xff0c;确实又不方便的地方。例如处理网页验证…...

QT实现串口通信

一.Qt串口通信 Qt提供了两个关于串口通信的C类&#xff0c;分别是QSerialPort和QSerialPortInfo。 QSerialPort类提供了操作串口的各种接口。 QSerialPortInfo是一个辅助类&#xff0c;可以提供计算机中可用的串口的各种信息。 QSerialPortInfo Class用于提供外部串行端口的…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

WebRTC调研

WebRTC是什么&#xff0c;为什么&#xff0c;如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...