上次測試畫直線函數(shù)時(shí),已經(jīng)通過三條直線畫出了一個(gè)空心三角形,今天來畫一下實(shí)心的,分別畫下實(shí)心三角形、實(shí)心矩形、實(shí)心圓。
1、實(shí)心三角形
實(shí)心三角形,可以先畫任意兩條邊,然后以這兩條邊的交點(diǎn)為頂點(diǎn),向第三條直線的點(diǎn)畫直線。在畫第三條直線時(shí),思想和畫直線是一樣的,只是在畫好點(diǎn)之后,多加了頂點(diǎn)向剛畫好的點(diǎn)畫直線這一步。到第三條直線畫完時(shí),實(shí)心三角形也就畫好了。
畫實(shí)心三角形函數(shù)
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) //如果起點(diǎn)在終點(diǎn)左邊,起點(diǎn)終點(diǎn)互換位置,確保從左到右劃線
{
xm = x1;
x1 = x2;
x2 = xm;
ym = y1;
y1 = y2;
y2 = ym;
}
xm = x1;
ym = y1;
LCD_DrawPoint(xm,ym,color);//寫起點(diǎn)
if(y2 >=y1) //斜率為正
{
step = (y2-y1)+(x2-x1);//需要移動(dòng)的步數(shù)
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 //斜率為負(fù)
{
step = (y1-y2)+(x2-x1);//需要移動(dòng)的步數(shù)
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);
}
}
}
主函數(shù)
#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、實(shí)心矩形
空心矩形的畫法可以想象同空心三角形一樣,只要給出兩個(gè)對角點(diǎn),就可以確定矩形的四個(gè)點(diǎn),連出四條線組成矩形。
空心矩形函數(shù)
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);
}
實(shí)心矩形可以從左到右依次從上往下畫線,原理也很簡單。函數(shù)如下
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);
}
}
主函數(shù)
#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、實(shí)心圓
空心圓的畫法,可以把圓分為8等分,每份占45°,根據(jù)圓的對稱性,畫出其中1/8,其余的也就畫出來了。
圓上的點(diǎn)的和半徑之間有xx+yy=r*r的關(guān)系,可以通過判斷和半徑之間的大小關(guān)系來確定每一個(gè)點(diǎn)要怎么移動(dòng)。同時(shí),如果圓心為原點(diǎn),那么45°對應(yīng)的x和y是相等的,可以通過這個(gè)來判斷這1/8的圓是否已經(jīng)畫好。
空心圓函數(shù)
void LCD_DrawCircle(u16 x,u16 y,u16 r,u16 color)
{
u16 xm = 0,ym = r;
u16 i = 0;
//先畫出圓在x、y軸上的四個(gè)點(diǎn)
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))//在圓內(nèi)
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);
}
}
主函數(shù)
#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);
}
屏幕顯示如圖
空心圓完成了,實(shí)心的就很好畫了。只要讓圓的半徑從0開始增加到目標(biāo)半徑,依次畫出每個(gè)半徑的圓,最后呈現(xiàn)出來的就是一個(gè)實(shí)心圓了。
實(shí)心圓函數(shù)
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);
}
主函數(shù)
#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上基本圖形的畫法就介紹到這里了。
評論