几何的向量计算模板
double add(double a, double b) { if (abs(a + b) < 1e-10*(abs(a) + abs(b))) return 0; else return a + b; } struct P { double x; double y; P() {} P(double a, double b) { x = a; y = b; } double det(P a) { return add(x*a.y, -y*a.x); } double dot(P a) { return add(x*a.x, y*a.y); } P operator+(P p) { return P(add(p.x, x), add(p.y, y)); } P operator-(P p) { return P(add(x, -p.x), add(y, -p.y)); } P operator*(double a) { return P(a*x, a*y); } };