OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11961|回复: 13

TFT画实心圆,有什么快的好办法吗???

[复制链接]

24

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2013-7-18
在线时间
0 小时
发表于 2013-8-18 19:20:08 | 显示全部楼层 |阅读模式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
发表于 2013-8-18 20:50:30 | 显示全部楼层
用极坐标系
(x, y) = fun(selta, Oxy, R);     //角度selta,  圆心Oxy,半径R, 得到一个x,y坐标

fun的原理就是:
because-(这里假设圆心坐标为原点(0,0),这样看着清晰些)
x^2 + y^2 = R^2;
x = R*cos(selta);
y = R*sin(selta);
带入角度和半径R,就可以得到x,y坐标值。这样的话,可以selta转一圈,就可以得到一圈的坐标值,然后只需要直接描点即可。
带入原点坐标,这个该会了吧,高中数学知识就够了。
画空心圆是这样,画实心圆就把半径积分吧。

如果感觉速度慢了,就自己写cos和sin的分段n阶泰勒级数计算,速度可以提升,精度也不低。
更或者,查表法,不过会牺牲一些flash。

绝对原创哦!
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
发表于 2013-8-18 20:53:09 | 显示全部楼层
我没用这个方法画过实心圆,
离散后可能效果不是很好,
你可以先试下
回复 支持 反对

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2013-8-18 21:05:14 | 显示全部楼层
原子哥的程序画空心圆,
Draw_Circle(u16 x0,u16 y0,u8 r)
自己写个函数,
for(i=r;i>=0;i--)
Draw_Circle(u16 x0,u16 y0,u8 r);

这样试试,呵呵
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
发表于 2013-8-18 22:01:24 | 显示全部楼层
回复【4楼】745021926:
---------------------------------
我试过这个方法,本身圆形是离散后得到的,这种方法效果不是很好,有白斑,就是园内没填充完。
回复 支持 反对

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2013-8-18 22:18:21 | 显示全部楼层
回复【5楼】lsj9383:
---------------------------------
哦 ,对,边界处刚好会有空隙是吧? 这个没试过...
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2013-8-18 22:24:30 | 显示全部楼层
回复【5楼】lsj9383:
---------------------------------
不过用GUI的话,就方便多了
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2013-8-18 22:56:01 | 显示全部楼层
百度bresenham算法,自己改进一下画直线咯。
业余程序玩家。
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2013-8-18 22:59:20 | 显示全部楼层
我自己的算法,迭代公式是自己算出来的,不知为什么跟网上找到的不一样,不过也可以画圆哦。

