Mr_li 发表于 2012-3-29 15:34:19

用C语言怎么画圆呢?

请问谁懂C语言画圆的原理?无穷多边形吗

Jason022 发表于 2012-3-29 15:52:02

/********************************************/
/* 画圆数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2 */
/********************************************/
void GUI_circle( unsigned char Ox,unsigned char Oy,unsigned char Rx,unsigned char s )
{
    unsigned int xx,rr;
    unsigned int xt,yt;
    unsigned int rs,row,col;
    yt = Rx;
    rr = ( unsigned int )Rx*Rx+1; // 补偿1 修正方形
    rs = ( yt+( yt>>1 ) )>>1; // (*0.75)分开1/8圆弧来画
    for ( xt=0; xt<=rs; xt++ )
    {
      xx = xt*xt;
      while ( ( yt*yt )>( rr-xx ) )
      {
            yt--;
      }
      row = Ox+xt; // 第一象限
      col = Oy-yt;
      LCD_Point( row,col,s );
      row = Ox-xt; // 第二象限
      LCD_Point( row,col,s );
      col = Oy+yt; // 第三象限
      LCD_Point( row,col,s );
      row = Ox+xt; // 第四象限
      LCD_Point( row,col,s );
      //***************45度镜象画另一半***************
      row = Ox+yt; // 第一象限
      col = Oy-xt;
      LCD_Point( row,col,s );
      row = Ox-yt; // 第二象限
      LCD_Point( row,col,s );
      col = Oy+xt; // 第三象限
      LCD_Point( row,col,s );
      row = Ox+yt; // 第四象限
      LCD_Point( row,col,s );
    }
}

Etual 发表于 2012-3-29 16:00:58

解释几何上不是有园的方程吗? (x-a)^2+(y-b)^2=r^2,圆心O(a,b),半径r。 只有两个未知数,跟画直线的原理一样的。只是需要用到平方,开方,等数学函数库。

有或者看看极坐标上面有没有方便点的办法,或者三角函数什么的 ...

愚见

xivisi 发表于 2012-3-29 19:32:48

哪里会无穷多边形?如果显示出来就会被量化成像有限个素点如果不画出来,那就看你需要的精度(太高精度实在没必要)

lawdown 发表于 2012-3-29 19:35:26

#include <graphics.h>
void main()
{
        int gdriver=DETECT,gmode;
        initgraph(&gdriver,&gmode,"c:\\tc");
        cleardevice();
        moveto(160,120);
        lineto(480,120);
        lineto(480,360);
        lineto(160,360);
        lineto(160,120);
        getch();
        closegraph();
}

y574924080 发表于 2012-3-29 19:37:03

可以看看这个

http://www.ourdev.cn/forum.php?mod=viewthread&tid=5462626&extra=page%3D1%26filter%3Ddigest%26digest%3D1%26digest%3D1

shamiao 发表于 2012-3-29 20:20:29

51的麻烦在于需要尽量减少浮点运算,math.h没有十足必要真的别引进来……

sadf1234 发表于 2012-3-30 07:58:43

X=Rcos(A)+X0
Y=Rsin(A)+Y0
A从0到6.28
然后画点

51yyaayya 发表于 2012-3-30 13:55:38

y574924080 发表于 2012-3-29 19:37 static/image/common/back.gif
可以看看这个

http://www.ourdev.cn/forum.php?mod=viewthread&tid=5462626&extra=page%3D1%26filter%3Ddi ...

谢谢,这个贴总结的很多啊!

y574924080 发表于 2012-3-30 18:25:17

51yyaayya 发表于 2012-3-30 13:55 static/image/common/back.gif
谢谢,这个贴总结的很多啊!

不用,

大家互帮互助~~~~~~~

cqv 发表于 2012-3-30 19:18:26

本帖最后由 cqv 于 2012-3-30 19:22 编辑

当年不知道从那抄的。。void LCD_Circle (unsigned int x, unsigned int y, unsigned int r, unsigned int color)
{
        int a, b;
        int di;

        a = 0;
        b = r;
        di = 3 - 2 * r;                                //判断下个点位置的标志
        while (a <= b)
        {
                LCD_Point (x - b, y - a, color);        //3         
                LCD_Point (x + b, y - a, color);        //0         
                LCD_Point (x - a, y + b, color);        //1      
                LCD_Point (x - b, y - a, color);        //7         
                LCD_Point (x - a, y - b, color);        //2            
                LCD_Point (x + b, y + a, color);        //4               
                LCD_Point (x + a, y - b, color);        //5
                LCD_Point (x + a, y + b, color);        //6
                LCD_Point (x - b, y + a, color);
                a++;

                /***使用Bresenham算法画圆**/
                if (di < 0)
                        di += 4 * a + 6;
                else
                {
                        di += 10 + 4 * (a - b);
                        b--;
                }
                LCD_Point (x + a, y + b, color);
        }
}

jeffwei 发表于 2012-3-30 19:51:22

