public boolean isPointInside(int x, int y) {
		
		synchronized (this) {
			//Check bounding box first
			if (!getBoundingBox().isPointInside(x, y))
				return false;
			
			//Is point inside algorithm:
			// (See http://www.codeproject.com/KB/recipes/geometry.aspx )
	
			int  	j, inside_flag;
			double 	dv0 ;
			int     crossings;
			boolean xflag0, yflag0, yflag1 = false;
			double	 vertex0x, vertex0y, vertex1x = 0, vertex1y = 0;
			Point 	vertex0, vertex1, P;
		 
			vertex0 = points.get(points.size()-1);
			vertex0x = vertex0.x;
			vertex0y = vertex0.y;
		 
		    //Get test bit for above/below Y axis 
		    yflag0 = ( dv0 = vertex0y - y ) >= 0.0;
		 
		    crossings = 0;
			j = 0;
			for (Iterator<Point> it = points.iterator(); it.hasNext(); )
			{
				P = it.next();
		        // cleverness:  bobble between filling endpoints of edges, so
				// that the previous edge's shared endpoint is maintained.
				if ( (j & 0x1) != 0 ) 
				{
					vertex0 = P;
					vertex0x = vertex0.x;
					vertex0y = vertex0.y;
					yflag0 = ( dv0 = vertex0y - y ) >= 0.0 ;
				} 
				else 
				{
					vertex1 = P;
					vertex1x = vertex1.x;
					vertex1y = vertex1.y;
					yflag1 = ( vertex1y >= y ) ;
				}
		 
				// check if points not both above/below X axis - can't hit ray 
				if (yflag0 != yflag1) 
				{
		            // check if points on same side of Y axis 
		            if ( ( xflag0 = ( vertex0x >= x ) ) == ( vertex1x >= x ) ) 
					{
		                if ( xflag0 ) 
							crossings++;
		            } 
					else 
					{
		                // compute intersection of pgon segment with X ray, note
		                // if > point's X.
		                //
		                crossings += (vertex0x - dv0 * (vertex1x-vertex0x)/(vertex1y-vertex0y)) >= x ? 1 : 0;
		            }
		        }
				j++;
		    }
		 
		    // test if crossings is odd
		    // if all we care about is winding number > 0, then just:
		    //       inside_flag = crossings > 0;
		 
			inside_flag = crossings & 0x01;
		 
		    return inside_flag != 0;
		}
	}