STM32 ILI9341驱动TFTLCD(七)LCD画实心三角形、矩形、圆形

上次测试画直线函数时,已经通过三条直线画出了一个空心三角形,今天来画一下实心的,分别画下实心三角形、实心矩形、实心圆。
1、实心三角形
实心三角形,可以先画任意两条边,然后以这两条边的交点为顶点,向第三条直线的点画直线。在画第三条直线时,思想和画直线是一样的,只是在画好点之后,多加了顶点向刚画好的点画直线这一步。到第三条直线画完时,实心三角形也就画好了。
画实心三角形函数
void lcd_drawsolidtriangle(u16 x0,u16 y0,u16 x1,u16 y1,u16 x2,u16 y2,u16 color){ u16 xm = 0,ym = 0; u16 step = 0; lcd_drawline(x0,y0,x1,y1,color);//画第一条直线 lcd_drawline(x0,y0,x2,y2,color);//画第二条直线 if(x2=y1) //斜率为正 { step = (y2-y1)+(x2-x1);//需要移动的步数 while(step--) { if((y2-ym)*(x2-x1) >(y2-y1)*(x2-xm))//判断斜率 ym++; else xm++; lcd_drawpoint(xm,ym,color); lcd_drawline(x0,y0,xm,ym,color); } } else //斜率为负 { step = (y1-y2)+(x2-x1);//需要移动的步数 while(step--) { if((y2-ym)*(x2-x1)< (y2-y1)*(x2-xm))//判断斜率 ym--; else xm++; lcd_drawpoint(xm,ym,color); lcd_drawline(x0,y0,xm,xm,color); } }}主函数
#include stm32f4xx.h#include core_cm4.h#include ili9341.hint main(){ u16 i = 0; ili9341_init(); //ili9341初始化 lcd_drawsolidtriangle(10,200,10,10,200,200,red); while(1);}屏幕显示如图
2、实心矩形
空心矩形的画法可以想象同空心三角形一样,只要给出两个对角点,就可以确定矩形的四个点,连出四条线组成矩形。
空心矩形函数
void lcd_drawrectangle(u16 x0,u16 y0,u16 x1,u16 y1,u16 color){ lcd_drawline(x0,y0,x0,y1,color); lcd_drawline(x0,y0,x1,y0,color); lcd_drawline(x0,y1,x1,y1,color); lcd_drawline(x1,y0,x1,y1,color);}实心矩形可以从左到右依次从上往下画线,原理也很简单。函数如下
void lcd_drawsolidrectangle(u16 x0,u16 y0,u16 x1,u16 y1,u16 color){ u16 i = 0; for(i=0;i< y1-y0;i++) { lcd_drawline(x0,y0+i,x1,y0+i,color); }}主函数
#include stm32f4xx.h#include core_cm4.h#include ili9341.hint main(){ u16 i = 0; ili9341_init(); //ili9341初始化 lcd_drawsolidrectangle(100,100,200,200,red); while(1);}屏幕显示如图
3、实心圆
空心圆的画法,可以把圆分为8等分,每份占45°,根据圆的对称性,画出其中1/8,其余的也就画出来了。
圆上的点的和半径之间有xx+yy=r*r的关系,可以通过判断和半径之间的大小关系来确定每一个点要怎么移动。同时,如果圆心为原点,那么45°对应的x和y是相等的,可以通过这个来判断这1/8的圆是否已经画好。
空心圆函数
void lcd_drawcircle(u16 x,u16 y,u16 r,u16 color){ u16 xm = 0,ym = r; u16 i = 0; //先画出圆在x、y轴上的四个点 lcd_drawpoint(x,y+r,color); lcd_drawpoint(x+r,y,color); lcd_drawpoint(x,y-r,color); lcd_drawpoint(x-r,y,color); while(xm<=ym)//判断是否画完 { if((xm*xm+ym*ym)< (r*r))//在圆内 xm++; else //在圆外 ym--; lcd_drawpoint(x+xm,y+ym,color); lcd_drawpoint(x-xm,y+ym,color); lcd_drawpoint(x-ym,y+xm,color); lcd_drawpoint(x-ym,y-xm,color); lcd_drawpoint(x+ym,y+xm,color); lcd_drawpoint(x+ym,y-xm,color); lcd_drawpoint(x+xm,y-ym,color); lcd_drawpoint(x-xm,y-ym,color); }}主函数
#include stm32f4xx.h#include core_cm4.h#include ili9341.hint main(){ u16 i = 0; ili9341_init(); //ili9341初始化 lcd_drawcircle(120,150,100,red); while(1);}屏幕显示如图
空心圆完成了,实心的就很好画了。只要让圆的半径从0开始增加到目标半径,依次画出每个半径的圆,最后呈现出来的就是一个实心圆了。
实心圆函数
void lcd_drawsolidcircle(u16 x,u16 y,u16 r,u16 color){ u16 i = 0; for(i=1;i< r;i++) lcd_drawcircle(x,y,i,color);}主函数
#include stm32f4xx.h#include core_cm4.h#include ili9341.hint main(){ u16 i = 0; ili9341_init(); //ili9341初始化 lcd_drawsolidcircle(120,150,100,red); while(1);}屏幕显示如图
lcd上基本图形的画法就介绍到这里了。

攻克全面屏全金属难关 vivo X20天线设计大揭秘!
小新Air14 2020款外观公布 摄像头配备物理结构开关
尖端科技才是现代化医疗行业的解决之道
纳入“黑名单”的中芯国际:仍与供应商长期稳定合作
以慢为快——CI/CD流水线中的断路器机制
STM32 ILI9341驱动TFTLCD(七)LCD画实心三角形、矩形、圆形
区块链真的可以离得开币圈吗
添加PLC程序并让轴快速运转起来
中兴通讯发布了2018年第三季度和前三季度业绩报告
步进电机用什么控制 如何选择步进电机驱动器
沈阳奥普泰智慧交通IP数字化光传输系统为管理者和施工单位提供10大解决方案
加速您的应用程序:用英特尔Advor XE轻松实现矢量化
如何定义自动驾驶技术之于汽车行业未来的重要性?
安科瑞能耗管理系统在防化学院阅兵村项目的应用
PLC案例按钮控制圆盘旋转一圈
电缆混乱如何查找识别整理—鼎升电力
意法半导体携手三安光电,推进中国碳化硅生态系统发展
浅谈异频中继在铁路无线通信弱场区及隧道盲区的应用
比iPad air2便宜900元,这样的新iPad你会买么?
Realme首款智能电视将在印度首发