问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

写出直线段扫描转换的Bresenham算法,并生成从点P1(0,0)到点P2 (5,2)的直线段,要求写出每一步递推过程

发布网友 发布时间:2022-05-24 21:00

我来回答

1个回答

热心网友 时间:2023-11-01 23:10

没分?····不过既然我有现成的那就给你吧,不过复制粘贴而已!

Bresenham算法是Bresenham提出的一种光栅线生成算法!DDA算法表面上看起来很有效,并且代码也比较容易实现,但是显示每个像素都需要进行一次浮点数加法运算,而Bresenham算法的最大优点是不需要进行浮点数运算!这是一种精确而有效的光栅线生成算法,该算法仅使用增量整数计算,计算速度比DDA要快,另外,Bresenham算法还可用于显示圆和其他曲线,这里暂时只显示直线!

         与DDA一样,我们假设线段的两个端点坐标是整数值(x0,y0)(xEnd,yEnd),且斜率m满足0<=m>=1! 坐标轴的垂直轴表示扫描线位置,水平轴标识像素列,假设以单位x间隔取样,需要确定下一个每次取样时两个可能的像素位置中的哪一个更接近于线路径!

         从给定线段的左端点(x0,y0)开始,逐步处理每个后继列(x位置),并在其扫描线y值最接近线段的像素处描出一点,假如已经确定要显示的像素在(xk,yk),那么下一步就要确定在列xk+1=xk+1上绘制哪个像素,是在位置(xk+1,yk)还是在(xk+1,yk+1)

        在取样位置xk+1,我们使用dlower和pper来标识两个像素与数学上线路径的垂直偏移,在像素列xk+1处的直线上的y坐标根据直线方程可计算得:

                                    y=m(xk+1)+b

那么可求得:

                                  dlower=y-yk=m(xk+1)+b-yk

                                             pper=( yk+1)-y= yk+1-m(xk+1)-b

令斜率m=dy/dx,引入决策参数Pk,定义为:

                 Pk=dx(dlower- pper)

 =2dx*xk-2dy*yk+c

C是一个常数,值为2dx+dx(2b-1)

由此可以计算得到

                pk+1= Pk +2dy-2dx(yk+1-yk) 

其中yk+1-yk取0还是取1取决于参数Pk的符号,Pk为负时取0,Pk非负时取1!

而Pk为负时,下一个要绘制的点就是(xk+1,yk)且pk+1= Pk +2dy

Pk为非负时则下一个要绘制的点就是(xk+1,yk+1)且pk+1= Pk +2dy-2dx

至此,Bresenham算法介绍完毕,以下为某个示例:

 

#include <gl/glut.h>

#include <math.h>

#include <stdio.h>

 

void draw_pixel(int ix,int iy)

{

       glBegin(GL_POINTS);

       glVertex2i(ix,iy);

       glEnd();

}

 

void Bresenham(int x1,int y1,int xEnd,int yEnd)

{

       int dx=abs(xEnd-x1),dy=abs(yEnd-y1);

       int p=2*dy-dx;

       int twoDy=2*dy,twoDyMinusDx=2*dy-2*dx;

       int x,y;

       if (x1>xEnd)

       {

                x=xEnd;y=yEnd;

                xEnd=x1;

       }

       else

       {

                x=x1;

                y=y1;

       }

       draw_pixel(x,y);

       while(x<xEnd)

       {

                x++;

                if(p<0)

                          p+=twoDy;

                else

                {

                          y++;

                          p+=twoDyMinusDx;

                          draw_pixel(x,y);

                }

       }

}

 

void display()

{

       glClear(GL_COLOR_BUFFER_BIT);

       Bresenham(0,0,400,400);//这是我的线段两端点的坐标,你可以换成Bresenham(0,0,5,2),

//不过估计很短,看不清

    glFlush();

}

 

void myinit()

{

       glClearColor(0.8,1.0,1.0,1.0);

       glColor3f(0.0,0.0,1.0);

       glPointSize(1.0);

       glMatrixMode(GL_PROJECTION);

       glLoadIdentity();

       gluOrtho2D(0.0,500.0,0.0,500.0);

       

}

 

 

void main(int argc,char **argv )

{

       glutInit(&argc,argv);

       glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

       glutInitWindowSize(500,500);

       glutInitWindowPosition(200.0,200.0);

       glutCreateWindow("CG_test_Bresenham_Line example");

       glutDisplayFunc(display);

       myinit();

       glutMainLoop();

       

}

 

程序运行效果如图:

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
2024年云南292分能考上什么大学? 2024高考多少分能被焦作大学录取 【芍药花茶】芍药花茶的功效与作用 芍药花茶怎样喝 芍药花茶的介绍 芍药花茶的属性和功效 联想拯救者电竞手机Pro评测 植物大战僵尸花园战争有用的激活码发给我,有用我就采纳 亲亲奶爸《亲亲奶爸》歌词 植物大战花园战争激活码只能用一次? 歌词中带有。我的好爸爸。我的好爸爸。儿女怎能舍得让你走,_百度... edge浏览器没声音是怎么回事-edge浏览器没声音解决办法 在直线Bresenham生成算法中,确定y的值取yi+1,还是yi的依据是 如何用中点Bresenham算法完成直线扫描转换? 求计算机图形学中的直线绘制函数法、DDA算法、中点法和Bresenham算法的优缺点以及比较. 刚接触不太懂,请问各位我在mac上装了github for mac,还需要装git吗 lcd Bresenham算法画直线疑问代码e=dy-dx/2;是什么意思? Bresenham算法编写直线的程序怎么写啊!!Java学的不好…………这作业惨烈 关于Bresenham算法的求助 Bresenham直线演算法的最佳化 直线bresenham算法基于什么思路 Bresenham直线演算法的一般化 Bresenham直线演算法的介绍 Bresenham直线演算法的演算方法 共享充电宝成本怎么样 共享充电宝成本分析 共享充电宝财务怎么面试 深圳是谁开发的? 共享充电宝有没有税收这项要求 您好,公司购入一批共享充电宝,金额很大,靠这个收租金,请问一下购进的充电宝该如何入账比较好呢? 是不是深圳是靠香港发展? 改革开发33年了 ,有谁晓得 深圳是用什么打造起来的 ,深圳刚开始开发的时候是用什么模式打造的? 当年上海,深圳,天津的开发用的什么模式 我的华为荣耀30手机为啥没有HD开关。荣耀301。。荣耀30i设置里没有高清通话软件? 免费通话软件 那个通话清晰的 这个壁纸名字叫什么? 求这张壁纸原图及出处 最近我看新闻,看到说无代码平台,不用开发程序就能搭建系统,我想试试? 2厘亚克力板介刀能切吗 求这张壁纸的原图,图片我删了 请给我这个桌面壁纸的原图,非常感谢! 前置摄像头模糊不清 二进制负数补码转为十进制还有意义吗 青青子衿青青子佩采用了什么手法表达了什么感情? 青青子衿,悠悠我心。呦呦鹿鸣,食野之苹,我有嘉宾,鼓瑟吹笙。运用了哪些表现手法?表达了什么情感 青青子衿,悠悠我心诗句属于哪种类型,以及在表达作者思想情感上所起的作用? 在Excel中输入身份证号码为什么不能正确显示?后面的数字有三位变成0了? 为什么我老是被静电打到? 发卡要用什么洗‘ 洁净如新! 可以用食盐水浸泡吗? 小雏菊发卡怎么清洗 台风闭园,上海迪士尼竟然不退票!有哪些店大欺客的例子? 一个成年人还被父母教育没有家教,那么他是个什么样的人? gkd是什么意思