画线算法:已知点A(x1,y1)和点B(x2,y2),画出点A和点B之间的所有的点。
1、DDA(数值微分)算法
已知直线方程可以表示为 y = kx + b
以下公式仅考虑 |k|<=1(这种情况下,直线在y轴方向增长的速度小等于在x轴方向的速度)
已知:
y1 = kx1 + b
y2 = kx2 + b
因为
x2 = x1 + 1
所以
y2 = k(x1 + 1) + b
y2 - y1 = k(x1 + 1) + b - (kx1 + b) = k
可以推导出,x,每递增1,y递增k
增量算法
在一个迭代算法中,如果每一步中的x和y值均由上次计算得到的值加上一个增量来得到,这种算法为增量算法。
DDA算法是一种增量算法,在 |k|<=1 的情况下,Δx =1,Δy = k。
实现代码如下
void DrawLine_DDA(int x1,int y1,int x2,int y2){
int dx = x2 - x1;
int dy = y2 - y1;
int step = 0;
if(Math.Abs(dy) > Math.Abs(dx)){
step = Math.Abs(dy);
}
else{
step = Math.Abs(dx);
}
float stepX = 1.0f * dx / step;
float stepY = 1.0f * dy / step;
int i = 0;
float x = x1;
float y = y1;
DrawPoint((int)x, (int)y);
while ((i++)<step){
x += stepX;
y += stepY;
DrawPoint((int)x, (int)(y