前置知识:象限

有了标准斜率标准斜率[202302141842] ,不管什么方向、什么斜率的直线,我们都能将它们通过对称、翻转等操作转换成标准斜率,然后再去绘制直线。下图给出了8种情况的直线:

Untitled

通过与直线 y = x , y = -x 进行比较,我们发现有4条直线(用黄色标出)是“陡的”,具体来说它们和水平x轴的夹角超过了45度。

Untitled

我们可以通过计算直线的斜率来判断直线是不是陡的。具体来说:

斜率 k = |dy| / |dx|,

当 |k| > 1,直线是陡的;

当 |k| < 1,直线不是陡的;

当 |k| = 1,直线方程为 y = x 或者 y = -x。

比如下图中的线段A’’B’’不是陡的,这意味着 x 的增加量总是大于 y 的增加量,可以记作**△x > △y,**也可以记作是 dx > dy

Untitled

下面的代码能够判断一条直线是不是“陡的”。在代码中,我们不需要用dy 去除以 dx,只需要比较它们的差值。

using namespace std;
void line_bresenham(int x0, int y0, int x1, int y1, TGAImage& image, TGAColor& color)
{
	int dx = x1 - x0; // 两点的水平距离
	int dy = y1 - y0; // 两点的垂直距离
	bool is_steep = false; // 标记一条直线是不是"陡的"。默认值是false(因为我们以标准斜率为标准,它并不陡)
	
	if(abs(dx) < abs(dy))// 判断直线斜率是否超过45度
	{
			is_steep = true;
			// 将直线按照 y = x 或者 y = -x进行对称
			swap(x0, y0);
			swap(x1, y1);
	}
}