OpenEdv-开源电子网

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

关于战舰3.5版本例程LCD.C文件中使用Bresenham算法画圆的疑问!

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2013-7-4
在线时间
0 小时
发表于 2013-7-4 19:53:32 | 显示全部楼层 |阅读模式
 


为什么是我写的!!求大神们解答!!
用技术丰富自我
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

83

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2013-3-28
在线时间
64 小时
发表于 2013-7-4 20:26:41 | 显示全部楼层
回复【楼主位】binggege119:
---------------------------------
你的问题让人好疑惑?!深深的不懂你提问的意思啊!
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2013-7-4
在线时间
0 小时
 楼主| 发表于 2013-7-4 20:37:00 | 显示全部楼层
回复【2楼】zkevin8879:
---------------------------------
你好,上面那个截图不是有三行代码后面的注释:三个为什么就是我要想表达的意思!我可能没有表述清楚。
void Draw_Circle(u16 x0,u16 y0,u8 r)
{
int a,b;
int di;
a=0;b=r;   
di=3-(r<<1);   //判断下个点位置的标志 即di= 3-2*r
while(a<=b)
{
LCD_DrawPoint(x0+a,y0-b);             //5
  LCD_DrawPoint(x0+b,y0-a);             //0           
LCD_DrawPoint(x0+b,y0+a);             //4               
LCD_DrawPoint(x0+a,y0+b);             //6 
LCD_DrawPoint(x0-a,y0+b);             //1       
  LCD_DrawPoint(x0-b,y0+a);             
LCD_DrawPoint(x0-a,y0-b);             //2             
               LCD_DrawPoint(x0-b,y0-a);             //7               
a++;
//使用Bresenham算法画圆     
if(di<0)
di+=4*a+6;  //?????为什么不是 di +=2*A+3 
else
{
di+=10+4*(a-b);  //????为什么不是 di +=2*(a-b)+5  
b--;

// a++ //?????为什么不在这里执行a++     
}
}
用技术丰富自我
回复 支持 反对

使用道具 举报

9

主题

83

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2013-3-28
在线时间
64 小时
发表于 2013-7-4 21:32:12 | 显示全部楼层
回复【3楼】binggege119:
---------------------------------
我还真没研究过这个画圆的算法,问问版主吧!
回复 支持 反对

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2013-7-4 21:43:03 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2013-7-4 21:49:42 | 显示全部楼层
四舍五入,超过半个点的距离就算下个点?
至于a自增的位置,我觉得你的有道理。不过其实算出来的结果差距都不大的。

你的还好啦,我的推出来的公式都跟网上的不一样。不过好歹也能运行。
业余程序玩家。
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2013-7-4 21:53:02 | 显示全部楼层
我自己推算出来的迭代公式,不知为什么跟网上给的不一样。不过都能画圆哦。

dx = r;
dy = 0;
er =  3-4*r; // er(y++)=4*(1+2y)-4r-1=3-4r
while(dy <= dx)
{
lcd_point_draw(x0+dx,y0+dy,color); // [0~pi/4]
lcd_point_draw(x0+dy,y0+dx,color); // [pi/4~pi/2]
lcd_point_draw(x0-dy,y0+dx,color); // [pi/2~3pi/4]
lcd_point_draw(x0-dx,y0+dy,color); // [3pi/4~pi]
lcd_point_draw(x0-dx,y0-dy,color); // [pi~5pi/4]
lcd_point_draw(x0-dy,y0-dx,color); // [5pi/4~3pi/2]
lcd_point_draw(x0+dy,y0-dx,color); // [3pi/2~7pi/4]
lcd_point_draw(x0+dx,y0-dy,color); // [7pi/4~2pi]
dy++;
if(er>=0)
{
dx--;
er += 8*(1+dy-dx);    // er(x--,y++)=er(x,y)+(1+dy-dx)*8
}
else

er += (4+8*dy); // er(x,y++)=er(x,y)+(1+2y)*4
}
}
业余程序玩家。
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2013-7-4
在线时间
0 小时
 楼主| 发表于 2013-7-5 14:25:09 | 显示全部楼层
回复【5楼】xouou_53320:
---------------------------------
还请高手教教我们咧,我按照算法原理算出来的就是我打问号后面的的那个表达式!没有搞明白
用技术丰富自我
回复 支持 反对

使用道具 举报

3

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
401
金钱
401
注册时间
2013-3-28
在线时间
38 小时
发表于 2014-2-21 21:13:43 | 显示全部楼层
按理计初值是 5/4-R,应该乘以2了,整形用3-2R(也就是左移1位),后面di也是两倍,就是这样吧,我猜。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 11:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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