ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-06-12 10:31:02  阅读:512  来源: 互联网

标签:MFC 线法 图形学 x1 y1 y0 tempy tempx x0


第一部分 原理

函数: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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有