我有以下代码:
#include <stdlib.h>
void Painter::draw_line(Point point_1, Point point_2, Color color)
{
// Bresenham Algorithm
if (point_1.x > point_2.x || (point_1.x == point_2.x && point_1.y > point_2.y))
{
swap(&point_1, &point_2);
}
int dx = abs((int)point_2.x - (int)point_1.x);
int sx = point_1.x < point_2.x ? 1 : -1;
int dy = abs((int)point_2.y - (int)point_1.y);
int sy = point_1.y < point_2.y ? 1 : -1;
int err = dx + dy;
while ((point_1.x != point_2.x) && (point_1.y != point_2.y))
{
draw_pixel(point_1, color);
if (2 * err >= dy)
{
err += dy;
point_1.x += sx;
}
if (2 * err <= dx)
{
err += dx;
point_1.y += sy;
}
}
}
它应该计算将形成一条线的像素的位置。
上面的代码不能正常工作-行总是水平的。我发现abs
函数有问题。当我替换以下行:
int dx = abs((int)point_2.x - (int)point_1.x);
int sx = point_1.x < point_2.x ? 1 : -1;
int dy = abs((int)point_2.y - (int)point_1.y);
int sy = point_1.y < point_2.y ? 1 : -1;
int err = dx + dy;
int dx = (int)point_2.x - (int)point_1.x >= 0 ? (int)point_2.x - (int)point_1.x : (int)point_1.x - (int)point_2.x;
int sx = point_1.x < point_2.x ? 1 : -1;
int dy = (int)point_2.y - (int)point_1.y <= 0 ? (int)point_2.y - (int)point_1.y : (int)point_1.y - (int)point_2.y;
int sy = point_1.y < point_2.y ? 1 : -1;
int err = dx + dy;
程序工作正常!
为什么有abs
的版本不能正常工作?
作为参考,这里是我的Point
结构体:
struct Point {
Point(uint16_t x, uint16_t y)
{
this->x = x;
this->y = y;
}
uint16_t x;
uint16_t y;
};
发现错误!
int dx = abs((int)point_2.x - (int)point_1.x);
int sx = point_1.x < point_2.x ? 1 : -1;
int dy = -abs((int)point_2.y - (int)point_1.y);
int sy = point_1.y < point_2.y ? 1 : -1;
int err = dx + dy;
第三个表达式前面缺少一个负号。