在线时间954 小时
UID336767
注册时间2011-12-29
NXP金币721
TA的每日心情 | 开心 2018-7-23 21:04 |
---|
签到天数: 103 天 连续签到: 1 天 [LV.6]常住居民II
金牌会员
 
- 积分
- 16702
- 最后登录
- 1970-1-1
|
本帖最后由 lkl0305 于 2015-9-29 09:57 编辑
一、问题描述:
我们在使用TFT屏时,经常需要画一些图形,比如圆形,如何变成画出一个圆形,那如何画一个空心或实心圆呢?
二、解决办法:
1、网上方法比较多,比如8点画圆法等,大家可以去参考一下。
2、但是有很多没有给出画实心或空心的方法。
3、在这里我根据程序,改动了一下,实现画实心和空心的方法,给大家分享一下:
其中参数含义时圆心的x、y坐标,半径大小,最后是是新或空心的标志,在程序中根据传递过来的参数,首先画圆的实体,然后画圆的边框,这样既可以画空心圆,也可以画实心圆。
void TFT_DrawFastCircle(int xc , int yc , int r, uint8_t FillMode)
{
if ((FillMode & FILLENTITY) == FILLENTITY){
TFT_DrawFastCircleEntity(xc, yc, r);
}
if ((FillMode & FILLEDGE) == FILLEDGE){
TFT_DrawFastCircleEdge(xc, yc, r);
}
}
4、画实体和边框的程序如下:
void TFT_DrawFastCircleEdge(int xc , int yc , int r)
{
int x, y, d;
x = 0;
y = r;
d = -r / 2;
TFT_DrawPoint(xc + x, yc + y, TFT_Dev.TFT_PointColor);
TFT_DrawPoint(xc - x, yc + y, TFT_Dev.TFT_PointColor);
TFT_DrawPoint(xc + x, yc - y, TFT_Dev.TFT_PointColor);
TFT_DrawPoint(xc - x, yc - y, TFT_Dev.TFT_PointColor);
TFT_DrawPoint(xc + y, yc + x, TFT_Dev.TFT_PointColor);
TFT_DrawPoint(xc - y, yc + x, TFT_Dev.TFT_PointColor);
TFT_DrawPoint(xc + y, yc - x, TFT_Dev.TFT_PointColor);
TFT_DrawPoint(xc - y, yc - x, TFT_Dev.TFT_PointColor);
if (r % 2 == 0){
while (x < y){
x++;
if (d < 0){
d += x;
}
else{
y--;
d += x - y;
}
TFT_DrawPoint(xc + x, yc + y, TFT_Dev.TFT_PointColor);
TFT_DrawPoint(xc - x, yc + y, TFT_Dev.TFT_PointColor);
TFT_DrawPoint(xc + x, yc - y, TFT_Dev.TFT_PointColor);
TFT_DrawPoint(xc - x, yc - y, TFT_Dev.TFT_PointColor);
TFT_DrawPoint(xc + y, yc + x, TFT_Dev.TFT_PointColor);
TFT_DrawPoint(xc - y, yc + x, TFT_Dev.TFT_PointColor);
TFT_DrawPoint(xc + y, yc - x, TFT_Dev.TFT_PointColor);
TFT_DrawPoint(xc - y, yc - x, TFT_Dev.TFT_PointColor);
}
}
else{
while (x < y){
x++;
if (d < 0){
d += x + 1;
}
else{
y--;
d += x - y + 1;
}
TFT_DrawPoint(xc + x, yc + y, TFT_Dev.TFT_PointColor);
TFT_DrawPoint(xc - x, yc + y, TFT_Dev.TFT_PointColor);
TFT_DrawPoint(xc + x, yc - y, TFT_Dev.TFT_PointColor);
TFT_DrawPoint(xc - x, yc - y, TFT_Dev.TFT_PointColor);
TFT_DrawPoint(xc + y, yc + x, TFT_Dev.TFT_PointColor);
TFT_DrawPoint(xc - y, yc + x, TFT_Dev.TFT_PointColor);
TFT_DrawPoint(xc + y, yc - x, TFT_Dev.TFT_PointColor);
TFT_DrawPoint(xc - y, yc - x, TFT_Dev.TFT_PointColor);
}
}
}
void TFT_DrawFastCircleEntity(int xc , int yc , int r)
{
int x, y, d;
x = 0;
y = r;
d = -r / 2;
TFT_FillHorizontalLine(xc + x, yc + y, xc - x, yc + y);
TFT_FillHorizontalLine(xc + x, yc - y, xc - x, yc - y);
TFT_FillHorizontalLine(xc + y, yc + x, xc - y, yc + x);
TFT_FillHorizontalLine(xc + y, yc - x, xc - y, yc - x);
if (r % 2 == 0){
while (x < y){
x++;
if (d < 0){
d += x;
}
else{
y--;
d += x - y;
}
TFT_FillHorizontalLine(xc + x, yc + y, xc - x, yc + y);
TFT_FillHorizontalLine(xc + x, yc - y, xc - x, yc - y);
TFT_FillHorizontalLine(xc + y, yc + x, xc - y, yc + x);
TFT_FillHorizontalLine(xc + y, yc - x, xc - y, yc - x);
}
}
else{
while (x < y){
x++;
if (d < 0){
d += x + 1;
}
else{
y--;
d += x - y + 1;
}
TFT_FillHorizontalLine(xc + x, yc + y, xc - x, yc + y);
TFT_FillHorizontalLine(xc + x, yc - y, xc - x, yc - y);
TFT_FillHorizontalLine(xc + y, yc + x, xc - y, yc + x);
TFT_FillHorizontalLine(xc + y, yc - x, xc - y, yc - x);
}
}
}
三、感想与收获:
1、其实大家可以将TFT屏画图的程序总结一下,写一个小库来用。
|
|