第一部分 原理
函数: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); } } } }
第三部分 效果