核心功能:给定直线两端点和,画出该直线。
1、数值微分法(DDA)
核心思想:找到一个增长最快的方向,每次增加1,其余方向增加对应的长度。
数学原理:
直线的微分方程:
其中为:
情况A:,即的情况:
情况B:,即的情况:
对于不足1的增量,可以使用round()。(注意round(x)=(int)(x+0.5))。
特点:增量算法,直观、易实现。
缺点:浮点运算,取整费时,且不利于硬件实现。
openGL代码实现:
void DDAdrawLine()
{
int x0 = m_iStartX, y0 = m_iStartY, x1 = m_iEndX, y1 = m_iEndY;
int dx = x1 - x0;
int dy = y1 - y0;
int eps, k;
float xIncrement, yIncrement;
float x = x0, y = y0;
if (abs(dx) > abs(dy)) eps = abs(dx);
else eps = abs(dy);
xIncrement = float(dx) / float(eps);
yIncrement = float(dy) / float(eps);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0, 0);
glBegin(GL_POINTS);
glVertex3f(x0, y0, 0);
for (int k = 0; k < eps; k++)
{
x += xIncrement;
y += yIncrement;
glVertex3f(x, y, 0);
}
glVertex3f(x1, y1, 0);
glEnd();
}
2、中点画线算法
核心思想:假定直线斜率K<1,且易确定电量像素点,M为中点,Q为交点,需确定下一个点亮的像素。根据其对中点的相对位置易求。
数学原理:给定直线两端点和,该直线方程可表示为:
设处中点为,则:
因为只用P的符号作为判断,为了只包含整数运算,可取2P代替P:
若,取,;
若,取,;
3、Bresenham算法
基本原理:(假定直线线段)
d=d+k,当d>1时d=d-1。当d<0.5时取(x+1,y),否则取(x+1,y+1)。
优化1:令e=d-0.5,每走一步e=e+k
优化2:用来替换e。
e初=,每走一步有,如果e>0,y+1且