计算几何大佬板子

struct P {
    double x,y;
    P() {}
    P(double x, double y) {
        this->x = x;
        this->y = y;
    }
    P operator + (const P &c) const {
        return P(x + c.x, y + c.y);
    }
    P operator - (const P &c) const {
        return P(x - c.x, y - c.y);
    }
    P operator * (const db &c) const {
        return P(x * c, y * c);
    }
    P operator / (const db &c) const {
        return P(x / c, y / c);
    }
};

int n;
P p[N];
bool f[N][N];
ll dp[N][N];

P read() {
    double x, y;scanf("%lf%lf",&x,&y);
    return P(x, y);
}

void print(P p) {
    printf("%lf %lf\n",p.x,p.y);
}

int sign(double x) {
    return (x>eps)-(x<-eps);
}
db dot(P a, P b) {
    return x(a) * x(b) + y(a) * y(b);
}
double cross(P a, P b) {
    return x(a) * y(b) - x(b) * y(a);
}
    
//判断线段是否规范相交(交点不在任一个端点上)
bool isSS0(P a1, P a2, P b1, P b2) {
    double c1 = cross(a2 - a1, b1 - a1), c2 = cross(a2 - a1, b2 - a1),
       c3 = cross(b2 - b1, a1 - b1), c4 = cross(b2 - b1, a2 - b1);
    return sign(c1) * sign(c2) < 0 && sign(c3) * sign(c4) < 0;
}
//判断线段是否不规范相交
bool isSS1(P a1, P a2, P b1, P b2) {
    double c1 = cross(a2 - a1, b1 - a1), c2 = cross(a2 - a1, b2 - a1),
       c3 = cross(b2 - b1, a1 - b1), c4 = cross(b2 - b1, a2 - b1);
    return sign(max(x(a1), x(a2)) - min(x(b1), x(b2))) >= 0 &&
           sign(max(x(b1), x(b2)) - min(x(a1), x(a2))) >= 0 &&
           sign(max(y(a1), y(a2)) - min(y(b1), y(b2))) >= 0 &&
           sign(max(y(b1), y(b2)) - min(y(a1), y(a2))) >= 0 &&
           sign(c1) * sign(c2) <= 0 && sign(c3) * sign(c4) <= 0;
}
//判断点是否在线段上(不包括端点)
bool onS0(P p, P a, P b) {
    return sign(cross(p - a, b - a)) == 0 && sign(dot(p - a, p - b)) < 0;
}
//判断点是否在线段上(包括端点)
bool onS1(P p, P a, P b) {
    return sign(cross(p - a, b - a)) == 0 && sign(dot(p - a, p - b)) <= 0;
}
//判断点和多边形关系 边上-1 外0 内1
int Pinploy(P o, P *p, int n) {
    int res = 0;
    rep(i, 0, n) {
        P u = p[i], v = p[(i + 1) % n];
        if(onS1(o, u, v)) return -1;
        int k = sign(cross(v - u, o - u));
        int d1 = sign(y(u) - y(o));
        int d2 = sign(y(v) - y(o));
        if(k > 0 && d1 <= 0 && d2 > 0) ++res;
        if(k < 0 && d2 <= 0 && d1 > 0) --res;
    }
    return res != 0;
}

 

posted on 2018-03-29 17:26  chinacwj1  阅读(209)  评论(0编辑  收藏  举报

导航