OpenEdv-开源电子网

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

关于LCD例子中的画实心圆的代码有点看不懂,自己写了一个,可能有点笨

[复制链接]

14

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2015-8-5
在线时间
9 小时
发表于 2015-8-25 16:25:44 | 显示全部楼层 |阅读模式
5金钱

原子哥原来的代码
void gui_fill_circle(u16 x0,u16 y0,u16 r,u16 color)
{            
 u32 i;
 u32 imax = ((u32)r*707)/1000+1;
 u32 sqmax = (u32)r*(u32)r+(u32)r/2;
 u32 x=r;
 gui_draw_hline(x0-r,y0,2*r,color);//?­?±??
 
 for (i=1;i<=imax;i++)
 {
  if ((i*i+x*x)>sqmax)// draw lines from outside 
  {
    if (x>imax)
   {
    gui_draw_hline (x0-i+1,y0+x,2*(i-1),color);
    gui_draw_hline (x0-i+1,y0-x,2*(i-1),color);
   }
   x--;
  }
  // draw lines from inside (center) 
  gui_draw_hline(x0-x,y0+i,2*x,color);
  gui_draw_hline(x0-x,y0-i,2*x,color);
 }
}


自己改的代码

void MY_gui_fill_circle(u16 x0,u16 y0,u16 r,u16 color)

 u16 i,j;
 for(i=x0-r;i<=x0;i++)
 {
  for(j=y0-r;j<=y0+r;j++)
  { 
   if((i-x0)*(i-x0)+(j-y0)*(j-y0)<r*r)
    gui_draw_hline(i,j,2*(x0-i),RED);
  }
 }

}

原来的代码含义还望高手解释下!!

最佳答案

查看完整内容[请看2#楼]

1.首先,一个圆分成8块是对称的,i为y轴变量,x为x轴变量 2.之所以imax 要+1,是因为画点的间隔为1,i的范围是0到2分之根号2r; 3.i在0到0.707r是,i每次循环递增,x当距离圆心距离大于r时减小,i增加快,x减小慢,这里sqmax 为r2+r/2,是因为x从r开始减小,i从0开始增加,当i=2分之根号r时,i增加,这里可以看作画圆的算法,这样画会显得圆一些; 4.首先理解,当i>=2分之根号r 时应该减小i的递增速度,增加x的递增速 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2019-1-19
在线时间
1 小时
发表于 2015-8-25 16:25:45 | 显示全部楼层
1.首先,一个圆分成8块是对称的,i为y轴变量,x为x轴变量



2.之所以imax 要+1,是因为画点的间隔为1,i的范围是0到2分之根号2r;

3.i在0到0.707r是,i每次循环递增,x当距离圆心距离大于r时减小,i增加快,x减小慢,这里sqmax 为r2+r/2,是因为x从r开始减小,i从0开始增加,当i=2分之根号r时,i增加,这里可以看作画圆的算法,这样画会显得圆一些;

4.首先理解,当i>=2分之根号r 时应该减小i的递增速度,增加x的递增速度,这样才对称,不然2区域基本是几条线;所以做法是当i>=imax 时就把x和i颠倒,这里做法是,直接x<imax时,区域1和区域2  一起画。(由于i和x是对称的,用i<=imax,x>imax组合和 i<=imax,x>imax  效果是相同的)。


画圆.jpg
回复

使用道具 举报

14

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2015-8-5
在线时间
9 小时
 楼主| 发表于 2015-8-25 16:27:11 | 显示全部楼层
imax和sqmax定义的作用是什么呢?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-8-25 22:34:02 | 显示全部楼层
直接用。。。代码我也是抄的别人的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

30

主题

282

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2015-8-24
在线时间
241 小时
发表于 2015-8-26 13:26:52 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
.......................................................................................................................
回复

使用道具 举报

4

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2015-7-16
在线时间
29 小时
发表于 2015-8-26 14:51:38 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
好诚实的原子哥
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-12-6
在线时间
3 小时
发表于 2020-6-18 11:22:06 | 显示全部楼层
原子哥画实心圆的代码在哪里,我没找到
这个函数gui_draw_hline是什么
回复

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2021-10-15
在线时间
13 小时
发表于 2021-10-15 10:16:08 | 显示全部楼层
dw6 发表于 2020-6-18 11:22
原子哥画实心圆的代码在哪里,我没找到
这个函数gui_draw_hline是什么

画水平线函数
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 04:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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