static int isInPolygon(Point p, Point[] polygon) {
        int n = polygon.length;
        boolean in = false;
        for (int i = 0; i < n; i++) {
            Point a = polygon[i].subtract(p);
            Point b = polygon[(i + 1) % n].subtract(p);
            if (approxEquals(a.cross(b), 0) && a.dot(b) < EPS) return 2;
            if (a.y > b.y) {  // 点との位置関係を求めるためベクトルabを上向きにする
                Point temp = a;
                a = b;
                b = temp;
            }
            // 線分が直線と完全に交差しているか、線分の端点が
            // 直線の上側にあるなら直線と交差するとみなす
            if (a.y * b.y < 0 || (a.y * b.y < EPS && b.y > EPS)) {
                if (a.cross(b) < EPS) in = !in;  // 外積が負なら半直線とも交差する
            }
        }
        return in ? 1 : 0;
    }