计算机图形学----DDA、Bresenham直线算法
来源:互联网 发布:sublime json 格式化 编辑:程序博客网 时间:2024/05/18 02:26
一、DDA算法原理
DDA(数值微分算法)算法是一个增量算法。增量算法:在一个迭代算法中,每一步的x、y值是用前一步的值加上一个增量来获得。
通过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后根据误差项的符号确定该列象素中与此交点最近的象素。
DDA需要考虑所画直线的斜率k:
当 |k|<1 , x每增加1,y 增加k。
当 |k|>1 , y每增加1,x增加1/k。
编程实现直线的DDA算法程序;
void CMyView::OnDdaline(){ CDC *pDC=GetDC(); // 获得设备指针 intx0=100,y0=100,x1=300,y1=200,c=RGB(255,0,0); //定义直线两端点和直线颜色(红色) float x,y,i; float dx,dy,k; dx=(float)(x1-x0); dy=(float)(y1-y0); k=dy/dx;//计算斜率 y=y0; x=x0; if(abs(k)<1) { for(;x<=x1;x++) {pDC->SetPixel(x,int(y+0.5),c); y=y+k;}//x自增,y=y+k } if(abs(k)>=1) { for(;y<=y1;y++) {pDC->SetPixel(int(x+0.5),y,c); x=x+1/k;} } ReleaseDC(pDC); //释放设备指针}
二、Bresenham算法原理
Bresenham算法是计算机图形学领域使用最广泛的直线扫描转换方法。
其原理是:过各行、各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线各垂直网格线的交点,然后确定该列像素中与此交点最近的像素。
该算法的优点在于可以采用增量计算,使得对于每一列,只要检查一个误差项的符号,就可以确定该列所求的像素。
直线的Bresenham算法实现:
void CTestView::OnBresenhamline(){ CDC*pDC=GetDC(); intx1=100,y1=200,x2=600,y2=800,color=RGB(0,0,255); inti,x,y,dx,dy; float k,e; dx=x2-x1; dy=y2-y1; k=dy/dx; e=-0.5; x=x1; y=y1;//e初值d0-0.5 for(i=0;i<=dx;i++) { pDC->SetPixel(x,y,color); x++; e=e+k; if(e>=0) { y++; e=e-1;} }}
三、Bresenham改进算法
上述bresenham算法在计算直线斜率与误差项时用到了小数与除法,可以改用整数以避免除法。由于算法中用到误差项的符号,因此可以做如下替换:e'=2*e*dx.
直线的整数Bresenham算法实现:
void CTestView::OnBresenhamline(){ CDC *pDC=GetDC(); int x0=100,y0=100,x1=500,y1=600,color=RGB(0,0,255);int i,x,y,dx,dy; float k,e; dx=x1-x0; dy=y1-y0; e=-dx; x=x0; y=y0; for(i=0;i<=dx;i++) { pDC->SetPixel(x,y,color); x++; e+=2*dy; if(e>=0) {y++;e=e-2*dx;} } ReleaseDC(pDC);}
http://download.csdn.net/detail/ljheee/9870382
阅读全文
1 0
- 计算机图形学----DDA、Bresenham直线算法
- 【计算机图形学】DDA算法和Bresenham算法
- 计算机图形学 学习笔记(一):光栅图形学算法:直线扫描算法(DDA,中点画线算法,Bresenham算法)
- 计算机图形学—DDA直线生成算法
- java画直线算法 DDA 计算机图形学
- 计算机图形学之DDA画线算法Bresenham算法程序
- 计算机图形学 -- 画线算法 [DDA] [中点画线] [Bresenham]
- 计算机图形学DDA算法中点Bresenham算法改进的Bresenham算法
- 计算机图形学——生成直线的DDA算法
- 图形学算法--DDA画直线
- 计算机图形学 - 全斜率Bresenham直线生成算法
- 图形学_画线算法(DDA、Bresenham)
- DDA算法和Bresenham算法生成直线
- 图形学算法--Bresenham画直线
- 直线生成(DDA、中点、Bresenham)算法
- 【OpenGL】直线生成算法DDA+Bresenham
- Bresenham画线算法(计算机图形学)
- 计算机扫描直线Bresenham算法
- AR_ Vuforia _人物模块的旋转跟缩放
- codevs 1160 蛇形矩阵(较为复杂,待优化)
- 项目管理利器-maven
- servlet生命周期与/filter/listener/interceptor区别与联系
- leetcode | 按层访问一棵二叉树 | Python
- 计算机图形学----DDA、Bresenham直线算法
- jfinal 多数据源 Db+record 分页
- SetFileCompletionNotificationModes FILE_SKIP_COMPLETION_PORT_ON_SUCCESS
- 算法作业_37(2017.6.19第十八周)
- Android UI测试框架Espresso以及代码覆盖率jacoco的使用
- npm常用命令
- 接续符和转义符
- DPCM编解码
- 【脚本语言系列】关于Python数据库处理SQLAlchemy,你需要知道的事