• UVA 10652 凸包问题


      1 #include <cstdio>
      2 #include <cstring>
      3 #include <algorithm>
      4 #include <cmath>
      5 #include <iostream>
      6 using namespace std;
      7 
      8 const double eps = 1e-10;
      9 const int N = 610;
     10 int dcmp(double x)
     11 {
     12     if(abs(x) < eps) return 0;
     13     if(x < 0) return -1;
     14     else return 1;
     15 }
     16 
     17 struct Point{
     18     double x,y;
     19     Point(double x = 0,double y = 0):x(x),y(y){}
     20     bool operator<(const Point &m)const{
     21         return dcmp(x - m.x) < 0 || (dcmp(x - m.x) == 0 && dcmp(y - m.y) < 0);
     22     }
     23 
     24     bool operator==(const Point &m)const{
     25         return dcmp(x - m.x) == 0 && dcmp(y - m.y) == 0;
     26     }
     27 };
     28 
     29 Point ch[N<<2],p[N<<2];
     30 
     31 typedef Point Vector;
     32 
     33 Vector operator+(Vector a , Vector b)
     34 {
     35     return Vector(a.x + b.x , a.y + b.y);
     36 }
     37 
     38 Vector operator-(Point a , Point b)
     39 {
     40     return Vector(a.x - b.x , a.y - b.y);
     41 }
     42 
     43 Vector operator*(Vector a , double b)
     44 {
     45     return Vector(a.x * b , a.y * b);
     46 }
     47 
     48 Vector operator/(Vector a , double b)
     49 {
     50     return Vector(a.x / b , a.y/b);
     51 }
     52 
     53 double Cross(Vector a , Vector b)
     54 {
     55     return a.x * b.y - a.y * b.x;
     56 }
     57 
     58 Vector GetReverse(Vector a , double rad)
     59 {
     60     double x = a.x * cos(rad) - a.y * sin(rad);
     61     double y = a.x * sin(rad) + a.y * cos(rad);
     62     return Vector(x,y);
     63 }
     64 //计算多边形面积
     65 double ConvexPolygonArea(Point *p , int n)
     66 {
     67     double area = 0;
     68     for(int i=1;i<n-1;i++){
     69         area += Cross(p[i] - p[0] , p[i+1] - p[0]);
     70     }
     71     return area / 2;
     72 }
     73 //求形成凸包的最大范围
     74 int ConvexHull(Point *p, int n, Point *ch) //凸包
     75 {
     76     sort(p, p+n);
     77     n = unique(p, p+n) - p; //去重
     78     int m = 0;
     79     for(int i = 0; i < n; i++)
     80     {
     81         while(m > 1 && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <= 0) m--;
     82         ch[m++] = p[i];
     83     }
     84     int k = m;
     85     for(int i = n-2; i >= 0; i--)
     86     {
     87         while(m > k && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <= 0) m--;
     88         ch[m++] = p[i];
     89     }
     90     if(n > 1) m--;
     91     return m;
     92 }
     93 int main()
     94 {
     95   //  freopen("test.in","rb",stdin);
     96 
     97     int T,n;
     98     double x,y,w,h,_angle; //_angle表示度数,自己还要转化成弧度
     99     scanf("%d",&T);
    100     while(T--){
    101         scanf("%d",&n);
    102         int k=0;
    103         double area = 0;
    104         for(int i=0;i<n;i++)
    105         {
    106             scanf("%lf%lf%lf%lf%lf",&x,&y,&w,&h,&_angle);
    107             area += w*h;
    108             double rad = -_angle * acos(-1) / 180;
    109             Point o(x,y);
    110             //cout<<"  rad:  "<<rad<<endl;
    111             p[k++] = GetReverse(Vector(-w/2 , h/2),rad) + o;
    112             p[k++] = GetReverse(Vector(w/2 , h/2),rad) + o;
    113             p[k++] = GetReverse(Vector(w/2 , -h/2),rad) + o;
    114             p[k++] = GetReverse(Vector(-w/2 , -h/2),rad) + o;
    115         }
    116 
    117         int m = ConvexHull(p , k , ch);
    118         double sumOfArea = ConvexPolygonArea(ch , m);
    119         double ans = area / sumOfArea * 100;
    120 
    121         printf("%.1f %%
    ",ans);
    122     }
    123     return 0;
    124 }
  • 相关阅读:
    C#多线程学习
    什么是启发式算法(转)
    进程与线程的一个简单解释
    Fedora19/18/17安装显卡驱动和无限网卡驱动
    MySQL性能优化的最佳20+条经验
    npm使用笔记
    函数式编程--curry化
    读js语言精粹收获
    如何解决mysql数据注入网站时中文字符显示问号
    如何实现区域内横向滚动条?
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/4036944.html
Copyright © 2020-2023  润新知