Computer graphics MFC realizes numerical differential line drawing, midpoint line drawing, and Bresenham line drawing

  • DDA draws straight lines

DDALine(CDC* pDC, int x1, int y1, int x2, int y2, COLORREF color)
{
    
    
	double dx, dy, e, x, y;
	dx = x2 - x1;
	dy = y2 - y1;
	e = (fabs(dx) > fabs(dy)) ? fabs(dx) : fabs(dy);
	dx /= e; dy /= e;
	x = x1;
	y = y1;
	for (int i = 1; i <= e; i++)
	{
    
    
		
		pDC->SetPixel(int(x + 0.5), int(y + 0.5), color);
		x += dx;
		y += dy;
	}
}
  • Draw a straight line at the midpoint
MPLine(CDC* pDC, int x0, int y0, int x1, int y1, COLORREF color)
{
    
    
	// TODO: 在此处添加实现代码.
	int a, b, deta1, deta2, d, x, y;
	//没有斜率的时候直接绘制
	if (x0 == x1)
	{
    
    
		if (y0 < y1)
		{
    
    
			for (int i = y0; i <= y1; i++)
			{
    
    
				pDC->SetPixel(x0, i, color);
			}
		}
		else
		{
    
    
			for (int i = y1; i <= y0; i++)
			{
    
    
				pDC->SetPixel(x0, i, color);
			}

		}
		return;
	}
	//m为真说明斜率绝对值小于等于1
	BOOL m = (fabs(y1 - y0) <= fabs(x1 - x0));
	//用户从起点在右
	if (x0 > x1)
	{
    
    
		d = x0; x0 = x1; x1 = d;
		d = y0; y0 = y1; y1 = d;
	}
	a = y0 - y1;
	b = x1 - x0;
	x = x0;
	y = y0;
	//pDC->SetPixel(x, y, color);
	//k绝对值小于等于1
	if (m)
	{
    
    
		//也就是k小于等于1大于0
		if (y0 < y1)
		{
    
    
			d = 2 * a + b;
			deta1 = 2 * a;
			deta2 = 2 * (a + b);
			while (x < x1)
			{
    
    
				if (d < 0)
				{
    
    
					x++;
					y++;
					d += deta2;
				}
				else {
    
    
					x++;
					d += deta1;
				}
					pDC->SetPixel(x, y, color);
				//	pDC->SetPixel(x, y, color);
			}
		}
		//也就是k大于等于-1小于0
		else
		{
    
    
			d = 2 * a - b;
			deta1 = 2 * a;
			deta2 = 2 * (a - b);
			while (x < x1)
			{
    
    
				if (d < 0)
				{
    
    
					x++;
					d += deta1;
				}
				else
				{
    
    
					x++;
					y--;
					d += deta2;
				}
					pDC->SetPixel(x, y, color);
				//pDC->SetPixel(x, y, color);
			}
		}
	}
	//k绝对值大于等于1
	else
	{
    
    
		//k大于等于1到正无穷
		if (y0 < y1)
		{
    
    
			d = a + 2 * b;
			deta1 = 2 * b;
			deta2 = 2 * (a + b);
			while (y < y1)
			{
    
    
				if (d < 0)
				{
    
    
					y++;
					d += deta1;
				}
				else
				{
    
    
					y++;
					x++;
					d += deta2;
				}
					pDC->SetPixel(x, y, color);
				//pDC->SetPixel(x, y, color);
			}
		}
		//k大于等于-1到负无穷
		else
		{
    
    
			d = a - 2 * b;
			deta1 = -2 * b;
			deta2 = 2 * (a - b);
			while (y > y1)
			{
    
    
				if (d < 0)
				{
    
    
					y--;
					x++;
					d += deta2;
				}
				else
				{
    
    
					y--;
					d += deta1;
				}
					pDC->SetPixel(x, y, color);
			}
		}
	}
  • Bresenham draws straight lines
BHLine(CDC* pDC, int x1, int y1, int x2, int y2, COLORREF color)
{
    
    
	// TODO: 在此处添加实现代码.
	int a, b, delta1, delta2, d, x, y;
	//两个端点x值相等
	if (x1 == x2)
	{
    
    
		if (y1 < y2)
		{
    
    
			for (int i = y1; i <= y2; i++)
				pDC->SetPixel(x1, i, color);
		}
		else
		{
    
    
			for (int i = y2; i <= y1; i++)
				pDC->SetPixel(x1, i, color);
		}
		return;
	}
	//如果斜率的绝对值大于1,m为FALSE,反之为TRUE;
	BOOL m = (fabs(y2 - y1) <= fabs(x2 - x1));
	if (x1 > x2)
	{
    
    
		d = x1; x1 = x2; x2 = d;
		d = y1; y1 = y2; y2 = d;
	}
	a = y2 - y1;
	b = x2 - x1;
	x = x1;
	y = y1;
	pDC->SetPixel(x, y, color);
	//绝对值小于等于1
	if (m)
	{
    
    
		//斜率0-1
		if (y1 <= y2)
		{
    
    
			d = 2 * a - b;//2*(y2 - y1)-(x2 - x1)
			delta1 = 2 * a;  //d<0
			delta2 = 2 * (a - b);  //d>=0	
			while (x < x2)
			{
    
    
				if (d < 0)
				{
    
    
					x++; d += delta1;
				}
				else
				{
    
    
					x++; y++; d += delta2;
				}
				pDC->SetPixel(x, y, color);
			}
		}
		//斜率-1-0
		else
		{
    
    
			d = -2 * a - b;//-2*(y2 - y1)-(x2 - x1)
			delta1 = -2 * a;
			delta2 = -2 * (a + b);
			while (x < x2)
			{
    
    
				if (d < 0)
				{
    
    
					x++; d += delta1;
				}
				else
				{
    
    
					x++; y--; d += delta2;
				}
				pDC->SetPixel(x, y, color);
			}
		}
	}
		//绝对值大于1
	else
	{
    
    
		//斜率>1
		if (y1 < y2)
		{
    
    
			d = 2 * b - a;
			delta1 = 2 * b;
			delta2 = 2 * (b - a);
			while (y < y2)
			{
    
    
				if (d < 0)
				{
    
    
					y++; d += delta1;
				}
				else
				{
    
    
					x++; y++; d += delta2;
				}
					pDC->SetPixel(x, y, color);
			}
		}
		//斜率 小于-1到负无穷
		else
		{
    
    
			d = 2 * b + a;
			delta1 = 2 * b;
			delta2 = 2 * (a + b);
			while (y > y2)
			{
    
    
				if (d < 0)
				{
    
    
					y--; d += delta1;
				}
				else
				{
    
    
					x++; y--; d += delta2;
				}
					pDC->SetPixel(x, y, color);
			}
		}
	}

}

Guess you like

Origin blog.csdn.net/qq_45549336/article/details/109590527