上次测试画直线函数时,已经通过三条直线画出了一个空心三角形,今天来画一下实心的,分别画下实心三角形、实心矩形、实心圆。
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);
}
屏幕显示如图
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);
}
屏幕显示如图
空心圆完成了,实心的就很好画了。只要让圆的半径从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上基本图形的画法就介绍到这里了。