我是靠谱客的博主 满意火龙果,最近开发中收集的这篇文章主要介绍【计算机图形学】画线算法——Bresenham算法(任意斜率)二、C语言实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

   

目录

一、Bresenham算法原理

二、C语言实现


 一、Bresenham算法原理

Bresenham提出的一种精确而有效的光栅线生成算法,可用于显示线、圆和其他曲线的整数增量运算。它是目前最有效的线段生成算法。

   推导: 

 设线段端点:(,),(,),∆x和∆y为水平和垂直偏移量,m为斜率

                                                

                当|m| <= 1时,对于给定的x增量x    

                                                         

                当|m| >= 1时,对于给定的y增量y

                                                   

                

 (当  0<m < 1)   

假设已经确定了要显示的像素,那么,需要确定下一点是绘制在,

还是   

                                                               

                     

根据直线的方程,直线上处的y坐标为:

                                        

                        ​​​​​​​​​​​​​​​​​​​​​​​​​​​​                

                                         

                                        

m带入d1   d2中,并变换得:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

其中,为算法中k步的决策参数c为一常量,其值为。

那么:

                                        若,即,有  

                                        若即,有  

同理,可求得第k+1步的决策参数 

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

因此,有如下递推关系:

         ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​       

因为0<m<1 因此,带入上式得:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

其中,的值取决于的值:

                                        当时,, 

                                        当时, ,

Bresenham算法描述 (0 < m < 1)

算法从线段的起始端点开始,反复计算每个点的决策参数并绘制像素。

起始端点处的决策参数为:

          ​​​​​​​        ​​​​​​​        ​​​​​​​        

                                  

                                  

                                  

算法:

1、输入线段的两个端点,并将左端点存储在中;

2、将装入帧缓冲器,画出第一个点;

3、计算常量xy2y 2y – 2x,并得到决策参数的第一个值: 

4、从k = 0开始,在沿线的每个处,进行下列检测:

  若,下一个待画点是,且

  ,下一个待画点是,且

5、重复步骤4,共x次。

二、C语言实现

//Modified form https://rosettacode.org/wiki/Bitmap/Bresenhanm%27s_line_algorithm#c
void bresenham(int x0, int y0, int x1, int y1){
int dx = abs(x1 - x0), sx = x0 < x1 ? 1 : -1;
int dy = abs(y1 - y0), sy = y0 < y1 ? 1 : -1;
int erro = (dx > dy ? dx : -dy) / 2;
while(putpixel(x0,y0), x0 != x1 || y0 != y1){
int e2 = erro;
if(e2 > -dx) { erro -= dy; x0 += sx;}
if(e2 <
dy) { erro += dx; y0 += sy;}
}
}

main方法

int main() {
initgraph(640, 480);
setbkcolor(0xC1CDC1);
cleardevice();
bresenham(320, 240, 0, 0, BLACK);
bresenham(320, 240, 160, 0, BLUE);
bresenham(320, 240, 320,0,GREEN);
bresenham(320, 240, 480,0, CYAN);
bresenham(320, 240, 640, 0, RED);
bresenham(320, 240, 640, 120, MAGENTA);
bresenham(320, 240, 640, 240, BROWN);
bresenham(320, 240, 640, 360, LIGHTGRAY);
bresenham(320, 240, 640, 480, DARKGRAY);
bresenham(320, 240, 480, 480, LIGHTBLUE);
bresenham(320, 240, 320, 480, LIGHTGREEN);
bresenham(320, 240, 160, 480, LIGHTCYAN);
bresenham(320, 240, 0, 480, LIGHTMAGENTA);
bresenham(320, 240, 0, 360, YELLOW);
bresenham(320, 240, 0, 240, BROWN);
bresenham(320, 240, 0, 120, WHITE);
_getch();
return 0;
}

结果:

                                   

最后

以上就是满意火龙果为你收集整理的【计算机图形学】画线算法——Bresenham算法(任意斜率)二、C语言实现的全部内容,希望文章能够帮你解决【计算机图形学】画线算法——Bresenham算法(任意斜率)二、C语言实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部