
import java.applet.*;
import java.awt.*;
import java.awt.image.*;

public class MainClass extends Applet
{
	final int 	W=320,
				H=240;
	Image img = null;
	MemoryImageSource mis = null;	
	
	public void init()
	{
		this.setSize(W,H);
		this.setBackground(Color.GRAY);
		
		int pixels[] = new int[W*H];		
		for (int i=0; i < W*H; i++)
			pixels[i] =  255 << 24 | 255 << 16 | 255 << 8 | 255;
		
		int color[] = new int[3];
		color[0] = 200;	color[1] = 200;	color[2] = 200;
		pixels = filledPolygon(	new Point(50,50), 
								new Point(200,100),
								new Point(70,220),
								color, pixels);
		mis = new MemoryImageSource(W, H, pixels, 0, W);		
	    img = createImage(mis);		    	    
	}
	
	public void paint (Graphics g)
	{		
		g.drawImage(img,0,0,this);		
	}
	
	//-----------------------------------------------------------------------
	// Draw filled polygon
	//-----------------------------------------------------------------------
	public int[] filledPolygon(	Point fpP1,
								Point fpP2,
								Point fpP3,
								int fpColor[],
								int fpPixels[])
	{
		// Order vertices
		if (fpP1.y > fpP2.y)
		{
			Point temp = fpP1;
			fpP1 = fpP2;
			fpP2 = temp;
		}		
		if (fpP2.y > fpP3.y)
		{
			Point temp = fpP2;
			fpP2 = fpP3;
			fpP3 = temp;
		}		
		if (fpP1.y > fpP3.y)
		{
			Point temp = fpP1;
			fpP1 = fpP3;
			fpP3 = temp;
		}
		
		float CEdgeX = fpP1.x;
		float CEdgeDeltaY = fpP3.y - fpP1.y;
		float CEdgeDeltaX = fpP3.x - fpP1.x;
		float CEdgeStep = CEdgeDeltaX/CEdgeDeltaY;
		
		// Polygon top
		if (fpP1.y != fpP2.y)
		{
			float AEdgeX = fpP1.x;
			float AEdgeDeltaY = fpP2.y-fpP1.y;
			float AEdgeDeltaX = fpP2.x-fpP1.x;
			float AEdgeStep = AEdgeDeltaX/AEdgeDeltaY;
			
			for (int i=fpP1.y; i < fpP2.y; i++)
			{
				AEdgeX += AEdgeStep;
				CEdgeX += CEdgeStep;
				
				int x1 = (int)AEdgeX;
				int x2 = (int)CEdgeX;
				fpPixels = scanLine (	new Point(x1,i),
										new Point(x2,i),
										fpColor,
										fpPixels);
			}
		}
		
		// Polygon bottom
		if (fpP2.y != fpP3.y)
		{
			float BEdgeX = fpP2.x;
			float BEdgeDeltaY = fpP3.y-fpP2.y;
			float BEdgeDeltaX = fpP3.x-fpP2.x;
			float BEdgeStep = BEdgeDeltaX/BEdgeDeltaY;
			
			for (int i=fpP2.y; i < fpP3.y; i++)
			{
				BEdgeX += BEdgeStep;
				CEdgeX += CEdgeStep;
				
				int x1 = (int)BEdgeX;
				int x2 = (int)CEdgeX;
				fpPixels = scanLine (	new Point(x1,i),
										new Point(x2,i),
										fpColor,
										fpPixels);
			}
		}		
		
		// Return pixels
		return fpPixels;
	}
	//-----------------------------------------------------------------------
	
	//-----------------------------------------------------------------------
	// Draw scanline
	//-----------------------------------------------------------------------	
	public int[] scanLine(	Point fpP1,
							Point fpP2,
							int fpColor[],
							int fpPixels[])
	{
		if (fpP1.x > fpP2.x)
		{
			Point temp = fpP1;
			fpP1 = fpP2;
			fpP2 = temp;
		}
		
		int delta = fpP2.x - fpP1.x;
		if (delta != 0)
		{							
			for (int i=fpP1.x; i < fpP2.x; i++)
			{						
				fpPixels[fpP1.y * W + i] = 255<<24|fpColor[0]<<16|fpColor[1]<<8|fpColor[2];
			}
		}
		
		return fpPixels;
	}
	//-----------------------------------------------------------------------		
}