我用的这个void LCD_DrawFullCircle(rt_uint16_t Xpos, rt_uint16_t Ypos, rt_uint16_t Radius, rt_uint16_t Circle_colour, rt_uint16_t full_or_not)
{
int32_tD;    /* Decision Variable */
uint32_tCurX;/* Current X Value */
uint32_tCurY;/* Current Y Value */
D = 3 - (Radius << 1);
CurX = 0;
CurY = Radius;   



D = 3 - (Radius << 1);
CurX = 0;
CurY = Radius;
while (CurX <= CurY)
{
    if(full_or_not!=0)
    {
      LCD_DrawLine_HORIZONTAL(Xpos - CurX, Ypos + CurY, 2*CurX, Circle_colour);
      LCD_DrawLine_HORIZONTAL(Xpos - CurX, Ypos - CurY, 2*CurX, Circle_colour);
      
      LCD_DrawLine_HORIZONTAL(Xpos - CurY, Ypos + CurX, 2*CurY, Circle_colour);
      LCD_DrawLine_HORIZONTAL(Xpos - CurY, Ypos - CurX, 2*CurY, Circle_colour);
    }
    else
    {
      DrawPixel(Xpos + CurX, Ypos + CurY, Circle_colour);
      DrawPixel(Xpos + CurX, Ypos - CurY, Circle_colour);
      DrawPixel(Xpos - CurX, Ypos + CurY, Circle_colour);
      DrawPixel(Xpos - CurX, Ypos - CurY, Circle_colour);
      DrawPixel(Xpos + CurY, Ypos + CurX, Circle_colour);
      DrawPixel(Xpos + CurY, Ypos - CurX, Circle_colour);
      DrawPixel(Xpos - CurY, Ypos + CurX, Circle_colour);
      DrawPixel(Xpos - CurY, Ypos - CurX, Circle_colour);
    }
   
    if (D < 0)
    {
      D += (CurX << 2) + 6;
    }
    else
    {
      D += ((CurX - CurY) << 2) + 10;
      CurY--;
    }
    CurX++;
}
}

a312835782 发表于 2012-3-31 10:10:19

有个算法来着,br什么,一时忘记了

tdjsppwct 发表于 2012-4-18 17:21:57

cqv 发表于 2012-3-30 19:18 static/image/common/back.gif
当年不知道从那抄的。。

你这个程序的原理是什么?看不明白啊!while(a<=b)这个语句一开始不就是真值吗?为什么要这样比较?还有后面的:
                     /***使用Bresenham算法画圆**/   
                if(di<0)di +=4*a+6;          
                else
                {
                        di+=10+4*(a-b);   
                        b--;
                }
这样做的原理是为什么?

mlt911213 发表于 2012-4-18 22:00:01

http://www.ourdev.cn/forum.php?m ... st%3D1%26digest%3D1

cqv 发表于 2012-4-19 20:29:23

tdjsppwct 发表于 2012-4-18 17:21 static/image/common/back.gif
你这个程序的原理是什么?看不明白啊!while(a

使用Bresenham算法画圆
我这不是标注了吗。。。{:sweat:}

tdjsppwct 发表于 2012-4-19 22:17:57

本帖最后由 tdjsppwct 于 2012-4-19 22:22 编辑

cqv 发表于 2012-4-19 20:29 static/image/common/back.gif
使用Bresenham算法画圆
我这不是标注了吗。。。

di = 3 - 2 * r;    //判断下个点位置的标志
为什么要对di这样赋值?这个判断下一个点的原理是怎么判断的?没有懂

还有:if(di<0)   di +=4*a+6;         
         else          di+=10+4*(a-b);   
这个判断里面为什么di的值是这样计算的,实在不懂!查了下该算法,可是还是没有搞懂!望指点迷津,谢谢!

cqv 发表于 2012-4-20 18:32:47

tdjsppwct 发表于 2012-4-19 22:17 static/image/common/back.gif
di = 3 - 2 * r;    //判断下个点位置的标志
为什么要对di这样赋值?这个判断下一个点的原理是怎么判断的 ...

。。我也没深入过,我也是就拿来用。
你真要研究,去研究“计算机图形学”吧。

raxb 发表于 2012-4-20 18:39:21

void disp_circle(uchar a,uchar b,uchar r,uint o)
{                            //a,b:圆心坐标r:半径 o:圆心角
    uchar x,y;               //x,y:圆上坐标
    x=(uchar)(a-r*cos((double)(o*rad)));
    y=(uchar)(b-r*sin((double)(o*rad)));
    disp_dot(x,y);
}

void disp_dot(uchar hang,uchar lie)//hang:行(0~63)
{                                  //lie: 列(0~127)
    uchar col,page;                //col: 选择dot表中字形
    page=hang/8;                   //page:判断属于哪一页
    col=hang%8;
    set_page_address(7-page);
    set_col_address(lie);
    w_data(dot);
}

tdjsppwct 发表于 2012-4-21 07:38:28

cqv 发表于 2012-4-20 18:32 static/image/common/back.gif
。。我也没深入过,我也是就拿来用。
你真要研究,去研究“计算机图形学”吧。 ...

谢谢,我慢慢研究吧

Ytu-xiaolizig 发表于 2012-8-10 17:12:47

tdjsppwct 发表于 2012-4-21 07:38 static/image/common/back.gif
谢谢,我慢慢研究吧

研究的咋样阿?我也想知道为什么阿

tdjsppwct 发表于 2012-8-13 09:41:50

Ytu-xiaolizig 发表于 2012-8-10 17:12 static/image/common/back.gif
研究的咋样阿?我也想知道为什么阿

{:cry:} 一大堆烂事挤在一起了,哪有时间研究啊!

小油猪儿 发表于 2012-8-13 09:49:18

好帖子,以后能用到,MARK下,画圆函数讨论{:lol:}

Mr_li 发表于 2012-8-13 11:35:56

这段时间由于开始上班了,回来都比较累。都没什么多余的精力去学习了。不过很是多谢大家的帮助

1535414824 发表于 2012-8-13 14:37:32

谢谢分享!!

dushanwu522 发表于 2014-6-20 16:55:10

学习了,试验成功!画的圆很圆!

lzchuo 发表于 2014-6-20 17:24:12

受教了,
页: [1]
查看完整版本: 用C语言怎么画圆呢?