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

2024-05-31  

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


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);

}

屏幕显示如图

图片

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);

}

屏幕显示如图

1ee81b84d0a725bd83f8df7b85a544c4_wKgaomTCH42ADbx6AAM6aJs7GMA561.jpg

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);

}

屏幕显示如图

e2a8484f30b1edc3b54f7e7640c79a7b_wKgZomTCH42AEznsAAI-Wleu6d0544.jpg

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

}

屏幕显示如图

图片

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


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。