OpenEdv-开源电子网

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

LCD 画圆的一个代码,可以节省CODE空间2.5KB

[复制链接]

96

主题

247

帖子

1

精华

高级会员

Rank: 4

积分
801
金钱
801
注册时间
2012-6-29
在线时间
0 小时
发表于 2012-11-16 00:25:52 | 显示全部楼层 |阅读模式
// 顺时针生成圆--正负算法生成圆
void Draw_Circle(u16 x0,u16 y0,u8 r)
{
 int x=0,y=r,proc=0;
 while(x<=y)
 {
  LCD_DrawPoint(x0+x,y0+y);
  LCD_DrawPoint(x0+x,y0-y);
  LCD_DrawPoint(x0-x,y0+y);
  LCD_DrawPoint(x0-x,y0-y);
  LCD_DrawPoint(x0+y,y0+x);
  LCD_DrawPoint(x0+y,y0-x);
  LCD_DrawPoint(x0-y,y0+x);
  LCD_DrawPoint(x0-y,y0-x);
  if(proc<=0)
  {
   proc=proc+(x<<1)+1;//x<<1相当于x*2,用移位来代替乘2的n次方,可以节约代码空间。
   x++;
  }
  else
  {
   proc=proc-(y<<1)+1;
   y--;
  }
 }
}
呵呵,很好用的哦,比原子的代码,可以节约大概2.5KB左右。。。。。
http://blog.tianya.cn/blogger/blog_main.asp?BlogID=4666068
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-11-16 00:33:09 | 显示全部楼层
回复 支持 反对

使用道具 举报

2

主题

100

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
278
金钱
278
注册时间
2012-4-15
在线时间
0 小时
发表于 2012-11-16 08:42:10 | 显示全部楼层
貌似楼主这也是bransenham算法的衍生吧。原子的也是啊,会有这么大差别吗?
喜欢单片机,没什么道理,就像爱吃水煮鱼,对味而已。
回复 支持 反对

使用道具 举报

31

主题

269

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2012-5-18
在线时间
6 小时
发表于 2012-11-16 08:55:07 | 显示全部楼层
什么是bransenham算法,用来做什么的?
谁来买我的火柴.....
回复 支持 反对

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
发表于 2012-11-16 08:56:49 | 显示全部楼层
看看离散数学嘛
回复 支持 反对

使用道具 举报

72

主题

251

帖子

0

精华

高级会员

Rank: 4

积分
597
金钱
597
注册时间
2012-3-29
在线时间
7 小时
发表于 2012-11-16 10:02:44 | 显示全部楼层
回复【楼主位】moline:
---------------------------------
牛人呵
一般我都只会复制使用没管优化
学习了
回复 支持 反对

使用道具 举报

头像被屏蔽

82

主题

191

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
465
金钱
465
注册时间
2011-11-14
在线时间
33 小时
发表于 2012-11-16 20:19:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2012-11-16
在线时间
0 小时
发表于 2012-11-16 21:27:51 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子大哥 弱弱的问你一下  ,你的例程里面的  di=3-(r<<1);  怎么得到的啊
回复 支持 反对

使用道具 举报

96

主题

247

帖子

1

精华

高级会员

Rank: 4

积分
801
金钱
801
注册时间
2012-6-29
在线时间
0 小时
 楼主| 发表于 2012-11-16 22:09:26 | 显示全部楼层
回复【7楼】tianheyun:
这个画的圆没有原子的圆滑哦
---------------------------------
确实,这个画法,圆确实没那么圆滑,有出现直线部分(与过圆心的坐标轴相交的部分),但代码确实可以节约很多.......
http://blog.tianya.cn/blogger/blog_main.asp?BlogID=4666068
回复 支持 反对

使用道具 举报

31

主题

269

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2012-5-18
在线时间
6 小时
发表于 2012-11-17 20:57:55 | 显示全部楼层
回复【8楼】rhkiauj:
---------------------------------
bransenham算法,百度资料有说
谁来买我的火柴.....
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2013-1-24
在线时间
0 小时
发表于 2013-1-24 00:52:37 | 显示全部楼层

 int x=0,y=r,proc=0;
这三个变量的类型改成unsigned short,那么根据算法,会出来一个十字坐标,有兴趣的童鞋可以试一下~
If you stay, against everything I believe in, I would be with you. But if you leave, don't come back.
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2013-1-24
在线时间
0 小时
发表于 2013-1-24 02:40:55 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子,稍作修改,作出的圆可以与你的代码作出的圆媲美,从ST官方GUI库找到的,与大家共享~
void LCD_DrawCircle(unsigned short x, unsigned short y, unsigned char Radius, unsigned short Color) {
signed int D; unsigned int CurX; unsigned int CurY;
  D = 3 - (Radius << 1);
  CurX = 0;
  CurY = Radius;

  while (CurX <= CurY)
  {
LCD_SetPoint(x + CurX, y - CurY, Color);
LCD_SetPoint(x - CurX, y + CurY, Color);
LCD_SetPoint(x - CurX, y - CurY, Color);
LCD_SetPoint(x + CurX, y + CurY, Color);
LCD_SetPoint(x + CurY, y + CurX, Color);
LCD_SetPoint(x + CurY, y - CurX, Color);
LCD_SetPoint(x - CurY, y + CurX, Color);
LCD_SetPoint(x - CurY, y - CurX, Color);

    if (D < 0)
    {
      D += (CurX << 2) + 6;
    }
    else
    {
      D += ((CurX - CurY) << 2) + 10;
      CurY--;
    }
    CurX++;
  }
}
If you stay, against everything I believe in, I would be with you. But if you leave, don't come back.
回复 支持 反对

使用道具 举报

10

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2015-5-22
在线时间
0 小时
发表于 2015-6-2 22:56:22 | 显示全部楼层
回复【8楼】rhkiauj:
---------------------------------
同问 di=3-(r<<1); why
我建了一个战舰stm32交流群:320350722 新手请教老手,老手大显身手! stm32交流群:320350722 stm32交流群:320350722
回复 支持 反对

使用道具 举报

10

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2015-5-22
在线时间
0 小时
发表于 2015-6-2 22:58:34 | 显示全部楼层
这个应该是决策变量di的初始值,为什么是3-2r呢?
http://www.cnblogs.com/sky1991/archive/2012/07/09/2583624.html这里算出来是di=5/4-r   why??????????????????
我建了一个战舰stm32交流群:320350722 新手请教老手,老手大显身手! stm32交流群:320350722 stm32交流群:320350722
回复 支持 反对

使用道具 举报

3

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-5-29
在线时间
0 小时
发表于 2015-6-3 09:59:46 | 显示全部楼层
画圆不是需要插补算法吗?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 20:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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