UVa 10577 Bounding box (直线交点&正多边形中心)

来源:互联网 发布:ie8 淘宝提示版本过低 编辑:程序博客网 时间:2024/05/02 11:04

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1518


先由给出的三个点画两条中垂线求交点——正多边形的中心,然后用点的旋转求边界上的所有点,随后求出矩形边界。


完整代码:

/*0.018s*/#include<bits/stdc++.h>using namespace std;const double pi = acos(-1.0);struct point{double x, y;point(double x = 0.0, double y = 0.0): x(x), y(y) {}} poly[155];struct line{double x, y, dx, dy;line(point a, point b) {x = a.x; y = a.y; dx = b.x - a.x; dy = b.y - a.y;}};inline double dist(point a, point b){return hypot(a.x - b.x, a.y - b.y);}///两直线交点inline point crosspoint(line l, line m){double a1 = -l.dy, b1 = l.dx, c1 = l.dx * l.y - l.dy * l.x;double a2 = -m.dy, b2 = m.dx, c2 = m.dx * m.y - m.dy * m.x;double x = (c1 * b2 - c2 * b1) / (a1 * b2 - a2 * b1);double y = (c1 * a2 - c2 * a1) / (b1 * a2 - b2 * a1);return point(x, y);}int main(){int n, t = 1;point a, b, c;while (scanf("%d", &n), n){scanf("%lf%lf", &a.x, &a.y);scanf("%lf%lf", &b.x, &b.y);scanf("%lf%lf", &c.x, &c.y);///做两条线断的垂直平分线,利用交点point m1 = point((a.x + b.x) / 2, (a.y + b.y) / 2);line l1 = line(m1, point(m1.x + b.y - a.y, m1.y - b.x + a.x));point m2 = point((c.x + b.x) / 2, (c.y + b.y) / 2);line l2 = line(m2, point(m2.x + b.y - c.y, m2.y - b.x + c.x));///计算多边形外接圆的圆心和半径point cc = crosspoint(l1, l2);double r  = dist(cc, a);///计算多由顶点double rcosx, cosy = cos(2 * pi / n);double rsinx, siny = sin(2 * pi / n);poly[0] = a;for (int i = 1 ; i < n ; ++ i){rcosx = poly[i - 1].x - cc.x;rsinx = poly[i - 1].y - cc.y;poly[i].x = rcosx * cosy - rsinx * siny + cc.x;///旋转poly[i].y = rsinx * cosy + rcosx * siny + cc.y;}///求出边界点,计算面积int minx = 0, maxx = 0, miny = 0, maxy = 0;for (int i = 0 ; i < n ; ++ i){if (poly[i].x < poly[minx].x) minx = i;if (poly[i].x > poly[maxx].x) maxx = i;if (poly[i].y < poly[miny].y) miny = i;if (poly[i].y > poly[maxy].y) maxy = i;}double X = poly[maxx].x - poly[minx].x;double Y = poly[maxy].y - poly[miny].y;printf("Polygon %d: %.3lf\n", t ++, X * Y);}return 0;}

0 0
原创粉丝点击