斜率
k
=
d
y
/
d
x
k = dy / dx
k=dy/dx
- 在 d x dx dx、 d y dy dy间选取大的那个作为步进方向
- 斜率 ∣ k ∣ ≤ 1 |k| \le 1 ∣k∣≤1时是典型情况,即上图
- 由1知,斜率 k > 1 k > 1 k>1时由1知选择 y y y轴为步进方向
- 步进方向上每次步进1个单位
由4可知,步进1的本质是,以x方向为例,是步进 d x / d x dx/dx dx/dx,相应地y步进 d y / d x dy/dx dy/dx,即整个 d x dx dx和 d y dy dy都得分成n份,并且这个n可以使步进方向那个轴分完n份之后每一份大小为1。
考虑斜率会绕在斜率 ∣ k ∣ ≤ 1 |k| \le 1 ∣k∣≤1这种情况中,迁移到别的情况还得稍加思考,所以不要考虑斜率,直接考虑步进情况。
另一个好处就是只需要考虑步进多少次,而不需要判断输入的x0
和x1
谁大,从小的那端按1递增(如果x为步进轴的话)
#include <graphics.h>
#include <conio.h>
#include <math.h>
void DDALine(int x0, int y0, int x1, int y1, int color) {
float x = x0, y = y0;
int step = abs(x1 - x0) > abs(y1 - y0) ? abs(x1 - x0) : abs(y1 - y0);
float step_x = (float)(x1 - x0) / step;
float step_y = (float)(y1 - y0) / step;
for (int i = 0; i < step; ++i) {
putpixel(x, y, color);
x += step_x;
y += step_y;
}
}
int main()
{
initgraph(640, 480);
DDALine(110, 310, 10, 10, RED);
DDALine(0, 20, 300, 100, RED);
DDALine(300, 100, 20, 10, BLUE);
_getch();
closegraph();
return 0;
}
要注意的是
float step_x = (float)(x1 - x0) / step;
float step_y = (float)(y1 - y0) / step;
这一行必须有显式类型转换,否则会因类型转换的问题产生错误