直线光栅化

使用python分别实现Bresenham算法以及wu反锯齿算法的直线光栅化。

import cv2
import numpy as np
import math

def BresenhamDrawLine(img,start,end):
    #    1、输入线段的两个端点坐标和画线颜色:x1,y1,x2,y2,color;
    #   2、设置象素坐标初值:x = x1,y = y1;
    #   3、设置初始误差判别值:p = 2·Δy - Δx;
    #   4、分别计算:Δx = x2 - x1、Δy = y2 - y1;
    #   5、循环实现直线的生成:
    #    for (x=x1;x <= x2;x++)
    #        {putpixel(x, y, color) ;
    #         if (p >= 0)
    #          {y=y+1;
    #           p=p+2·(Δy-Δx);
    #          }
    #          else
    #          {p=p+2·Δy;
    #          }
    #        }
    k = float(end[1] - start[1]) / (end[0] - start[0])
    dy = end[1] - start[1]
    dx = end[0] - start[0]
    x = start[0]
    y = start[1]
    if k < 1:
        p = 2*dy - dx
        for x in range(start[0],end[0]):
            img[x][y] = 255
            if p >= 0:
                y += 1
                p += 2*(dy-dx)
            else:
                p += 2*dy
    else:
        p = 2*dx - dy
        for y in range(start[1],end[1]):
            img[x][y] = 255
            if p >= 0:
                x += 1
                p += 2*(dx-dy)
            else:
                p += 2*dx
    
def WUAADrawLine(img,start,end):
    k = float(end[1] - start[1]) / (end[0] - start[0])
    if k < 1:
        y = start[1]
        for x in range(start[0],end[0]):
            off = y - int(y)
            img[x][int(y)] = (1-off)*255
            img[x][int(y)+1] = off * 255
            y += k
    else:
        k = float(end[0] - start[0])/(end[1] - start[1])
        x = start[0]
        for y in range(start[1],end[1]):
            off = x - int(x)
            img[int(x)][y] = (1-off)*255
            img[int(x)+1][y] = off * 255
            x += k

if __name__ == '__main__':
    O = 0
    S = 80
    img = np.zeros((S+10,S+10), np.uint8)
    ptStart = (O,O)
    for i in range(1,9):
        ptEnd = (int(O + S * math.cos(i*math.pi/18)),int(O + S * math.sin(i*math.pi/18)))
        BresenhamDrawLine(img, ptStart, ptEnd)
        # WUAADrawLine(img, ptStart, ptEnd)
    cv2.namedWindow('result', cv2.WINDOW_NORMAL)  # 窗口大小可以改变
    cv2.imshow('result', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

Bresenham算法
在这里插入图片描述
wuaa算法
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值