吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1918|回复: 9
收起左侧

[其他转载] 【C语言】画圆算法

  [复制链接]
dadashuai 发表于 2021-8-26 08:54

算法一

void gl_drawCir(int32 x,int32 y,int32 r,uint32 color){
 int ix,iy;

 for(ix=x-r;ix<x+r;ix++){
  for(iy=y-r;iy<y+r;iy++){
   if(gl_getLineSize(ix,iy, x,y)<= r*r){
    //考虑效率问题,不透明的圆单独处理

    if(color>>24==0xff){
     mrc_drawPoint(ix,iy, MAKECOLOR565(color));
    }
    else{
    gl_drawPoint(ix,iy, color);
    }
   }
  }
 }
 //printf("color>>24 = %d\n",color>>24);
}

算法二

void gl_drawCir(int x0,int y0,int r, uint32 color)
{
    //使用正负法画圆
    int x, y, f;//(x,y)为当前坐标 f为误差值
    x = x0;
    y = y0 + r;
    f = 0;

    while(y >= y0){//从圆周的右上部分开始
        gl_drawLine( x, y, 2 * x0 - x, y,color);
        gl_drawLine( x, 2 * y0 -y, 2 * x0 - x, 2 * y0 -y,color);

        if(f > 0){
            f = f - 2 * (y - y0) + 1;
            y--;//向圆内走
        }
        else{
            f = f + 2 * (x - x0) + 1;
            x++;//向圆外走
        }
    }

    if(y == y0)
        gl_drawPoint( x, y,color);
}

算法三

void drawCircle(int x, int y, int radius, unsigned int color)
{
    int i = 0;
    int tx = 0, ty = radius, d = 3 - (radius << 1);

    while (tx < ty)
    {
        for (i = x - ty; i <= x + ty; ++i)
        {
           gl_drawPoint( i, y - tx, color);
            if (tx){
               gl_drawPoint( i, y + tx, color);

            }

        }
        if (d < 0)
            d += (tx << 2) + 6;
        else
        {
            for (i = x - tx; i <= x + tx; ++i)
            {
               gl_drawPoint( i, y - ty, color);
               gl_drawPoint( i, y + ty, color);
            }
            d += ((tx - ty) << 2) + 10, ty--;
        }
        tx++;
    }
    if (tx == ty)
        for (i = x - ty; i <= x + ty; ++i)
        {
           gl_drawPoint( i, y - tx, color);
           gl_drawPoint( i, y + tx, color);
        }

}

画空心圆

void gl_Circle(int x0,int y0,int r, uint32 color)
{
    //使用正负法画圆
    int x, y, f;//(x,y)为当前坐标 f为误差值
    x = x0;
    y = y0 + r;
    f = 0;

    while(y >= y0){//从圆周的右上部分开始
        gl_drawPoint( x, y,color);//对称地画出四个象限内的坐标点
        gl_drawPoint( 2 * x0 - x, y,color);
        gl_drawPoint( x, 2 * y0 -y,color);
        gl_drawPoint( 2 * x0 - x, 2 * y0 -y,color);

        if(f > 0){
            f = f - 2 * (y - y0) + 1;
            y--;//向圆内走
        }
        else{
            f = f + 2 * (x - x0) + 1;
            x++;//向圆外走
        }
    }

    if(y == y0)
        gl_drawPoint( x, y,color);
}

免费评分

参与人数 4吾爱币 +10 热心值 +4 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
yan182 + 1 + 1 用心讨论,共获提升!
Stoneone + 1 + 1 谢谢@Thanks!
joneqm + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

头像被屏蔽
itfanr 发表于 2021-8-26 08:57
提示: 作者被禁止或删除 内容自动屏蔽
funlink 发表于 2021-8-26 09:20
pdreamer 发表于 2021-8-26 09:22
头像被屏蔽
tlf 发表于 2021-8-26 10:06
提示: 作者被禁止或删除 内容自动屏蔽
hahahahe 发表于 2021-8-26 12:42
感谢分享
erui 发表于 2021-8-26 14:46
不错的C代码,适合C语言初学者
Otoboku 发表于 2021-8-27 09:13
opengl实在太低级了,连个圆都要折腾一堆代码。
 楼主| dadashuai 发表于 2021-8-27 09:18
Otoboku 发表于 2021-8-27 09:13
opengl实在太低级了,连个圆都要折腾一堆代码。

不会opengl....
Otoboku 发表于 2021-8-27 09:20

原来不是哦,看着那一堆gl开头的函数,我就以为是opengl的了。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 14:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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