您的位置:首页 > 理论基础

计算机图形学之--直线生成算法(一)

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++实现

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: