理解Bresenham‘s Line 算法

Bresenham’s Line Algorithm

关于Bresenham’s Line Algorithm的一些基础理解
Reference:https://www.geeksforgeeks.org/bresenhams-line-generation-algorithm/
https://www.javatpoint.com/computer-graphics-bresenhams-line-algorithm

引言

给定两个点 A(x1,y1)=和B(x2,y2),如何完成在屏幕上绘制出线段AB呢?
原始的做法是:

// A naive way of drawing line
void naiveDrawLine(x1, x2, y1, y2)
{
   m = (y2 - y1)/(x2 - x1)
   for (x  = x1; x <= x2; x++) 
   {    
      // Assuming that the round function finds
      // closest integer to a given float.
      y = round(mx + c);    
      print(x, y); 
   }
}

但是这个算法太慢了,它包括除法还可能存在浮点数的乘法,还要在每一步用round函数取整数值,而Bresenham’s Line Algorithm则避免了上述问题。

什么是Bresenham’s Line Algorithm

我们总是让x增加1,然后来选择下一个y值是y或者y+1,总而言之 给定任意点(Xk,Yk)我们需要在(Xk+1,Yk+1)和 (Xk+1,Yk)选择一点作为绘制的下一个点。
在这里插入图片描述
显然为了贴近AB直线,我们需要选择最贴近这条直线的点,这样画出来的直线才最贴近AB线。

限制条件

Bresenham’s Line Algorithm 存在的限制条件

  1. 我们从左到右来绘制
  2. x1<x2 and y1<y2
  3. 直线的斜率在0-1之间并且我们从低的一边向高的一边画

算法推导

在这里插入图片描述
根据T,S两点到直线的距离判断下一个点的选择
在这里插入图片描述

代码实现

#include<stdio.h>  
#include<graphics.h>  
void drawline(int x0, int y0, int x1, int y1)  
{  
    int dx, dy, p, x, y;  
    dx=x1-x0;  
    dy=y1-y0;  
    x=x0;  
    y=y0;  
    p=2*dy-dx;  
    while(x<x1)  
    {  
        if(p>=0)  
        {  
            putpixel(x,y,7);  
            y=y+1;  
            p=p+2*dy-2*dx;  
        }  
        else  
        {  
            putpixel(x,y,7);  
            p=p+2*dy;
            x=x+1;  
        }  
}  
int main()  
{  
    int gdriver=DETECT, gmode, error, x0, y0, x1, y1;  
    initgraph(&gdriver, &gmode, "c:\\turboc3\\bgi");  
    printf("Enter co-ordinates of first point: ");  
    scanf("%d%d", &x0, &y0);  
    printf("Enter co-ordinates of second point: ");  
    scanf("%d%d", &x1, &y1);  
    drawline(x0, y0, x1, y1);  
    return 0;  
}  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值