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