import javax.microedition.lcdui.*;

public class Polygon
{
	public final static int POINT_MAX = 8;

	int		color;
	int[]	x = new int[ POINT_MAX ];
	int[]	y = new int[ POINT_MAX ];
	int		num;
	int		 start;

	Polygon()
	{
		num = 0;
	}

	Polygon( int in_num, int[] in_x, int[] in_y, int in_color )
	{
		color = in_color;
		num = in_num;

		if( num > POINT_MAX )
		{
			num = POINT_MAX;
		}

		if( num > in_x.length )
		{
			num = in_x.length;
		}

		if( num > in_y.length )
		{
			num = in_y.length;
		}

		start = 0;
		int	y_min = 0x7fffffff;
		for( int i = 0; i < num; i ++ )
		{
			x[ i ] = in_x[ i ];
			y[ i ] = in_y[ i ];
			
			if( y[ i ] < y_min )
			{
				start = i;
				y_min = y[ i ];
			}
		}
	}

	public void draw( Graphics g, int dx, int dy )
	{
		int oldcolor = g.getColor();

		g.setColor( color );
		g.setStrokeStyle( g.SOLID );
		g.translate( dx, dy );

		if( num == 1 )
		{
			g.drawLine( x[ 0 ], y[ 0 ], x[ 0 ], y[ 0 ] );
		}
		else if( num == 2 )
		{
			g.drawLine( x[ 0 ], y[ 0 ], x[ 1 ], y[ 1 ] );
		}
		else
		{
			boolean	drawflag = true;

			int	lp = start;
			int	rp = start;

			int	nlp = lp + 1;
			if( nlp >= num )
			{
				nlp = 0;
			}

			int	nrp = rp - 1;
			if( nrp < 0 )
			{
				nrp = num - 1;
			}

			int	now_y = y[ start ];
			int	lx = x[ lp ];
			int	rx = x[ rp ];

			int	dlx = x[ nlp ] - lx;
			int	drx = x[ nrp ] - rx;
			int	dly = y[ nlp ] - now_y;
			int	dry = y[ nrp ] - now_y;

			int	dl = dly / 2;
			int	dr = dly / 2;

			while( true )
			{
				if( lx > rx )
				{
					drawflag = false;
					break;
				}

				if( now_y < y[ nlp ] && now_y < y[ nrp ] )
				{
					now_y ++;
				}

				if( now_y >= y[ nlp ] )
				{
					if( nlp == nrp )
					{
						lx = x[ nlp ];
						rx = lx;
						break;
					}

					lp = nlp;
					nlp ++;
					if( nlp >= num )
					{
						nlp = 0;
					}

					lx = x[ lp ];
					dlx = x[ nlp ] - lx;
					dly = y[ nlp ] - now_y;
					dl = dly / 2;
				}
				else
				{
					if( dlx > 0 )
					{
						dl += dlx;
						while( dl >= dly )
						{
							lx ++;
							dl -= dly;
						}
					}
					else if( dlx < 0 )
					{
						dl -= dlx;
						while( dl >= dly )
						{
							lx --;
							dl -= dly;
						}
					}
				}

				if( now_y >= y[ nrp ] )
				{
					if( nlp == nrp )
					{
						rx = x[ nrp ];
						lx = rx;
						break;
					}

					rp = nrp;
					nrp --;
					if( nrp < 0 )
					{
						nrp = num - 1;
					}

					rx = x[ rp ];
					drx = x[ nrp ] - rx;
					dry = y[ nrp ] - now_y;
					dr = dry / 2;
				}
				else
				{
					if( drx > 0 )
					{
						dr += drx;
						while( dr >= dry )
						{
							rx ++;
							dr -= dry;
						}
					}
					else if( drx < 0 )
					{
						dr -= drx;
						while( dr >= dry )
						{
							rx --;
							dr -= dry;
						}
					}
				}

				g.drawLine( lx, now_y, rx, now_y );
			}

			if( drawflag )
			{
				int	i;

				for( i = 0; i < num - 1; i ++ )
				{
					g.drawLine( x[ i ], y[ i ], x[ i + 1 ], y[ i + 1 ] );
				}
				g.drawLine( x[ i ], y[ i ], x[ 0 ], y[ 0 ] );
			}
		}

		g.translate( -dx, -dy );
		g.setColor( oldcolor );
	}
}
