当前位置: 首页 > 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用于提供外部串行端口的…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

实战设计模式之模板方法模式

概述 模板方法模式定义了一个操作中的算法骨架&#xff0c;并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下&#xff0c;重新定义算法中的某些步骤。简单来说&#xff0c;就是在一个方法中定义了要执行的步骤顺序或算法框架&#xff0c;但允许子类…...

【多线程初阶】单例模式 指令重排序问题

文章目录 1.单例模式1)饿汉模式2)懒汉模式①.单线程版本②.多线程版本 2.分析单例模式里的线程安全问题1)饿汉模式2)懒汉模式懒汉模式是如何出现线程安全问题的 3.解决问题进一步优化加锁导致的执行效率优化预防内存可见性问题 4.解决指令重排序问题 1.单例模式 单例模式确保某…...

Axure Rp 11 安装、汉化、授权

Axure Rp 11 安装、汉化、授权 1、前言2、汉化2.1、汉化文件下载2.2、windows汉化流程2.3、 macOs汉化流程 3、授权 1、前言 Axure Rp 11官方下载链接&#xff1a;https://www.axure.com/downloadthanks 2、汉化 2.1、汉化文件下载 链接: https://pan.baidu.com/s/18Clf…...