This is a snippet I found on the internet a while ago, seemed to work fine for everything I threw at it.
Don't ask me about the math behind it ;)
xp and yp are point to an array of corners, x,y is the point you want to check:
template < typename T >
bool is_point_in_poly( int num_edges, T *xp, T *yp, T x, T y)
{
int i, j;
bool c = 0;
for (i = 0, j = num_edges-1; i < num_edges; j = i++) {
if ((((yp[i]<=y) && (y<yp[j])) ||
((yp[j]<=y) && (y<yp[i]))) &&
(x < (xp[j] - xp[i]) * (y - yp[i]) / (yp[j] - yp[i]) + xp[i]))
c = !c;
}
return c;
}