初学半平面交算法,本来想自己敲一遍的,但是今晚确实比较晚了,于是直接套了昨天手敲的模版,竟然1A了,嘿嘿...今天总算还是做了一题。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 1505;
const double eps = 1e-8;
int n, pn, dq[maxn], top, bot;
struct Point {
double x, y;
} p[maxn];
struct Line {
Point a, b;
double angle;
Line& operator= (Line l) {
a.x = l.a.x; a.y = l.a.y;
b.x = l.b.x; b.y = l.b.y;
angle = l.angle;
return *this;
}
} l[maxn];
int dblcmp(double k) {
if (fabs(k) < eps) return 0;
return k > 0 ? 1 : -1;
}
double multi(Point p0, Point p1, Point p2) {
return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);
}
bool cmp(const Line& l1, const Line& l2) {
int d = dblcmp(l1.angle-l2.angle);
if (!d) return dblcmp(multi(l1.a, l2.a, l2.b)) < 0; //大于0取半