OpenEdv-开源电子网

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

请教一下画实心圆的算法,要求不能重复画某一个点

[复制链接]

22

主题

180

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2015-6-29
在线时间
101 小时
发表于 2016-1-6 21:44:06 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 负西弱 于 2016-1-7 09:24 编辑

     请教一下各位画实心圆的算法,网上不少画圆的算法,但是我现在有一个特殊的需求,就是画圆的过程中所画的点不能重复画。现在我自己想到的是两种方法:

   1、用勾股定理画,但是这个会有开方的运算,我的算法最终是要单片机实现的,想减少一下运算量,这个方法不是很好;

   2、事先建一个数组,用来记录当前所画的点是否已经画过,然后再利用Bresenham算法来画实心圆,这个方法我觉得还可以接受。

     不知道大家有没有更好的算法或者思路可以提供来参考一下呢?

最佳答案

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

进去第一个画横线循环前进行判断,如果y没有变化,则不必进去。重复的地方应该就是这里。
我是菜鸟
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2016-1-6 21:44:07 来自手机 | 显示全部楼层
进去第一个画横线循环前进行判断,如果y没有变化,则不必进去。重复的地方应该就是这里。
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2016-1-7 00:52:37 来自手机 | 显示全部楼层
不是早就有成熟的算法了吗?用Bresenham算出左右两个对称的点,再连接画出直线。
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1684
金钱
1684
注册时间
2014-2-25
在线时间
230 小时
发表于 2016-1-7 08:36:45 | 显示全部楼层
楼上正解
回复

使用道具 举报

22

主题

180

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2015-6-29
在线时间
101 小时
 楼主| 发表于 2016-1-7 09:21:19 | 显示全部楼层
ofourme 发表于 2016-1-7 00:52
不是早就有成熟的算法了吗?用Bresenham算出左右两个对称的点,再连接画出直线。

这个我知道,但是我从网上找了这个算法,然后试了,发现它画的过程中是会有重复画的现象,我的代码是这样的
[mw_shl_code=csharp,true]private void DrawCircle(int Xpos, int Ypos, int Radius, Bitmap bitMap)
        {
            int D;    /* Decision Variable */
            int CurX;/* Current X Value */
            int CurY;/* Current Y Value */
            //int i;

            D = 3 - (Radius << 1);

            CurX = 0;
            CurY = Radius;

            while (CurX <= CurY)
            {
#if false
                for (i = Xpos - CurX + 1; i < Xpos + CurX - 1; i++)
                {
                    bitMap.SetPixel(i, Ypos + CurY - 1, Color.Red);
                    bitMap.SetPixel(i, Ypos - CurY + 1, Color.Red);
                }

                for (i = Xpos - CurY + 1; i < Xpos + CurY - 1; i++)
                {
                    bitMap.SetPixel(i, Ypos + CurX - 1, Color.Red);
                    bitMap.SetPixel(i, Ypos - CurX + 1, Color.Red);
                }
#else
                //设置有效区域边框
                bitMap.SetPixel(Xpos + CurX - 1, Ypos + CurY - 1, Color.Red);

                bitMap.SetPixel(Xpos + CurX - 1, Ypos - CurY + 1, Color.Red);

                bitMap.SetPixel(Xpos - CurX + 1, Ypos + CurY - 1, Color.Red);

                bitMap.SetPixel(Xpos - CurX + 1, Ypos - CurY + 1, Color.Red);

                bitMap.SetPixel(Xpos + CurY - 1, Ypos + CurX - 1, Color.Red);

                bitMap.SetPixel(Xpos + CurY - 1, Ypos - CurX + 1, Color.Red);

                bitMap.SetPixel(Xpos - CurY + 1, Ypos + CurX - 1, Color.Red);

                bitMap.SetPixel(Xpos - CurY + 1, Ypos - CurX + 1, Color.Red);
#endif
                if (D < 0)
                {
                    D += (CurX << 2) + 6;
                }
                else
                {
                    D += ((CurX - CurY) << 2) + 10;
                    CurY--;
                }
                CurX++;
            }
        }[/mw_shl_code]

我是菜鸟
回复

使用道具 举报

22

主题

180

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2015-6-29
在线时间
101 小时
 楼主| 发表于 2016-1-7 09:24:15 | 显示全部楼层

我的需求是画圆的过程中不能有重复画点的现象存在~~在网上找到的这个算法试了一下,会有重复画点的现象存在
我是菜鸟
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-1-7 10:11:12 | 显示全部楼层
负西弱 发表于 2016-1-7 09:24
我的需求是画圆的过程中不能有重复画点的现象存在~~在网上找到的这个算法试了一下,会有重复画点的现象存 ...

我觉得LZ你这个有点像是那个七桥问题。那个问题的结论是不可能不重复的走完每座桥
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2016-1-7 10:24:03 来自手机 | 显示全部楼层
看起来你的代码是画横线填充的,而x轴每次循环移动一点,y轴不移动或是移动一点。
改为画竖线填充应该就可以了。
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2016-1-7 10:31:48 来自手机 | 显示全部楼层
上面说错了,想一想还是会重复画线的。得加一个变量,进行判断,如果y没有增加,就放弃部分位置的画线。画横线或是竖线倒是无所谓。
回复

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1815
金钱
1815
注册时间
2011-10-9
在线时间
230 小时
发表于 2016-1-7 12:35:04 | 显示全部楼层
先画一个虚心圆 然后 找对应的2个点 画横线 不行么?
回复

使用道具 举报

22

主题

180

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2015-6-29
在线时间
101 小时
 楼主| 发表于 2016-1-7 16:35:00 | 显示全部楼层
ofourme 发表于 2016-1-7 10:31
上面说错了,想一想还是会重复画线的。得加一个变量,进行判断,如果y没有增加,就放弃部分位置的画线。画 ...

哈哈,一言惊醒梦中人啊,多谢~~然后把我上面那些+1、-1去掉,对于CurX==CurY,CurX == 0的情况特殊处理一下就不会有重复了
我是菜鸟
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 23:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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