POJ 1584 A Round Peg in a Ground Hole(点到直线距离,圆与多

题意:给出一个多边形和一个圆,,问是否是凸多边形,若是则再问圆是否在凸多边形内部。

分3步:

1、判断是否是凸多边形

2、判断点是否在多边形内部

3、判断点到各边的距离是否大于等于半径

上代码:

;Point{double x, y;Point operator-(const Point &a) const{Point ret;ret.x = x – a.x;ret.y = y – a.y;return ret;}} point[maxn], peg;double pegr;int n;int dblcmp(double a){if (fabs(a) < eps)return 0;return a >0?1 : -1;}double xmult(const Point &a, const Point &b){return a.x * b.y – b.x * a.y;}void input(){scanf(“%lf%lf%lf”, &pegr, &peg.x, &peg.y);for (int i =0; i < n; i++)scanf(“%lf%lf”, &point[i].x, &point[i].y);int t =0;int i =0;while (i < n && t ==0){t = dblcmp(xmult(point[(i +1)%n] – point[i], point[(i +2)%n] – point[i]));i++;}if (t <0)reverse(point, point + n);}bool convex(){for (int i =0; i < n; i++)if (dblcmp(xmult(point[(i +1)%n] – point[i], point[(i +2)%n] – point[(i +1)%n])) <0)return false;return true;}bool inconvex(){for (int i =0; i < n; i++)if (dblcmp(xmult(point[(i +1)%n] – point[i], peg – point[(i +1)%n])) <=0)return false;return true;}double dist(const Point &a, const Point &b){Point p;p = a – b;return sqrt(p.x * p.x + p.y * p.y);}bool ok(){for (int i =0; i < n; i++)if (dblcmp(abs(xmult(peg – point[i], point[(i +1)%n] – point[i]))/dist(point[i], point[(i +1)%n]) – pegr) <0)return false;return true;}int main(){while (scanf(“%d”, &n) != EOF){if (n<3)break;input();if (!convex())printf(“HOLE IS ILL-FORMED\n”);else if (!inconvex()||!ok())printf(“PEG WILL NOT FIT\n”);elseprintf(“PEG WILL FIT\n”);}return 0;}

又或者是后天的,我们不断学习,努力进取的路途中辛苦寻到的武器。

POJ 1584 A Round Peg in a Ground Hole(点到直线距离,圆与多

相关文章:

你感兴趣的文章:

标签云: