POJ 1279 Art Gallery 半平面交 + 多边形面积
模板题,没什么好说的。
View Code
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; #define eps 1e-8 struct point { double x, y; }p[1505], tmp[1505], q[1505]; double a, b, c; void get_line(point p1, point p2) { a = p2.y - p1.y; b = p1.x - p2.x; c = p2.x * p1.y - p2.y * p1.x; } point intersect(point p1, point p2) { double u = fabs(a * p1.x + b * p1.y + c); double v = fabs(a * p2.x + b * p2.y + c); point ret; ret.x = (p1.x * v + p2.x * u) / (u + v); ret.y = (p1.y * v + p2.y * u) / (u + v); return ret; } int n, m; void cut() { int tm = 0; int i; for(i = 1; i <= m; i++) { if(a * q[i].x + b * q[i].y + c >= 0) tmp[++tm] = q[i]; else { if(a * q[i-1].x + b * q[i-1].y + c > 0) tmp[++tm] = intersect(q[i-1], q[i]); if(a * q[i+1].x + b * q[i+1].y + c > 0) tmp[++tm] = intersect(q[i], q[i+1]); } } for(i = 1; i <= tm; i++) q[i] = tmp[i]; q[0] = tmp[tm]; q[tm + 1] = tmp[1]; m = tm; } void solve() { int i; for(i = 1; i <= n; i++) q[i] = p[i]; p[n+1] = p[1]; q[0] = q[n]; q[n+1] = q[1]; m = n; for(i = 1; i <= n; i++) { get_line(p[i], p[i+1]); cut(); } } double cal(int n, point *p) { int i; double s = 0; p[n+1] = p[1]; for(i = 1; i <= n; i++) s += p[i].x * p[i+1].y - p[i].y * p[i+1].x; return fabs(s) / 2; } int main() { int i, j, cas; scanf("%d", &cas); while(cas--) { scanf("%d", &n); for(i = 1;i <= n; i++) scanf("%lf%lf", &p[i].x, &p[i].y); solve(); if(m >= 3)printf("%.2f\n", cal(m, q) ); else printf("0.00\n"); } return 0; }


浙公网安备 33010602011771号