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

接口/总线/驱动

1119人已加入

描述

上次测试画直线函数时,已经通过三条直线画出了一个空心三角形,今天来画一下实心的,分别画下实心三角形、实心矩形、实心圆。

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< x1)    //如果起点在终点左边,起点终点互换位置,确保从左到右划线
  {
    xm = x1;
    x1 = x2;
    x2 = xm;

    ym = y1;
    y1 = y2;
    y2 = ym;
  }
  xm = x1;
  ym = y1;
  LCD_DrawPoint(xm,ym,color);//写起点

  if(y2 >=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.h"


int main()
{
  u16 i = 0;
  ILI9341_Init();                  //ILI9341初始化
  LCD_DrawSolidTriangle(10,200,10,10,200,200,RED);
  while(1);
}

屏幕显示如图

STM32

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.h"


int main()
{
  u16 i = 0;
  ILI9341_Init();                  //ILI9341初始化
  LCD_DrawSolidRectangle(100,100,200,200,RED);
  while(1);
}

屏幕显示如图

STM32

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.h"


int main()
{
  u16 i = 0;
  ILI9341_Init();                  //ILI9341初始化
  LCD_DrawCircle(120,150,100,RED);
  while(1);
}

屏幕显示如图

STM32

空心圆完成了,实心的就很好画了。只要让圆的半径从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.h"


int main()
{
  u16 i = 0;
  ILI9341_Init();                  //ILI9341初始化
  LCD_DrawSolidCircle(120,150,100,RED);
  while(1);
}

屏幕显示如图

STM32

LCD上基本图形的画法就介绍到这里了。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分