void lcd_circle_fill(s16 x0,s16 y0,u16 r, u16 color)
{
int dx, dy;
int er, i, j;

dx = r;
dy = 0;
er = 3-4*r;
while(dy <= dx)
{

for(i=x0-dx,j=y0+dy; i<=x0+dx; i++)
{
lcd_point_draw(i,j,color);
}
for(i=x0-dx,j=y0-dy; i<=x0+dx; i++)
{
lcd_point_draw(i,j,color);
}

if(er>=0)
{
for(i=x0-dy,j=y0+dx; i<=x0+dy; i++)
{
lcd_point_draw(i,j,color);
}
for(i=x0-dy,j=y0-dx; i<=x0+dy; i++)
{
lcd_point_draw(i,j,color);
}
er += 8*(1+dy-dx);
dx--;
}
else
{
er += (4+8*dy);

dy++;
}

}
业余程序玩家。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-18 23:20:06 | 显示全部楼层
战舰板,综合实验,gui部分有画实心圆的代码,实心椭圆也有。
代码移植自ucGUI。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-8-19 11:19:02 | 显示全部楼层
//圆形的结构体定义
typedef struct _MCIRCLE
{
MPoint center;
u16 r;
Color brushcolor;
Color pencolor;

}MCircle, *pMCircle;

//c为待画的圆形,brush是否填充, true:实心,false空心
void LCD_DrawCircle(MCircle c,  bool brush)
{
int a,b;
MPoint  p;
MLine  L;
u16 x0 = c.center.x;
u16 y0 = c.center.y;
int di;

L.color = c.brushcolor ;

a=0;  b=c.r;   
di=3-(c.r<<1);             //????????????????±ê??

while(a<=b)
{
p.x = x0+a; p.y = y0+b ; LCD_DrawPoint(p,c.pencolor);                    
p.x = x0+a; p.y = y0-b ; LCD_DrawPoint(p,c.pencolor);                  
p.x = x0-a; p.y = y0+b ; LCD_DrawPoint(p,c.pencolor);                  
p.x = x0-a; p.y = y0-b ; LCD_DrawPoint(p,c.pencolor);     
p.x = x0+b; p.y = y0+a ; LCD_DrawPoint(p,c.pencolor);                     
p.x = x0+b; p.y = y0-a ; LCD_DrawPoint(p,c.pencolor);             
p.x = x0-b; p.y = y0+a ; LCD_DrawPoint(p,c.pencolor);            
p.x = x0-b; p.y = y0-a ; LCD_DrawPoint(p,c.pencolor);            

if(brush)
{
L.start.x = x0-a+1; L.start.y = y0-b+1;  L.end.x  = x0+a-1; L.end.y  = y0-b+1; LCD_DrawLine(L);
L.start.x = x0-a+1; L.start.y = y0+b-1;  L.end.x  = x0+a-1; L.end.y  = y0+b-1;  LCD_DrawLine(L);   
L.start.x = x0-b+1; L.start.y = y0-a+1;  L.end.x  = x0+b-1; L.end.y  = y0-a+1; LCD_DrawLine(L);
L.start.x = x0-b+1; L.start.y = y0+a-1;  L.end.x  = x0+b-1; L.end.y  = y0+a-1; LCD_DrawLine(L);
}
a++;
if(di<0)
di +=4*a+6;   
else
{
di+=10+4*(a-b);   
b--;


p.x = x0+a; p.y = y0+b ;
LCD_DrawPoint(p,c.pencolor);                    
}

}
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-8-19 11:21:46 | 显示全部楼层
这是很久以前写的了, 

最好改动下

用指针 pMCircle 代替 MCircle 传入参数 会增加效率
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-8-19 11:23:25 | 显示全部楼层
关于上面用到的几个结构体的定义:


typedef union 
{
u16 color;
struct{
unsigned R : 5;
unsigned G : 6;
unsigned B : 5;
}F;
}Color_565;


typedef union 
{
u32 color;
struct{
u8 R;
u8 G;
u8 B;
}F;
}Color_Win;

/* LCD color R5-G6-B5*/
typedef enum {
clWhite     =0xFFFF, //°×??
clBlack     =0x0000, //????
clMaroon       =0x8000, //????
  
clMoneyGreen   =0xC6F8, //???????ù????????
clAqua         =0x07FF, //??????
clGreen       =0x0400, //??????
clLime         =0x07E0, //??????
clTeal         =0x0410, //?è????
clOlive       =0x8400, //é?é???
clNavy         =0x0010,   //?à??

clRed         =0xF800, //?ì??
clJacinth =0xFC08, //é??ì??
clOrange =0xFC00, //???ì??
clLtPink =0xFC1F, //??·???
clFuchsia     =0xF81F, //×??ì??
    clPink =0xD938, //·??ì??
clPurple     =0x8010, //??×???
clDkCarnation =0x4010, //??×???
clPeachblow =0xF810, //???ì??
clBrown =0x8200, //????
clYellow       =0xFFE0, //????
  clCream       =0xFFDE, //??????

clBlue         =0x001F, //????
  clSkyBlue       =0xA65E, //?ì????

clLtGray       =0xC618, //??????
clMedGray     =0xA514,   //????
clGray       =0x8410,   //??????
clSilver     =0xC618, //??????
  
}Color;

//#
typedef struct _MSIZE
{
u16 width;
u16 high;

}MSize, *pMSize;

//??
typedef struct _MPOINT
{
u16 x;
u16 y; 
}MPoint, *pMPoint;

//????
typedef struct _MLINE
{
MPoint start;
MPoint end;
Color color;
}MLine, *pMLine;


//????
typedef struct _MCIRCLE
{
MPoint center;
u16 r;
Color brushcolor;
Color pencolor;

}MCircle, *pMCircle;

回复 支持 反对

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-5-27
在线时间
0 小时
发表于 2013-8-19 11:33:11 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
原子哥 我的屏幕开始就显示的彩色的花屏 一条一条的那种  这是什么原因啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-14 21:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表