中点画线法
在DDA算法中已经将乘法运算改进到了加法运算,但加法运算的时候进行的都是浮点类型的运算,运算结束后还要进行取证处理。中点画线算法就是将浮点类型的运算改进成为整数的运算。该算法采用的是直线的一般式方程。还是以一种特殊情况为例,0<k<1每次在x方向上移动1个像素,y方向上移动一个或者不移动。所以可以通过判断下一个点与y+1和y的距离大小来决定y是否加1。可以通过判断下一个点的终点坐标也就是(x+1,y+0.5)到底是在直线的上方还是下方。该直线将平面分为三部分直线上方,在直线上,在直线下方。也就是将坐标(x+1,y+0.5)带入直线的一般式方程,若方程值小于0,即中点在直线下方,y取y+1;若方程值大于0,即中点在直线上方,y不变。就是判断A(x+1)+B(y+0.5)+C的大小。设这个距离为d因为Ax+By+C=0,即d的初始值为A+0.5B。为了把它变成整数加法可以给他扩大2倍。2d=2A+B。d<0时2d=2d+2A+2B;d>0时,2d=2d+2A这样中点画线算法就将算法优化到了整数的加法。下面是我所写的中点画线算法,还不够精炼,,后续有时间会进行改进
计算机图形学几个比较经典的算法我已经发到了https://download.csdn.net/download/gygygyyyyyy/12550827
如果有需要的话可以下载哦
//中点画线函数
double x = x1, y = y1;
double d, A, B, i, deta1, deta2;
A = y1 - y2; B = x2 - x1;
if (Math.Abs(x1 - x2) > Math.Abs(y1 - y2))//斜率小于1
{
if (y1 - y2 < 0)
{
if (x2 - x1 < 0) //第二象限k<1
{
d = B - 2 * A;
deta1 = - 2 * A;
deta2 = 2 * ((-1) * A + B);
for (i = 1; i < Math.Abs(x1 - x2); i++)
{
if (d < 0)
{
d = d + deta1;
}
else
{
d = d + deta2; y++;
}
x--;
mydraw.SetPixel((int)x, (int)y, c);
}
else //第一象限k<1
{
d = 2 * A + B;
deta1 = 2 * A;
deta2 = 2 * (A + B);
for (i = 1; i < Math.Abs(x1 - x2); i++)
{
if (d < 0)
{
d = d + deta2; y = y + 1 ;
}
else
{
d = d + deta1;
}
x = x + 1;
mydraw.SetPixel((int)x, (int)y, c);
}
}
}
else //第三,四象限k<1
{
if (x1 > x2) //第三象限
{
d = - 2 * A - B;
deta1 = -2 * A;
deta2 = (-2) * (A + B);
for (i = 1; i < Math.Abs(x1 - x2); i++)
{
if (d < 0)
{
d = d + deta2;y--;
}
else
{
d = d + deta1;
}
x --;
mydraw.SetPixel((int)x, (int)y, c);
}
}
else //第四象限
{
d = 2 * A - B;
deta1 = 2 * A;
deta2 = 2 * (A - B);
for(i = 1; i < Math.Abs(x1 - x2); i++)
{
if (d < 0)
{
d = d + deta1;
}
else
{
d = d + deta2; y --;
}
x ++;
mydraw.SetPixel((int)x, (int)y, c);
}
}
}
}
else //k>1
{
if (y1 - y2 < 0) //第一,二象限k>1
{
if (x1 < x2) //第一象限k>1
{
d = 2 * B + A;
deta1 = 2 * B;
deta2 = 2 * (A + B);
for (i = 1; i < Math.Abs(y1 - y2); i++)
{
if (d < 0)
{
d = d + deta1;
}
else
{
d = d + deta2; x ++;
}
y ++;
mydraw.SetPixel((int)x, (int)y, c);
}
}
else //第二象限k>1
{
d = 2 * B - A;
deta1 = 2 * B;
deta2 = 2 * (-A + B);
for (i = 1; i < Math.Abs(y1 - y2); i++)
{
if (d < 0)
{
d = d + deta2; x = x - 1;
}
else
{
d = d + deta1;
}
y ++ ;
mydraw.SetPixel((int)x, (int)y, c);
}
}
}
else //第三,四象限k>1
{
if (x1 > x2) //第三象限 k>1
{
d = -A - 2 * B;
deta1 = -2 * B;
deta2 = -2 * (B + A);
for (i = 1; i < Math.Abs(y1 - y2); i++)
{
if (d < 0)
{
d = d + deta1;
}
else
{
d = d + deta2;x --;
}
y --;
mydraw.SetPixel((int)x, (int)y, c);
}
}
else //第四象限 k<1
{
d = A - 2 * B;
deta1 = -2 * B;
deta2 = 2 * (A - B);
for (i = 1; i < Math.Abs(y1 - y2); i++)
{
if (d < 0)
{
d = d + deta2; x ++;
}
else
{
d = d + deta1;
}
y --;
mydraw.SetPixel((int)x, (int)y, c);
}
}
}
}