abs(int) 函数无法按我预期工作



我有以下代码:

#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;

第三个表达式前面缺少一个负号。

最新更新