ポリゴンと点の内外チェック(凸に限る)

// 点がポリゴン内にあるかチェック(外積版)
bool checkPointInPolygon(D3DXVECTOR3 &point, D3DXVECTOR3 polygon[], int polygonNum)
{
    D3DXVECTOR2 v1, v2;
    for (int i = 0; i < polygonNum-1; i++) {
        // ポリゴンの1辺のベクトル
        v1 = D3DXVECTOR2(polygon[i+1].x - polygon[i].x, polygon[i+1].y - polygon[i].y);
        // ポリゴンの1辺のベクトル
        v2 = D3DXVECTOR2(print.x - polygon[i].x, point.y - polygon[i].y);
        if (D3DXVec2CCW(&v1, &v2) < 0) { // D3DXVec2CCW関数は外積のZ成分を返す
            return false;
        }
    }
    return true;
}

// 点がポリゴン内にあるかチェック(内積版)
bool checkPointInPolygon(D3DXVECTOR3 &point, D3DXVECTOR3 polygon[], int polygonNum)
{
    D3DXVECTOR2 v1, v2;
    // ポリゴンの法線を求める
    // ?? 不明

    bool plus;
    if (D3DXVECTOR2(print.x - polygon[0].x, point.y - polygon[0].y) > 0) {
        plus = true;
    } else {
        plus = false;
    }
    for (int i = 0; i < polygonNum-1; i++) {
        // 1辺の法線を求める
        v2 = D3DXVECTOR2(print.x - polygon[i].x, point.y - polygon[i].y);
        // 1辺の法線と頂点ベクトルの内積が一定
        if (plus && D3DXVec2Dot(&v1, &v2) < 0) return false;
        if (!plus && D3DXVec2Dot(&v1, &v2) > 0) return false;
    }
    return true;
}