图形学(9)画线
2016-08-03 16:45
169 查看
画线算法
1. 计算机画线
真实的直线应该是连续的,但是计算机不可能显示出完全连续平滑的直线,于是计算机用一系列 离散化的像素点 来表示直线(《计算机图形学的概念与方法》柳朝阳)
2. 常用画线算法
2.1 DDA算法
DDA是一种基于直线的 微分方程 来生成直线的方法
基本的直线微分:dydx=k
跟据步长(也即像素数目)即可计算出x,y坐标:
步长取 Stepx:yi+1=yi+k
OR
步长取 Stepy:xi+1=xi+1k
其中步长取 Stepx 还是 Stepy
考虑两端点之间水平距离 |Δx|=|x2−x1| 与竖直距离 |Δy|=|y2−y1|
绝对值大 的确定步长
从起始位置(x1,y1)开始, 按照步长,沿线段路径计算每一步下一个像素的位置
调整每一步的x和y,逐一绘制余下像素。
DDA算法 比起根据 直线方程计算离散取样 的方法省去了乘法,加快了计算。
但是 取整操作 与 浮点运算 仍然十分费时。
2.2 Bresenham算法
该算法仅使用增量整数计算Bresenham通过计算两像素与实际线段的偏移比值的整型参数的符号比较来确定所取像素
当斜率K大于1时,在Y方向上以单位步长移动,计算x值,
当斜率在0到1 之间时,在X方向上以单位步长移动。
其中步长取 Stepx 还是 Stepy
考虑两端点之间水平距离 |Δx|=|x2−x1| 与竖直距离 |Δy|=|y2−y1|
绝对值大 的确定步长
设 |k|<1 ,第k步时,(xk,yk)开始,判断下一位置取(xk+1,yk)还是(xk+1,yk+1),假设dlower和dupper来表示两个像素与数学上线段路径的垂直偏移
线段在xk+1处的y坐标可计算为:y=m(xk+1)+b那么
dlower=y−yk=m(xk+1)+b−yk
且
dupper=(yk+1)−y=(yk+1)−m(xk+1)−b
要确定两像素中哪一个更接近线路经,作差
dlower−dupper=2m(xk+1)−2yk+2b−1定义决策参数:
pk=Δx⋅(dlower−dupper)=2Δy⋅xk−2Δx⋅yk+c(c是常量)
可以继续推导出:
pk+1=2Δy⋅xk+1−2Δx⋅yk+1+c pk+1−pk=2Δy(xk+1−xk)−2Δx(yk+1−yk)
由xk+1=xk+1,
{pk+1p0=pk+2Δy−2Δx(yk+1−yk),=2Δy−Δxyk+1−yk取0或1,取决于pk符号
|k|<1时,Bresenham画线算法具体步骤如下:
输入线段的两个端点,存储左端点在(x0,y0)中;将(x0,y0)装入帧缓存,画出第一个点;
计算常量 Δx,Δy,2Δy,2Δy−2Δx, 得到第一个决策参数
p0=2Δy−Δx
从i=0开始,在沿线段路径的每个xi处进行下列检测:
如果 pk<0 ,下一个要绘制的点为 (xi+1,yi), 并且 pi+1=pi+2Δy
否则,下一个要绘制的点为 (xi+1,yi+1), 并且 pi+1=pi+2Δy−2Δx
重复步骤4, 共Δx−1次。
相关文章推荐
- 图形学复习4——光栅化(画线画圆扫描线反走样算法)
- 计算机图形学(第四版)-第一个画线例子- 读书笔记P30
- 计算机图形学 学习笔记(一):概述,直线扫描转换算法:DDA,中点画线算法,Bresenham算法
- 计算机图形学(二)输出图元_3_画线算法_2_DDA算法
- 图形学实验一:bresenham算法 画线和画圆
- 计算机图形学(二)输出图元_3_画线算法_3_Bresenham画线算法
- 计算机图形学 -- 画线练习,国民党党旗,共青团团旗,花形图案
- 计算机图形学 -- 画线算法 [DDA] [中点画线] [Bresenham]
- 计算机图形学(二)输出图元_3_画线算法_2_DDA算法
- 计算机图形学的课程设计作业
- 博客园的计算机图形学团队
- 疯狂画线GDI
- 图形学中常用的几种数学方法
- 一本需要购买的图形学方面的好书:GPU精粹——实时图形编程的技术、技巧和技艺(附CD-ROM光盘一张)
- 计算机图形学http://ibm.tju.edu.cn/learning/qingxu/%bc%c6%cb%e3%bb%fa%cd%bc%d0%ce%d1%a7/
- 打点画线
- 怎样在屏幕上画线?怎样擦除
- C#, 画线后,移动时去掉重影
- walterzorn 系列-画线、圆、椭圆(卵形)、折线、多边形、矩形
- Silverlight 计算机图形学3 三维空间坐标