计算机图形学之--直线生成算法(一)
2014-11-24 21:16
597 查看
引言:
计算机图形学中首先要解决的问题是基本图形的生成显示,由于整个屏幕是由离散的像素集组成。所以,在屏幕上现实生成图形一般分为两步:
一、确定最佳接近图形的像素集;
二、用指定的颜色或者其他属性写像素。
以下将介绍三种生成单像素宽度的算法,分别是:数值微分法(Digital Differential Analyzer,DDA)、中点画线法和Brensenham算法
数值微分法:
DDA算法的思想,是用数值方法解微分方程,即通过对x和y各增加一个小增量,计算下一步的x、y值。
1.0<k<1的DDA算法
已知线段端点P0(x0,y0),P1(x1,y1) ,直线的斜率k=dy/dx=(y1-y0)/(x1-x0);
从直线的起点P0向终点P1逼近,假设dy>0,dx>0;x从x0开始向x1画线,步长为1个单位(像素),对应y坐标为y=kx+b,由于y不一定是整数,所以要四舍五入取整,即
round(y)=int(y+0.5)。同样,对于x也要取整数运算round(x)=int(x+0.5)。
这种画线算法虽然直观简单,但是每一步都有一个浮点数乘法和一个取整round()运算,因而效率低。通过简化可以去掉乘法运算.
生成的直线如下图所示:
2.任意k的DDA算法
上述算法仅适合于0<k<1的情形,即下面左侧图中IA象限内,对于其他象限部分,可参考右表去处理
3.DDA算法的C++实现
计算机图形学中首先要解决的问题是基本图形的生成显示,由于整个屏幕是由离散的像素集组成。所以,在屏幕上现实生成图形一般分为两步:
一、确定最佳接近图形的像素集;
二、用指定的颜色或者其他属性写像素。
以下将介绍三种生成单像素宽度的算法,分别是:数值微分法(Digital Differential Analyzer,DDA)、中点画线法和Brensenham算法
数值微分法:
DDA算法的思想,是用数值方法解微分方程,即通过对x和y各增加一个小增量,计算下一步的x、y值。
1.0<k<1的DDA算法
已知线段端点P0(x0,y0),P1(x1,y1) ,直线的斜率k=dy/dx=(y1-y0)/(x1-x0);
从直线的起点P0向终点P1逼近,假设dy>0,dx>0;x从x0开始向x1画线,步长为1个单位(像素),对应y坐标为y=kx+b,由于y不一定是整数,所以要四舍五入取整,即
round(y)=int(y+0.5)。同样,对于x也要取整数运算round(x)=int(x+0.5)。
这种画线算法虽然直观简单,但是每一步都有一个浮点数乘法和一个取整round()运算,因而效率低。通过简化可以去掉乘法运算.
生成的直线如下图所示:
2.任意k的DDA算法
上述算法仅适合于0<k<1的情形,即下面左侧图中IA象限内,对于其他象限部分,可参考右表去处理
3.DDA算法的C++实现
void CCG算法View::OnDdaline() { // TODO: 在此添加命令处理程序代码 CDC *pdc=GetDC(); // myPoint point1(100,100),point2(400,300); CPoint point1(100,100),point2(400,300); //初始两点 float x,y,i; float dx,dy,k; dx=(float)(point2.x-point1.x); dy=(float)(point2.y-point1.y); k=dy/dx;//斜率 y=point1.y; x=point1.x; if (abs(k)<1)//斜率绝对值小于1时,以x步进 { for (;x<=point2.x;++x) { pdc->SetPixel(x,int(y+0.5),RGB(0,255,0)); y+=k; } } if (abs(k)>=1)//斜率绝对值大于等于1时,以y步进 { for (;y<point2.y;++y) { pdc->SetPixel((int)(x+0.5),y,RGB(0,255,0)); x+=1/k; } } ReleaseDC(pdc); }
相关文章推荐
- 计算机图形学(1)——直线生成算法的实现
- 计算机图形学——直线生成算法
- 计算机图形学—DDA直线生成算法
- 计算机图形学-直线的生成算法
- 【计算机图形学】基本图形元素:直线的生成算法
- 计算机图形学 - 全斜率Bresenham直线生成算法
- java画直线算法 DDA 计算机图形学
- 计算机图形学——生成直线的DDA算法
- 计算机图形学(二)输出图元_6_OpenGL曲线函数_3_椭圆生成算法
- 【算法】计算机图形学的一些经典小题:判断点在多边形内,随机生成三角形内的点,判断两个矩形是否相交等
- 计算机图形学-基本图素的生成算法和图形填充
- 计算机图形学 – 椭圆的中点生成算法
- 计算机图形学:3种画直线算法(转)
- 计算机图形学——光栅图形学直线算法简介
- 计算机图形学中直线连接算法的Javascript实现
- 计算机图形学基础 : 基本图形生成算法之直线的扫描转换
- 计算机图形学(二)输出图元_6_OpenGL曲线函数_1_圆生成算法
- 计算机图形学 - 圆的中点生成算法验证
- [计算机图形学] 基于C#窗口的Bresenham直线扫描算法、种子填充法、扫描线填充法模拟软件设计(一)
- 计算机图形学 - 球体、环、椭球体生成算法