zoukankan      html  css  js  c++  java
  • poj2540Hotter Colder(半平面交)

    链接

    根据距离可以列得直线方程,附上初始矩形的四个顶点,依次用直线切割。

      1 #include<iostream>
      2 #include <stdio.h>
      3 #include <math.h>
      4 #include<cstring>
      5 #include<algorithm>
      6 #define eps 1e-8
      7 using namespace std;
      8 const int MAXN=1550;
      9 int m;
     10 double r,tx,ty,ans;
     11 int cCnt,curCnt;//此时cCnt为最终切割得到的多边形的顶点数、暂存顶点个数
     12 struct point
     13 {
     14     double x,y;
     15     point(double x=0,double y=0):x(x),y(y) {}
     16 };
     17 point points[MAXN],p[MAXN],q[MAXN];//读入的多边形的顶点(顺时针)、p为存放最终切割得到的多边形顶点的数组、暂存核的顶点
     18 void getline(point x,point y,double &a,double &b,double   &c) //两点x、y确定一条直线a、b、c为其系数
     19 {
     20     a = y.y - x.y;
     21     b = x.x - y.x;
     22     c = y.x * x.y - x.x * y.y;
     23 }
     24 void initial()
     25 {
     26     for(int i = 1; i <= m; ++i)p[i] = points[i];
     27     p[m+1] = p[1];
     28     p[0] = p[m];
     29     cCnt = m;//cCnt为最终切割得到的多边形的顶点数,将其初始化为多边形的顶点的个数
     30 }
     31 point intersect(point x,point y,double a,double b,double c) //求x、y形成的直线与已知直线a、b、c、的交点
     32 {
     33     //cout<<a<<" "<<b<<" "<<c<<endl;
     34     double u = fabs(a * x.x + b * x.y + c);
     35     double v = fabs(a * y.x + b * y.y + c);
     36     // cout<<u<<" "<<v<<endl;
     37     point pt;
     38     pt.x=(x.x * v + y.x * u) / (u + v);
     39     pt.y=(x.y * v + y.y * u) / (u + v);//cout<<pt.x<<" -"<<pt.y<<" "<<x.x<<" "<<y.x<<endl;
     40     return  pt;
     41 }
     42 void cut(double a,double b ,double c)
     43 {
     44     curCnt = 0;
     45     for(int i = 1; i <= cCnt; ++i)
     46     {
     47         if(a*p[i].x + b*p[i].y + c > -eps)q[++curCnt] = p[i];
     48         else
     49         {
     50             if(a*p[i-1].x + b*p[i-1].y + c > eps)
     51             {
     52                 q[++curCnt] = intersect(p[i-1],p[i],a,b,c);
     53             }
     54             if(a*p[i+1].x + b*p[i+1].y + c > eps) //原理同上
     55             {
     56                 q[++curCnt] = intersect(p[i],p[i+1],a,b,c);
     57             }
     58         }
     59         //cout<<q[curCnt].x<<" --"<<q[curCnt].y<<" "<<i<<" "<<p[i].x<<" "<<p[i].y<<endl;
     60     }
     61     for(int i = 1; i <= curCnt; ++i)p[i] = q[i];
     62     p[curCnt+1] = q[1];
     63     p[0] = p[curCnt];
     64     cCnt = curCnt;
     65 }
     66 int dcmp(double x)
     67 {
     68     if(fabs(x)<eps) return 0;
     69     return x<0?-1:1;
     70 }
     71 void solve(double x,double y,int flag)
     72 {
     73     double a,b,c;
     74     if(flag == 1)
     75     {
     76         a = -2*x+2*tx,b = -2*y+2*ty,c = x*x+y*y-tx*tx-ty*ty;
     77     }
     78     else if(flag==2)
     79     {
     80         a = 2*x-2*tx,b = 2*y-2*ty,c = tx*tx+ty*ty-x*x-y*y;
     81     }
     82 //    if(dcmp(a)==0&&dcmp(b)==0&&dcmp(c)<=0)
     83 //    {
     84 //        ans = 0;
     85 //        return ;
     86 //    }
     87     cut(a,b,c);
     88 }
     89 int main()
     90 {
     91     points[1] = point(0,0);
     92     points[2] = point(0,10);
     93     points[3] = point(10,10);
     94     points[4] = point(10,0);
     95     p[5] = p[1];
     96     m = 4;
     97     tx = 0,ty=0;
     98     char s[10];
     99     double x,y;
    100     initial();
    101     while(scanf("%lf%lf%s",&x,&y,s)!=EOF)
    102     {
    103         int flag;
    104         if(strcmp(s,"Colder")==0||strcmp(s,"Same")==0)solve(x,y,1);
    105         if(strcmp(s,"Hotter")==0||strcmp(s,"Same")==0)solve(x,y,2);
    106         tx = x,ty=y;
    107         double area = 0;
    108         for(int i = 1; i <= cCnt; ++i)
    109         {
    110             //cout<<p[i].x<<" "<<p[i].y<<endl;
    111             area += p[i].x * p[i + 1].y - p[i + 1].x * p[i].y;
    112         }
    113         area = fabs(area / 2.0);
    114         ans = area;
    115         printf("%.2f
    ",ans);
    116     }
    117 }
    View Code
  • 相关阅读:
    Spring Bean Expression Language(EL)
    Spring-web-security Issue (Access is denied. User must have one of the these roles: ACTUATOR)
    数据库学习笔记day04
    数据库学习笔记day03
    数据库学习笔记day01+day02
    Java学习笔记--线程day01
    Java学习笔记-Java文件操作流
    第一次月测题
    第一次月测内容疑问总结
    java核心API
  • 原文地址:https://www.cnblogs.com/shangyu/p/3889305.html
Copyright © 2011-2022 走看看