zoukankan      html  css  js  c++  java
  • 【CSU1812】三角形和矩形 【半平面交】

    检验半平面交的板子。

      1 #include <stdio.h>
      2 #include <bits/stdc++.h>
      3 using namespace std;
      4 #define gg puts("gg");
      5 #define ll long long
      6 const double pi = acos(-1);
      7 const double eps = 1e-9;
      8 int dcmp(double x){
      9     if(fabs(x) < eps) return 0;
     10     return x > 0? 1 : -1;
     11 }
     12 struct Point{
     13     double x, y;
     14     Point(double x = 0, double y = 0):x(x), y(y){}
     15     Point operator +(const Point& a){ return Point(x+a.x, y+a.y);}
     16     Point operator -(const Point& a){ return Point(x-a.x, y-a.y);}
     17     Point operator *(const Point& a){ return Point(x*a.x, y*a.y);}
     18     Point operator *(const double a){ return Point(x*a, y*a); }
     19 };
     20 struct Line{
     21     Point p, v; double a;
     22     Line(){}
     23     Line(Point p, Point v):p(p), v(v){ a = atan2(v.y, v.x);}
     24     bool operator <(const Line& b) const{
     25         return a < b.a;
     26     }
     27 };
     28 
     29 double Cross(const Point& a, const Point& b){
     30     return a.x*b.y-a.y*b.x;
     31 }
     32 bool Onleft(Line L, Point P){
     33     return Cross(L.v, P-L.p) > 0;
     34 }
     35 Point GetIntersection(Line a, Line b){
     36     Point u = a.p-b.p;
     37     double t = Cross(b.v, u)/Cross(a.v, b.v);
     38     return a.p+a.v*t;
     39 }
     40 int Hpi(Line* L, int n, Point* poly, Point* p, Line* q){
     41     sort(L, L+n);
     42     int first, last;
     43     q[first = last = 0] = L[0];
     44     for(int i = 1; i < n; i++){
     45         while(first < last&&!Onleft(L[i], p[last-1])) last--;
     46         while(first < last&&!Onleft(L[i], p[first])) first++;
     47         q[++last] = L[i];
     48         if(fabs(Cross(q[last].v, q[last-1].v)) < eps){
     49             last--;
     50             if(Onleft(q[last], L[i].p)) q[last] = L[i];
     51         }
     52         if(first < last) p[last-1] = GetIntersection(q[last-1], q[last]);
     53     }
     54     while(first < last&&!Onleft(q[first], p[last-1])) last--;
     55     if(last-first <= 1) return 0;
     56     p[last] = GetIntersection(q[last], q[first]);
     57 
     58     int m = 0;
     59     for(int i = first; i <= last; i++)
     60         poly[m++] = p[i];
     61     return m;
     62 }
     63 double PolygonArea(Point* p, int n){
     64     double ans = 0;
     65     for(int i = 1; i < n-1; i++)
     66         ans += Cross(p[i]-p[0], p[i+1]-p[0]);
     67     return ans/2.0;
     68 }
     69 
     70 Line L[100], q[100];
     71 Point p[100], poly[100];
     72 
     73 double x[10], y[10];
     74 int main(){
     75     while(~scanf("%lf%lf", x+1, y+1)){
     76         for(int i = 2; i <= 4; i++)
     77             scanf("%lf%lf", x+i, y+i);
     78         p[0] = Point(x[1], y[1]);
     79         p[1] = Point(x[1], y[2]);
     80         p[2] = Point(x[2], y[1]);
     81         if(Onleft(Line(p[0], p[1]-p[0]), p[2]))
     82             L[0] = Line(p[0], p[1]-p[0]);
     83         else
     84             L[0] = Line(p[1], p[0]-p[1]);
     85 
     86         if(Onleft(Line(p[0], p[2]-p[0]), p[1]))
     87             L[1] = Line(p[0], p[2]-p[0]);
     88         else
     89             L[1] = Line(p[2], p[0]-p[2]);
     90 
     91         if(Onleft(Line(p[1], p[2]-p[1]), p[0]))
     92             L[2] = Line(p[1], p[2]-p[1]);
     93         else
     94             L[2] = Line(p[2], p[1]-p[2]);
     95         ///////////////////////////////////////
     96         L[3] = Line(Point(x[3], y[3]), Point(1, 0));
     97         L[4] = Line(Point(x[4], y[3]), Point(0, 1));
     98         L[5] = Line(Point(x[4], y[4]), Point(-1, 0));
     99         L[6] = Line(Point(x[3], y[4]), Point(0, -1));
    100         int tot = Hpi(L, 7, poly, p, q);
    101         if(tot == 0) printf("%.8f
    ", 0.0);
    102         else
    103             printf("%.8f
    ", PolygonArea(poly, tot));
    104     }
    105     return 0;
    106 }
  • 相关阅读:
    如何在phpstorm中安装xdebug调试工具
    php判断远程图片或文件是否存在
    在centos6.7中lnmp环境下安装swoole插件和pthreads插件
    linux中常用的命令
    PHP获取远程文件的几种方式
    TextView实现长按复制功能
    android 字体大小自适应
    Android 相机,视频录制
    转 数据存储方式
    转 String,StringBuffer与StringBuilder的区别??
  • 原文地址:https://www.cnblogs.com/dirge/p/6039155.html
Copyright © 2011-2022 走看看