DDA,中值画线法,BRESENHAM画线法(任意斜率)

DDA

void CLzsdView::OnDda() 
{
	// TODO: Add your command handler code here
	CDC*pDC=GetDC();//得到绘图类指针
	RedrawWindow();//重绘窗口
    int x0,y0,x1,y1;//(x0,y0)为直线的起点,(x1,y1)为直线的终点
	float dx,dy,k,x,y;
	x0=100,y0=100,x1=300,y1=500;
	dx=x1-x0;
	dy=y1-y0;
	k=dy/dx;	
	if(abs(k) <= 1)
	{
		y=y0;
		for(int i=x0;i<=x1;i++)
		{
			pDC->SetPixel(i,int(y+0.5),RGB(255,0,0));
			y=y+k;
		}
	}else{
		k = 1/k;
		x = x0;
		for(int i = y0; i <= y1; i++){
			pDC->SetPixel(int(x+0.5),i,RGB(255,0,0));
			x=x+k;
		}
	}
	
}

中值画线法

void CLzsdView::OnMid() 
{
	// TODO: Add your command handler code here
	CDC*pDC=GetDC();//得到绘图类指针
	   //RedrawWindow();//重绘窗口
	   int x0,y0,x1,y1;//(x0,y0)为直线的起点,(x1,y1)为直线的终点
	   int a,b,delta1,delta2,d,x,y;
	   x0=100,y0=100,x1=200,y1=400;
	   a=y0-y1;
	   b=x1-x0;
	   int cx = (b >= 0 ? 1 : (b = -b, -1));
	   int cy = (a <= 0 ? 1 : (a = -a, -1));
	   x=x0;
	   y=y0;
	   pDC->SetPixel(x,y,RGB(0,0,255));//SetPixel为CDC类里面的画点函数,具体参数

	   if(-a <= b){
			d=2*a+b;
			delta1=2*a;
			delta2=2*(a+b);
			while(x != x1)
			{
				if(d < 0)
				{
					y += cy, d += delta2;
				}else{
					d += delta1;
				}
				x += cx;
				pDC->SetPixel(x,y,RGB(0,255,0));
			}
	   }else{
		d = 2 * b + a; 
		delta1 = 2 * b;
		delta2 = 2 * (a + b);
		while(y != y1) 
		{ 
			if(d < 0)
				d += delta1; 
			else 
				x += cx, d += delta2; 
			y += cy; 
			pDC->SetPixel(x,y,RGB(0,255,0));
		} 
	}
       
}

BRESENHAM画线法

void CLzsdView::OnBre() 
{
	// TODO: Add your command handler code here
		CDC*pDC=GetDC();//得到绘图类指针
	   //RedrawWindow();//重绘窗口
	   int x,y,x0,y0,x1,y1;//(x0,y0)为直线的起点,(x1,y1)为直线的终点
	   x0=100,y0=100,x1=200,y1=500;
		x = x0;
		y = y0;
		int dy = abs(y1-y0);
		int dx = abs(x1-x0);
		int s1 = x1 > x0?1:-1;
		int s2 = y1 > y0?1:-1;
		bool interchage = false;
		if(dy>dx){
			int temp = dx;
			dx = dy;
			dy = temp;
			interchage = true;
		}
		int p = 2 * dy - dx;
		for(int i = 0; i < dx; i++)
		{
			pDC->SetPixel(x,y,RGB(0,0,255));
			if (p >= 0)
			{
				if (!interchage)		// 当斜率 < 1 时,选取上下象素点
					y += s2;
				else					// 当斜率 > 1 时,选取左右象素点
					x += s1;
				p -= 2 * dx;
			}
			if (!interchage)
				x += s1;				// 当斜率 < 1 时,选取 x 为步长
			else
				y += s2;				// 当斜率 > 1 时,选取 y 为步长
			p += 2 * dy;
		}
}
发布了68 篇原创文章 · 获赞 148 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_43274298/article/details/103344518