只画斜率小于 1 的直线
float deltax = end.x - begin.x;
float deltay = end.y - begin.y;
float k = deltay / deltax;
float d = 0;
float y = begin.y;
for (int i = begin.x; i <= end.x; i++)
{
Vertex v(glm::vec3(i, y, 1));
DrawPoint(v);
d = d + k;
if (d >= 1)
{
d -= 1;
}
if (d >= 0.5f)
{
y += 1;
}
}
在视频看到的算法。 然后ppt 上这么写的。。但是画出来不对。 为啥呢 ?
那你需要把视频好好看看,ppt上面也可能是错的。
我以前写的Bresenham算法
// Bresenham算法
void lineBresenham(HDC hDC, int xa, int ya, int xb, int yb, COLORREF crColor)
{
int dx = abs(xb - xa), dy = abs(yb - ya); // 这两个值只与绝对值有关
int x = xa, y = ya;
int xIncrement, yIncrement, loop; // 步进量/累加变量
bool interchange;
int p;
if (xb - xa > 0)
xIncrement = 1;
else if (xb - xa == 0)
xIncrement = 0;
else
xIncrement = -1;
if (yb - ya > 0)
yIncrement = 1;
else if (yb - ya == 0)
yIncrement = 0;
else
yIncrement = -1;
#ifdef _DEBUG
int count = 0;
printf("Bresenham算法:起始点(%03d, %03d) 终止点(%03d, %03d)\n", xa, ya, xb, yb);
RecordPixel(xa, ya, hDC, crColor, count);
#else
SetPixel(hDC, x, y, crColor); // 绘制初始点
#endif // _DEBUG
// 处理特殊情况的直线绘制
if (dy == 0)
{// 水平线
for (loop = 0; loop < dx; loop++)
{
x += xIncrement;
#ifdef _DEBUG
RecordPixel(x, y, hDC, crColor, count);
#else
SetPixel(hDC, x, y, crColor);
#endif // _DEBUG
}
}
else if (dx == 0)
{// 竖直线
for (loop = 0; loop < dy; loop++)
{
y += yIncrement;
#ifdef _DEBUG
RecordPixel(x, y, hDC, crColor, count);
#else
SetPixel(hDC, x, y, crColor);
#endif // _DEBUG
}
}
else if (dx == dy)
{// 或各个象限的角平分线
for (loop = 0; loop < dx; loop++)
{
x += xIncrement;
y += yIncrement;
#ifdef _DEBUG
RecordPixel(x, y, hDC, crColor, count);
#else
SetPixel(hDC, x, y, crColor);
#endif // _DEBUG
}
}
// 处理一般情形下的直线绘制
else
{
// 若斜率绝对值小于1,不需交换
if (dx > dy)
interchange = false;
// 若斜率绝对值大于1,交换dx和dy执行计算,后续步进累加时需要做相应变更
else
{
int temp = dx;
dx = dy;
dy = temp;
interchange = true;
}
p = - dx;
for (loop = 0; loop < dx; loop++)
{
// 首先处理步进变量
if (interchange)
y += yIncrement; // 若交换了x和y则每次循环步进y值
else
x += xIncrement; // 若没有交换,则每次循环步进x值
p += 2 * dy; // 因为每次循环都需要加上2dy,初始值时需要相加再这里加上
if (p >= 0)
{// 此时需要步进另一个量
if (interchange)
x += xIncrement;
else
y += yIncrement;
p -= 2 * dx;
}
#ifdef _DEBUG
RecordPixel(x, y, hDC, crColor, count);
#else
SetPixel(hDC, x, y, crColor); // 画点
#endif // _DEBUG
}
}
}
你这叫dda 算法吧