zoukankan      html  css  js  c++  java
  • 暑假集训-计算几何

    交了两天的半平面交的模版题终于过了,,,原来是 OnLeft 里面少抄了一个等于号......

    半平面交 poj3335

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <fstream>
      4 #include <algorithm>
      5 #include <cmath>
      6 #include <deque>
      7 #include <Vector>
      8 #include <queue>
      9 #include <string>
     10 #include <cstring>
     11 #include <map>
     12 #include <stack>
     13 #include <set>
     14 #define LL long long
     15 #define INF 0x3f3f3f3f
     16 #define eps 1e-10
     17 #define OPEN_FILE
     18 using namespace std;
     19 int n;
     20 
     21 int dcmp(double x){
     22     if (fabs(x) < eps) return 0;
     23     return x < 0 ? -1 : 1;
     24 }
     25 struct Point{
     26     double x, y;
     27     Point(double p = 0, double q = 0){
     28         x = p;
     29         y = q;
     30     }
     31 };
     32 struct Node{
     33     int p;
     34     Point A, B;
     35     Node(Point a1, Point a2, int t){
     36         A = a1;
     37         B = a2;
     38         p = t;
     39     }
     40 };
     41 typedef Point Vector;
     42 
     43 Vector operator + (Vector A, Vector B){
     44     return Vector(A.x + B.x, A.y + B.y);
     45 }
     46 Vector operator - (Vector A, Vector B){
     47     return Vector(A.x - B.x, A.y - B.y);
     48 }
     49 Vector operator * (Vector A, double p){
     50     return Vector(A.x * p, A.y * p);
     51 }
     52 Vector operator / (Vector A, double p){
     53     return Vector(A.x / p, A.y / p);
     54 }
     55 bool operator == (Vector A, Vector B){
     56     return dcmp(A.x - B.x) == 0 && dcmp(A.y - B.y) == 0;
     57 }
     58 bool operator > (Vector A, Vector B){
     59     return A.x > B.x && A.y > B.y;
     60 }
     61 bool operator <(Vector A, Vector B){
     62     return A.x < B.x && A.y < B.y;
     63 }
     64 //点积
     65 double  Dot(Vector A, Vector B){
     66     return A.x * B.x + A.y * B.y;
     67 }
     68 //
     69 double Length(Vector A){
     70     return sqrt(Dot(A, A));
     71 }
     72 //夹角
     73 double Angle(Vector A, Vector B){
     74     return acos(Dot(A, B) / Length(A) / Length(B));
     75 }
     76 //叉积
     77 double Cross(Vector A, Vector B){
     78     return A.x * B.y - A.y*B.x;
     79 }
     80 //三角形面积
     81 double Area2(Point A, Point B, Point C){
     82     return Cross(B - A, C - A);
     83 }
     84 struct Line
     85 {
     86     Point p;
     87     Vector v;
     88     double angle;
     89     Line(){}
     90     Line(Point p, Vector v) :p(p), v(v){
     91         angle = atan2(v.y, v.x);
     92     }
     93     bool operator < (const Line & L) const{
     94         return angle<L.angle;
     95     }
     96 };
     97 //点p在直线L的左边
     98 bool OnLeft(Line L, Point p) { return Cross(L.v, p - L.p)>=0; }
     99 //直线A,B的交点
    100 Point GetIntersection(Line A, Line B)
    101 {
    102     Vector u = A.p - B.p;
    103     double t = Cross(B.v, u) / Cross(A.v, B.v);
    104     return A.p + A.v*t;
    105 }
    106 
    107 int HalfplaneIntersection(Line *L, int n, Point *poly)
    108 {
    109     sort(L, L + n);
    110 
    111     int first, last;
    112     Point *p = new Point[n];
    113     Line *q = new Line[n];
    114     q[first = last = 0] = L[0];
    115     for (int i = 1; i < n; i++)
    116     {
    117         while (first < last && !OnLeft(L[i], p[last - 1])) last--;
    118         while (first < last && !OnLeft(L[i], p[first])) first++;
    119         q[++last] = L[i];
    120         if (fabs(Cross(q[last].v, q[last - 1].v)) < eps)
    121         {
    122             last--;
    123             if (OnLeft(q[last], L[i].p)) q[last] = L[i];
    124         }
    125         if (first < last) p[last - 1] = GetIntersection(q[last - 1], q[last]);
    126     }
    127     while (first < last && !OnLeft(q[first], p[last - 1])) last--;
    128     if (last - first <= 1) return 0;
    129     p[last] = GetIntersection(q[last], q[first]);
    130     int m = 0;
    131     for (int i = first; i <= last; i++) poly[m++] = p[i];
    132     return m;
    133 }
    134 
    135 Line L[105];
    136 Point P[105], poly[105];
    137 Vector v[105];
    138 int main()
    139 {
    140 #ifdef OPEN_FILE
    141     //freopen("in.txt", "r", stdin);
    142     //freopen("out.txt", "w", stdout);
    143 #endif // OPEN_FILE
    144     int T;
    145     scanf("%d", &T);
    146     double x, y;
    147     for (int cas = 1; cas <= T; cas++){
    148         scanf("%d", &n);
    149         for (int i = 0; i < n; i++)
    150         {
    151             scanf("%lf%lf", &x, &y);
    152             P[i] = Point(x, y);
    153         }
    154         for (int i = 0; i < n; i++){
    155             v[i] = P[i] - P[(i + 1) % n];
    156         }
    157         for (int i = 0; i < n; i++)
    158         {
    159             L[i] = Line(P[i], v[i]);
    160         }
    161         if (HalfplaneIntersection(L, n, poly) != 0){
    162             printf("YES
    ");
    163         }
    164         else{
    165             printf("NO
    ");
    166         }
    167     }
    168 }
    View Code

    凸包加旋转卡壳 poj2187

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <fstream>
      4 #include <algorithm>
      5 #include <cmath>
      6 #include <deque>
      7 #include <vector>
      8 #include <queue>
      9 #include <string>
     10 #include <cstring>
     11 #include <map>
     12 #include <stack>
     13 #include <set>
     14 #define LL long long
     15 #define INF 0x3f3f3f3f
     16 #define OPEN_FILE
     17 using namespace std;
     18 
     19 #define eps 1e-8
     20 
     21 struct Point{
     22     int x, y;
     23     Point(int p = 0, int q = 0){
     24         x = p;
     25         y = q;
     26     }
     27 };
     28 typedef Point Vector;
     29 
     30 Vector operator + (Vector A, Vector B){
     31     return Vector(A.x + B.x, A.y + B.y);
     32 }
     33 Vector operator - (Vector A, Vector B){
     34     return Vector(A.x - B.x, A.y - B.y);
     35 }
     36 Vector operator * (Vector A, int p){
     37     return Vector(A.x * p, A.y * p);
     38 }
     39 Vector operator / (Vector A, int p){
     40     return Vector(A.x / p, A.y / p);
     41 }
     42 bool operator == (Vector A, Vector B){
     43     return A.x - B.x == 0 && A.y - B.y == 0;
     44 }
     45 bool operator > (Vector A, Vector B){
     46     return A.x > B.x ||(A.x == B.x && A.y > B.y);
     47 }
     48 bool operator <(Vector A, Vector B){
     49     return A.x < B.x ||(A.x == B.x && A.y < B.y);
     50 }
     51 
     52 int Cross(Vector A, Vector B){
     53     return A.x * B.y - A.y*B.x;
     54 }
     55 int Distance(Point a, Point b){
     56     return  (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
     57 }
     58 int ConvexHull(Point *p, int n, Point* ch){
     59     sort(p, p + n);
     60     int m = 0;
     61     for (int i = 0; i < n; i++){
     62         while (m > 1 && Cross(ch[m - 1] - ch[m - 2], p[i] - ch[m - 2]) <= 0){
     63             m--;
     64         }
     65         ch[m++] = p[i];
     66     }
     67     int k = m;
     68     for (int i = n - 2; i >= 0; i--){
     69         while (m > k && Cross(ch[m - 1] - ch[m - 2], p[i] - ch[m - 2]) <= 0){
     70             m--;
     71         }
     72         ch[m++] = p[i];
     73     }
     74     if (n > 1){
     75         m--;
     76     }
     77     return m;
     78 }
     79 int RotateCaliper(int m, Point *ch){
     80     if (m == 2) return Distance(ch[0], ch[1]);
     81 
     82     int i, j;
     83     i = j = 0;
     84     for (int k = 0; k<m; k++){
     85         if (ch[i].x>ch[k].x){
     86             i = k;
     87         }
     88         if (ch[j].x < ch[k].x){
     89             j = k;
     90         }
     91     }
     92     int res = 0, si = i, sj = j;
     93 
     94     while (i != sj || j != si)
     95     {
     96         res = max(res, Distance(ch[i], ch[j]));
     97         if (Cross(ch[(i + 1) % m] - ch[i], ch[(j + 1) % m] - ch[j]) < 0){
     98             i = (i + 1) % m;
     99         }
    100         else {
    101             j = (j + 1) % m;
    102         }
    103     }
    104     return  res;
    105 }
    106 const int MAXN = 50005;
    107 int n;
    108 Point p[MAXN], ch[MAXN];
    109 int main()
    110 {
    111 #ifdef OPEN_FILE
    112     //freopen("in.txt", "r", stdin);
    113     //freopen("out.txt", "w", stdout);
    114 #endif // OPEN_FILE
    115     while (~scanf("%d", &n)){
    116         for (int i = 0; i < n; i++){
    117             scanf("%d%d", &p[i].x, &p[i].y);
    118         }
    119         int m = ConvexHull(p, n, ch);    
    120         int ans = RotateCaliper(m, ch);
    121         printf("%d
    ", ans);
    122     }
    123 }
    View Code
  • 相关阅读:
    Gatling 条件判断
    Gatling脚本编写技巧篇(二)
    Gatling脚本编写技巧篇(一)
    性能测试-pidstat 问题定位分析
    REACT——无状态组件
    REACT——react-transition-group 实现动画
    REACT——生命周期函数
    REACT——ref的使用
    REACT——虚拟DOM
    REACT——Props、status与render
  • 原文地址:https://www.cnblogs.com/macinchang/p/4656378.html
Copyright © 2011-2022 走看看