﻿
// Ejemplo de uso: drawLine(g, 10, 10, 60, 19);
// Funciona si |yQ - yP| <= |xQ - xP|
void drawLine(Graphics g, int xP, int yP, int xQ, int yQ)
{	
	int dx, dy, x, y, yInc;
	if (xP >= xQ)
 	{	
 		if (xP == xQ) // Evita dividir entre dx = xQ - xP
			return;
		// xP > xQ, intercambiar P y Q
		int t = xP; 
		xP = xQ; 
		xQ = t;
		t = yP; 
		yP = yQ; 
		yQ = t;
	}
	// Ahora xP < xQ
	if (yQ >= yP)
	{
	 	yInc = 1; 
	 	dy = yQ - yP;
	}
	else 
	{
	 	yInc = -1; 
	 	dy = yP - yQ;
	}
	dx = xQ - xP;
	int dy4 = dy * 4;
	int v = dy4 - dx;
	int dx2 = 2 * dx;
	int dy2 = 2 * dy;
	int dy4Minusdx2 = dy4 - dx2;
	int dy4Minusdx4 = dy4Minusdx2 - dx2;
	drawPixel(g, xP, yP);
	y = yP;
	for (x = xP; x < xQ - 1;)
	{
		if (v < 0)								// Patrón 1
		{	
			drawPixel(g, ++x, y);
			drawPixel(g, ++x, y);
			v += dy4;							
		}
		else
			if (v < dx2)						
			{
				if (v < dy2)					// Patrón 2
				{	
					drawPixel(g, ++x, y);	 	
					drawPixel(g, ++x, y += yInc);
					v += dy4Minusdx2;			
				}
				else							// Patrón 3
				{	
					drawPixel(g, ++x, y += yInc);
					drawPixel(g, ++x, y);
					v += dy4Minusdx2;			
				}
			}
			else								// Patrón 4, 
			{	
				drawPixel(g, ++x, y += yInc);
				drawPixel(g, ++x, y += yInc);
				v += dy4Minusdx4;				
			}
		}
		if (x < xQ)
			drawPixel(g, xQ, yQ);
}
	
