第一部分 原理
函数:F(x,y)=ax+by+c=0;
(x0,y0),(x1,y1)是两个端点
1.当K>1时,y作为自变量,求x,则:
a=y0-y1
b=x1-x0
d0=2b+a;
从(x0,y0)起点开始:每次y++
若d0>0,则取中点左边的点,下一个点的d=d0+2(a+b);
d0<0,则取中点右边的点,下一个点的d=d0+2b;
重复直到终点。(PS:竖着看图)
例子:
从(1,0)—>(4,7),a=-7,b=3,c=7;d0=-1,则终点在直线下方,所以取左边点。。。。。。。
2.当0<K<1时,x作为自变量,求y,则:
a=y0-y1
b=x1-x0
d0=2a+b;
从(x0,y0)起点开始:每次x++
若d0>0,则取中点下边的点,下一个点的d=d0+2a;
d0<0,则取中点上边的点,下一个点的d=d0+2(a+b);
重复直到终点。(PS:竖着看图)
3.当-1<K<0时,x作为自变量,求y,则:
a=y1-y0
b=x0-x1
d0=2a-b;
从(x1,y1)起点开始:每次x++
若d0>0,则取中点下边的点,下一个点的d=d0+2(a-b);
d0<0,则取中点上边的点,下一个点的d=d0+2a;
重复直到终点。
4.当K<-1时
a=y1-y0
b=x0-x1
d0=a-2b;
从(x1,y1)起点开始:每次x++
若d0>0,则取中点下边的点,下一个点的d=d0-2b;
d0<0,则取中点上边的点,下一个点的d=d0+2a-2b;
第二部分 代码(MFC)
void CMyPaneDoc::MIDline(CClientDC * DCPoint)
{//中点画线
int x0, y0, x1, y1, flag,d;
int tempx,tempy;
DCPoint->SetROP2(R2_COPYPEN);//绘图方法为直接
//直线端点由鼠标确定后存放在group[0]、group[1]
//起点
x0 = group[0].x; y0 = group[0].y;
//终点
x1 = group[1].x; y1 = group[1].y;
//当两个点重合时,不画线
if (x0 == x1&&y0 == y1)return;
//当垂直线的时候
if (x0 == x1)
{
if (y0 > y1)
{//交换y0与y1的值
tempy = y0; y0 = y1; y1 = tempy;
}
for (tempy = y0; tempy <= y1; tempy++)
{
DCPoint->SetPixel(x0, tempy, m_crColor);
}
return;
}
//水平线的时候
if (y0 == y1)
{
if (x0 > x1)
{//交换y0与y1的值
tempx = x0; x0 = x1; x1 = tempx;
}
for (tempx = x0; tempx <= x1; tempx++)
{
DCPoint->SetPixel(tempx, y0, m_crColor);
}
return;
}
//斜率在0-1之间的
if (y1 - y0 < x1 - x0&&y1 - y0>0)
{
int a = y0 - y1, b = x1 - x0;
int delta1=2*a, delta2=2*a+2*b;
d = 2 * a + b;
tempx = x0, tempy = y0;
DCPoint->SetPixel(tempx, tempy, m_crColor);
while (tempx <= x1)
{
if (d < 0)
{
tempx++;
tempy++;
d += delta2;
DCPoint->SetPixel(tempx, tempy, m_crColor);
}
else
{
tempx++;
d += delta1;
DCPoint->SetPixel(tempx, tempy, m_crColor);
}
}
}
//斜率大于1的情况
if (y1 - y0 >x1 - x0&&x1 - x0>0)
{
int a = y0 - y1, b = x1 - x0;
int delta1 = 2 * b, delta2 = 2 * a + 2 * b;
d = 2 * b+ a;
tempx = x0, tempy = y0;
DCPoint->SetPixel(tempx, tempy, m_crColor);
while (tempx <= x1)
{
if (d < 0)
{
tempy++;
d += delta1;
DCPoint->SetPixel(tempx, tempy, m_crColor);
}
else
{
tempx++;
tempy++;
d += delta2;
DCPoint->SetPixel(tempx, tempy, m_crColor);
}
}
}
//斜率小于0大于-1的情况
if (abs(y1 - y0) <abs(x1 - x0)&&y1 - y0>0&&x1-x0<0)
{
int a = y1 - y0, b = x0 - x1;
int delta1 = 2 * a, delta2 = 2 * a - 2 * b;
d = 2 * a - b;
tempx = x1, tempy = y1;
DCPoint->SetPixel(tempx, tempy, m_crColor);
while (tempx <= x0)
{
if (d < 0)
{
tempx++;
d += delta1;
DCPoint->SetPixel(tempx, tempy, m_crColor);
}
else
{
tempx++;
tempy--;
d += delta2;
DCPoint->SetPixel(tempx, tempy, m_crColor);
}
}
}
//斜率小于-1的情况
if (abs(y1 - y0) >=abs(x1 - x0) && y1 - y0>0 && x1 - x0<0)
{
int a = y1 - y0, b = x0 - x1;
int delta1 = -2 * b, delta2 = 2 * a - 2 * b;
d = a-2*b;
tempx = x1, tempy = y1;
DCPoint->SetPixel(tempx, tempy, m_crColor);
while (tempy >= y0)
{
if (d <0)
{
tempx++;
tempy--;
d += delta2;
DCPoint->SetPixel(tempx, tempy, m_crColor);
}
else
{
tempy--;
d += delta1;
DCPoint->SetPixel(tempx, tempy, m_crColor);
}
}
}
}
第三部分 效果