Рисование геометрических фигур на TFT дисплее, на примере ILI9341.
Алгоритмы, которые позволяют рисовать геометрические фигуры на TFT дисплее были рассмотрены ранее тут, поэтому в этой стать лишь приведу реализацию функций для ILI9341.
Для того чтобы закрасить экран нужным цветом в прошлой статье мы использовали функцию TFT_Fill_Screen(), с помощью этой же функции можно закрасить прямоугольник или квадрат нужного размера, правильно задав координаты рабочей области.
У кого-то мог возникнуть вопрос откуда в выражении (x + length - 1) взялась -1, это связано с тем, что при отрисовке одного пикселя начало и конец рабочей области — это одна и та же координата.
Для отрисовки линий всё также используется алгоритм Брезенхема.
С помощью горизонтальных и вертикальных линий можно нарисовать прямоугольник.
Так же просто рисуется и треугольник.
И напоследок окружности: не закрашенная и закрашенная.
На этом всё, проект для Atmega16 в Atmel Studio 6.2 в архиве .
Для того чтобы закрасить экран нужным цветом в прошлой статье мы использовали функцию TFT_Fill_Screen(), с помощью этой же функции можно закрасить прямоугольник или квадрат нужного размера, правильно задав координаты рабочей области.
void TFT_Fill_Rectangle(uint16_t x, uint16_t y, uint16_t length, uint16_t width, uint16_t color)
{
if(length && width)
{
TFT_Fill_Screen(x, x+length - 1, y, y+width - 1, color);
}
}
У кого-то мог возникнуть вопрос откуда в выражении (x + length - 1) взялась -1, это связано с тем, что при отрисовке одного пикселя начало и конец рабочей области — это одна и та же координата.
Для отрисовки линий всё также используется алгоритм Брезенхема.
void TFT_Draw_Line( uint16_t x0,uint16_t y0,uint16_t x1, uint16_t y1,uint16_t color)
{
int x = x1-x0;
int y = y1-y0;
int dx = abs(x), sx = x0<x1 ? 1 : -1;
int dy = -abs(y), sy = y0<y1 ? 1 : -1;
int err = dx+dy, e2;
for (;;){
TFT_Draw_Pixel(x0,y0,color);
e2 = 2*err;
if (e2 >= dy) {
if (x0 == x1) break;
err += dy; x0 += sx;
}
if (e2 <= dx) {
if (y0 == y1) break;
err += dx; y0 += sy;
}
}
}
С помощью горизонтальных и вертикальных линий можно нарисовать прямоугольник.
void TFT_Draw_Horizontal_Line( uint16_t x, uint16_t y, uint16_t length,uint16_t color)
{
TFT_Set_Column(x,x + length);
TFT_Set_Page(y,y);
TFT_Send_Cmd(0x2c);
for(int i=0; i<length; i++)
TFT_Write_Data16(color);
}
void TFT_Draw_Vertical_Line( uint16_t x, uint16_t y, uint16_t length,uint16_t color)
{
TFT_Set_Column(x,x);
TFT_Set_Page(y,y+length);
TFT_Send_Cmd(0x2c);
for(int i=0; i<length; i++)
TFT_Write_Data16(color);
}
void TFT_Draw_Rectangle(uint16_t x, uint16_t y, uint16_t length, uint16_t width,uint16_t color)
{
TFT_Draw_Horizontal_Line(x, y, length, color);
TFT_Draw_Horizontal_Line(x, y + width-1, length, color);
TFT_Draw_Vertical_Line(x, y, width,color);
TFT_Draw_Vertical_Line(x + length -1, y, width,color);
}
Так же просто рисуется и треугольник.
void TFT_Draw_Triangle( uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3, uint16_t color)
{
TFT_Draw_Line( x1, y1, x2, y2, color);
TFT_Draw_Line( x2, y2, x3, y3, color);
TFT_Draw_Line( x3, y3, x1, y1, color);
}
И напоследок окружности: не закрашенная и закрашенная.
void TFT_Draw_Circle(uint16_t pos_x, uint16_t pos_y, uint8_t r,uint16_t color)
{
int x = -r, y = 0, err = 2-2*r, e2;
do {
TFT_Draw_Pixel(pos_x-x, pos_y+y,color);
TFT_Draw_Pixel(pos_x+x, pos_y+y,color);
TFT_Draw_Pixel(pos_x+x, pos_y-y,color);
TFT_Draw_Pixel(pos_x-x, pos_y-y,color);
e2 = err;
if (e2 <= y) {
err += ++y*2+1;
if (-x == y && e2 <= x) e2 = 0;
}
if (e2 > x) err += ++x*2+1;
} while (x <= 0);
}
void TFT_Fill_Circle(uint16_t pos_x, uint16_t pos_y, uint8_t r,uint16_t color)
{
int x = -r, y = 0, err = 2-2*r, e2;
do {
TFT_Draw_Vertical_Line(pos_x-x, pos_y-y, 2*y, color);
TFT_Draw_Vertical_Line(pos_x+x, pos_y-y, 2*y, color);
e2 = err;
if (e2 <= y) {
err += ++y*2+1;
if (-x == y && e2 <= x) e2 = 0;
}
if (e2 > x) err += ++x*2+1;
} while (x <= 0);
}
На этом всё, проект для Atmega16 в Atmel Studio 6.2 в архиве .
Похожие статьи