其他分享
首页 > 其他分享> > 计算机图形学中点画线法(MFC)

计算机图形学中点画线法(MFC)

作者:互联网

第一部分 原理

函数: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);
			}

		}
	}
}

第三部分 效果
在这里插入图片描述

标签:MFC,线法,图形学,x1,y1,y0,tempy,tempx,x0
来源: https://blog.csdn.net/qq_46877697/article/details/117335837