Bresenham 中点画圆算法实现

在此记录Bresenham 中点画圆算法,下面直接给出步骤与算法,步骤从计算机图形学一书中截取的,此算法原理在此不做说明,可自行查看计算机图形学一书相关描述。
一、步骤描述
步骤说明

二、代码实现,以OC为开发语言

//以点为类的头文件
@interface ScreenPT : NSObject{
    GLint x,y;
}
@property (nonatomic,assign) GLint x;
@property (nonatomic,assign) GLint y;
-(void) setCoordX:(GLint)x Y:(GLint)y;
-(void) incrementX;
-(void) decrementY;
@end

//类的实现文件
#import "ScreenPT.h"

@implementation ScreenPT
@synthesize x;
@synthesize y;
-(id) init{
    if (self = [super init]) {
        x = 0;
        y = 0;
    }
    return self;
}

-(void) setCoordX:(GLint)x Y:(GLint)y{
    self.x = x;
    self.y = y;
}

-(void) incrementX{
    self.x++;
}

-(void) decrementY{
    self.y--;
}
@end

//实现文件及相关辅助方法
void setPixel(GLint x,GLint y){
    glBegin(GL_POINTS);
    glVertex2i(x, y);
    glEnd();
}

//MARK: Bresenham 中点画圆算法
void circleMidpoint(){
    GLint xc = 100,yc = 100,radius = 30;//圆心与半径
    ScreenPT* spt = [[ScreenPT alloc] init];
    GLint p = 1 - radius;
    [spt setCoordX:0 Y:radius];
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.5, 1.0, 0.0);
    void circlePlotPoints(GLint,GLint,ScreenPT*);
    circlePlotPoints(xc, yc, spt);
    while (spt.x < spt.y) {
        [spt incrementX];
        if (p < 0) {
            p += 2 * spt.x + 1;
        } else {
            [spt decrementY];
            p += 2 * (spt.x - spt.y) + 1;
        }
        circlePlotPoints(xc, yc, spt);
    }
    glFlush();
}

void circlePlotPoints(GLint xc,GLint yc,ScreenPT* spt){
    setPixel(xc + spt.x, yc + spt.y);
    setPixel(xc - spt.x, yc + spt.y);
    setPixel(xc + spt.x, yc - spt.y);
    setPixel(xc - spt.x, yc - spt.y);

    setPixel(xc + spt.y, yc + spt.x);
    setPixel(xc - spt.y, yc + spt.x);
    setPixel(xc + spt.y, yc - spt.x);
    setPixel(xc - spt.y, yc - spt.x);
}

三、效果图
效果图

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值