计算机图形学中点画圆算法和Bresenham画圆算法的实现,以及用种子填充算法去填充一个圆。

代码如下:

#中点画圆算法
def Mid_Circle(r,xc,yc):
    img = np.ones([700, 700], np.uint8)*255#创建一个700*700的幕布
    (x0,y0)=(0,r)#初始化
    d=1-r#初始化d
    plt.plot(xc + x0, yc + y0, 'k.', markersize=1)#画出对称点
    img[xc + x0, yc + y0] = 2#将像素值调为2
    plt.plot(xc + x0, yc - y0, 'k.', markersize=1)
    img[xc + x0, yc - y0] = 2
    plt.plot(xc - x0, yc + y0, 'k.', markersize=1)
    img[xc - x0, yc + y0] = 2
    plt.plot(xc - x0, yc - y0, 'k.', markersize=1)
    img[xc - x0, yc - y0] = 2
    plt.plot(xc + y0, yc + x0, 'k.', markersize=1)
    img[xc + y0, yc + x0] = 2
    plt.plot(xc + y0, yc - x0, 'k.', markersize=1)
    img[xc + y0, yc - x0] = 2
    plt.plot(xc - y0, yc + x0, 'k.', markersize=1)
    img[xc - y0, yc + x0] = 2
    plt.plot(xc - y0, yc - x0, 'k.', markersize=1)
    img[xc - y0, yc - x0] = 2
    while(x0<=y0):#用循环不断画点
        x0=x0+1#
        if d<0:
            d=d+2*x0+1
        else:
            y0=y0-1
            d=d+2*(x0-y0)+1
        if x0>y0:
            break
        #继续画对称点,并且将该点的像素值更改为2
        plt.plot(xc + x0, yc + y0, 'k.', markersize=1)
        img[xc + x0, yc + y0] = 2
        plt.plot(xc + x0, yc - y0, 'k.', markersize=1)
        img[xc + x0, yc - y0] = 2
        plt.plot(xc - x0, yc + y0, 'k.', markersize=1)
        img[xc - x0, yc + y0] = 2
        plt.plot(xc - x0, yc - y0, 'k.', markersize=1)
        img[xc - x0, yc - y0] = 2
        plt.plot(xc + y0, yc + x0, 'k.', markersize=1)
        img[xc + y0, yc + x0] = 2
        plt.plot(xc + y0, yc - x0, 'k.', markersize=1)
        img[xc + y0, yc - x0] = 2
        plt.plot(xc - y0, yc + x0, 'k.', markersize=1)
        img[xc - y0, yc + x0] = 2
        plt.plot(xc - y0, yc - x0, 'k.', markersize=1)
        img[xc - y0, yc - x0] = 2
    return img

#Bresenham画圆算法
def Bresenham_Circle(r,xc,yc):
    img = np.ones([700, 700], np.uint8)*255
    (x0,y0)=(0,r)
    d=3-2*r
    while(x0<=y0):
        plt.plot(xc + x0, yc + y0, 'k.', markersize=1)
        img[xc + x0,yc + y0] = 2
        plt.plot(xc + x0, yc - y0, 'k.', markersize=1)
        img[xc + x0, yc - y0] = 2
        plt.plot(xc - x0, yc + y0, 'k.', markersize=1)
        img[xc - x0, yc + y0] = 2
        plt.plot(xc - x0, yc - y0, 'k.', markersize=1)
        img[xc - x0, yc - y0] = 2
        plt.plot(xc + y0, yc + x0, 'k.', markersize=1)
        img[xc + y0, yc + x0] = 2
        plt.plot(xc + y0, yc - x0, 'k.', markersize=1)
        img[xc + y0, yc - x0] = 2
        plt.plot(xc - y0, yc + x0, 'k.', markersize=1)
        img[xc - y0, yc + x0] = 2
        plt.plot(xc - y0, yc - x0, 'k.', markersize=1)
        img[xc - y0, yc - x0] = 2
        if(d<0):
            d1=2*(d+y0)-1
            if(d1<=0):
                x0=x0+1
                d=d+2*x0+1
            else:
                x0=x0+1
                y0=y0-1
                d=d+2*(x0-y0+1)
        elif(d>0):
            d2=2*(d-x0)-1
            if(d2<=0):
                x0=x0+1
                y0=y0-1
                d=d+2*(x0-y0+1)
            else:
                y0=y0-1
                d=d-2*y0+1
    return img

def seedFill(point, x, y):#创建一个种子填充函数
    stack = [(x, y)]#创建一个堆栈
    while stack:#当堆栈不为空
        (x, y) = stack.pop()
        if point[x][y] == 255:#如果像素值为255的话,将该点的像素值改为2,并且进行染色
            point[x][y] = 2
            plt.plot(x, y, 'r.', markersize=1)
            if point[x + 1, y] == 255:#用多个递归,对四方进行染色
                stack.append((x + 1, y))
            if point[x, y + 1] == 255:
                stack.append((x, y + 1))
            if point[x - 1, y] == 255:
                stack.append((x - 1, y))
            if point[x, y - 1] == 255:
                stack.append((x, y - 1))
    return point
img=Mid_Circle(150,249,249)
img=seedFill(img,249,249)
plt.imshow(img, origin='lower',cmap='gray')
plt.show()

运行结果如下

7236e9505c4e4ee58c2f258ec7672689.png

 

因为在写种子填充算法时,递归老是报错,也不清楚如何解决,索性就将递归编程堆栈了

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值