1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241
| #include <bits/stdc++.h> using namespace std;
const double PI = acos(-1); const double INF = 1e10; const double eps = 1e-15; const int LEFT = 0; const int RIGHT = 1; const int ONLINE = 2; const int CROSS = 0; const int COLINE = 1; const int PARALLEL = 2; const int NOTCOPLANAR = 3; const int INSIDE = 1; const int OUTSIDE = 2; const int BORDER = 3; const int BAOHAN = 1; const int NEIQIE = 2; const int XIANGJIAO = 3; const int WAIQIE = 4; const int XIANGLI = 5;
struct Point { double x, y; double angle, dis; Point() {} Point(double _x, double _y) : x(_x), y(_y) {} }; struct Point3D { double x, y, z; Point3D() {} Point3D(double _x, double _y, double _z) : x(_x), y(_y), z(_z) {} }; struct Line { Point p1, p2; Line() {} Line(Point _p1, Point _p2) : p1(_p1), p2(_p2) {} }; struct Line3D { Point3D p1, p2; Line3D() {} Line3D(Point3D _p1, Point3D _p2) : p1(_p1), p2(_p2) {} }; struct Rect { double w, h; Rect() {} Rect(double _w, double _h) : w(_w), h(_h) {} }; struct Rect_2 { double xl, yl, xh, yh; Rect_2() {} Rect_2(double _xl, double _yl, double _xh, double _yh) : xl(_xl), yl(_yl), xh(_xh), yh(_yh) {} }; struct Circle { Point c; double r; Circle() {} Circle(Point _c, double _r) : c(_c), r(_r) {} }; typedef vector<Point> Polygon; typedef vector<Point> Points; typedef vector<Point3D> Points3D;
bool isZero(double x) {return fabs(x) < eps;} bool isZero(Point p) {return isZero(p.x) && isZero(p.y);} bool isZero(Point3D p) {return isZero(p.x) && isZero(p.y) && isZero(p.z);} bool equal(double x, double y) {return fabs(x - y) < eps;} bool lessThan(double x, double y) {return x < y && !equal(x, y);} bool greaterThan(double x, double y) {return x > y && !equal(x, y);} bool lessEqual(double x, double y) {return x < y || equal(x, y);} bool greaterEqual(double x, double y) {return x > y || equal(x, y);} double fix(double x) {return fabs(x) < eps ? 0 : x;}
bool operator==(Point p1, Point p2) {return equal(p1.x, p2.x) && equal(p1.y, p2.y);} bool operator!=(Point p1, Point p2) {return !equal(p1.x, p2.x) || !equal(p1.y, p2.y);} bool operator<(Point p1, Point p2) {return !equal(p1.x, p2.x) ? (p1.x < p2.x) : (p1.y < p2.y);} Point operator+(Point p1, Point p2) {return Point(p1.x + p2.x, p1.y + p2.y);} Point operator-(Point p1, Point p2) {return Point(p1.x - p2.x, p1.y - p2.y);}
double operator*(Point p1, Point p2) {return p1.x * p2.y - p2.x * p1.y;}
double operator&(Point p1, Point p2) {return p1.x * p2.x + p1.y * p2.y;}
double norm(Point p) {return sqrt(p.x * p.x + p.y * p.y);}
Point rotate(Point p, double angle) { Point result; result.x = p.x * cos(angle) - p.y * sin(angle); result.y = p.x * sin(angle) + p.y * cos(angle); return result; }
bool operator==(Point3D p1, Point3D p2) { return equal(p1.x, p2.x) && equal(p1.y, p2.y) && equal(p1.z, p2.z); } bool operator<(Point3D p1, Point3D p2) { if (!equal(p1.x, p2.x)) return p1.x < p2.x; if (!equal(p1.y, p2.y)) return p1.y < p2.y; return p1.z < p2.z; } Point3D operator+(Point3D p1, Point3D p2) { return Point3D(p1.x + p2.x, p1.y + p2.y, p1.z + p2.z); } Point3D operator-(Point3D p1, Point3D p2) { return Point3D(p1.x - p2.x, p1.y - p2.y, p1.z - p2.z); } Point3D operator*(Point3D p1, Point3D p2) { return Point3D(p1.y * p2.z - p1.z * p2.y, p1.z * p2.x - p1.x * p2.z, p1.x * p2.y - p1.y * p2.x); } double operator&(Point3D p1, Point3D p2) { return p1.x * p2.x + p1.y * p2.y + p1.z * p2.z; } double norm(Point3D p) { return sqrt(p.x * p.x + p.y * p.y + p.z * p.z); }
double area(Point A, Point B, Point C) { return (B - A) * (C - A) / 2; } double area(double a, double b, double c) { double s = (a + b + c) / 2; return sqrt(s * (s - a) * (s - b) * (s - c)); } double area(Circle C) { return PI * C.r * C.r; } double area(const Polygon& poly) { double res = 0; int n = poly.size(); if (n < 3) return 0; for (int i = 0; i < n; i++) { res += poly[i].x * poly[(i + 1) % n].y; res -= poly[i].y * poly[(i + 1) % n].x; } return res / 2; }
double distance(Point p1, Point p2) { return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)); } double distance(Point3D p1, Point3D p2) { return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y) + (p1.z - p2.z) * (p1.z - p2.z)); } double distance(Point p, Line L) { return fabs((p - L.p1) * (L.p2 - L.p1)) / norm(L.p2 - L.p1); } double distance(Point3D p, Line3D L) { return norm((p - L.p1) * (L.p2 - L.p1)) / norm(L.p2 - L.p1); } bool onLine(Point p, Line L) { return isZero((p - L.p1) * (L.p2 - L.p1)); } bool onLine(Point3D p, Line3D L) { return isZero((p - L.p1) * (L.p2 - L.p1)); } int relation(Point p, Line L) { double res = (L.p2 - L.p1) * (p - L.p1); if (equal(res, 0)) return ONLINE; if (res > 0) return LEFT; return RIGHT; } bool isSameSide(Point p1, Point p2, Line L) { double m1 = (p1 - L.p1) * (L.p2 - L.p1); double m2 = (p2 - L.p1) * (L.p2 - L.p1); return greaterThan(m1 * m2, 0); } bool onLineSeg(Point p, Line L) { return isZero((L.p1 - p) * (L.p2 - p)) && lessEqual((p.x - L.p1.x) * (p.x - L.p2.x), 0) && lessEqual((p.y - L.p1.y) * (p.y - L.p2.y), 0); } bool onLineSeg(Point3D p, Line L) { return isZero((L.p1 - p) * (L.p2 - p)) && equal(norm(p - L.p1) + norm(p - L.p2), norm(L.p2 - L.p1)); } Point symPoint(Point p, Line L) { Point result; double a = L.p2.x - L.p1.x, b = L.p2.y - L.p1.y; double t = ((p.x - L.p1.x) * a + (p.y - L.p1.y) * b) / (a * a + b * b); result.x = 2 * L.p1.x + 2 * a * t - p.x; result.y = 2 * L.p1.y + 2 * b * t - p.y; return result; } bool coplanar(Points3D points) { int n = points.size(); if (n < 4) return true; Point3D p = (points[2] - points[0]) * (points[1] - points[0]); for (int i = 3; i < n; i++) { if (!isZero(p & points[i])) return false; } return true; } bool lineIntersect(Line L1, Line L2) { return !isZero((L1.p1 - L1.p2) * (L2.p1 - L2.p2)); } bool lineIntersect(Line3D L1, Line3D L2) { Point3D p = (L1.p1 - L1.p2) * (L2.p1 - L2.p2); if (isZero(p)) return false; p = (L2.p1 - L1.p2) * (L1.p1 - L1.p2); return isZero(p & L2.p2); } bool lineSegIntersect(Line L1, Line L2) { return greaterEqual(max(L1.p1.x, L1.p2.x), min(L2.p1.x, L2.p2.x)) && greaterEqual(max(L2.p1.x, L2.p2.x), min(L1.p1.x, L1.p2.x)) && greaterEqual(max(L1.p1.y, L1.p2.y), min(L2.p1.y, L2.p2.y)) && greaterEqual(max(L2.p1.y, L2.p2.y), min(L1.p1.y, L1.p2.y)) && lessEqual((L2.p1 - L1.p1) * (L1.p2 - L1.p1) * (L2.p2 - L1.p1) * (L1.p2 - L1.p1), 0) && lessEqual((L1.p1 - L2.p1) * (L2.p2 - L2.p1) * (L1.p2 - L2.p1) * (L2.p2 - L2.p1), 0); } int calCrossPoint(Line L1, Line L2, Point& P) { double A1, B1, C1, A2, B2, C2; A1 = L1.p2.y - L1.p1.y; B1 = L1.p1.x - L1.p2.x; C1 = L1.p2.x * L1.p1.y - L1.p1.x * L1.p2.y; A2 = L2.p2.y - L2.p1.y; B2 = L2.p1.x - L2.p2.x; C2 = L2.p2.x * L2.p1.y - L2.p1.x * L2.p2.y; if (equal(A1 * B2, B1 * A2)) { if (equal((A1 + B1) * C2, (A2 + B2) * C1)) return COLINE; return PARALLEL; } else { P.x = (B2 * C1 - B1 * C2) / (A2 * B1 - A1 * B2); P.y = (A1 * C2 - A2 * C1) / (A2 * B1 - A1 * B2); return CROSS; } } Point nearestPointToLine(Point p, Line L) { Point result; double a, b, t; a = L.p2.x - L.p1.x; b = L.p2.y - L.p1.y; t = ();
} int main() {
return 0; }
|