链接

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

 #include<iostream>
#include <stdio.h>
#include <math.h>
#include<cstring>
#include<algorithm>
#define eps 1e-8
using namespace std;
const int MAXN=;
int m;
double r,tx,ty,ans;
int cCnt,curCnt;//此时cCnt为最终切割得到的多边形的顶点数、暂存顶点个数
struct point
{
double x,y;
point(double x=,double y=):x(x),y(y) {}
};
point points[MAXN],p[MAXN],q[MAXN];//读入的多边形的顶点(顺时针)、p为存放最终切割得到的多边形顶点的数组、暂存核的顶点
void getline(point x,point y,double &a,double &b,double &c) //两点x、y确定一条直线a、b、c为其系数
{
a = y.y - x.y;
b = x.x - y.x;
c = y.x * x.y - x.x * y.y;
}
void initial()
{
for(int i = ; i <= m; ++i)p[i] = points[i];
p[m+] = p[];
p[] = p[m];
cCnt = m;//cCnt为最终切割得到的多边形的顶点数,将其初始化为多边形的顶点的个数
}
point intersect(point x,point y,double a,double b,double c) //求x、y形成的直线与已知直线a、b、c、的交点
{
//cout<<a<<" "<<b<<" "<<c<<endl;
double u = fabs(a * x.x + b * x.y + c);
double v = fabs(a * y.x + b * y.y + c);
// cout<<u<<" "<<v<<endl;
point pt;
pt.x=(x.x * v + y.x * u) / (u + v);
pt.y=(x.y * v + y.y * u) / (u + v);//cout<<pt.x<<" -"<<pt.y<<" "<<x.x<<" "<<y.x<<endl;
return pt;
}
void cut(double a,double b ,double c)
{
curCnt = ;
for(int i = ; i <= cCnt; ++i)
{
if(a*p[i].x + b*p[i].y + c > -eps)q[++curCnt] = p[i];
else
{
if(a*p[i-].x + b*p[i-].y + c > eps)
{
q[++curCnt] = intersect(p[i-],p[i],a,b,c);
}
if(a*p[i+].x + b*p[i+].y + c > eps) //原理同上
{
q[++curCnt] = intersect(p[i],p[i+],a,b,c);
}
}
//cout<<q[curCnt].x<<" --"<<q[curCnt].y<<" "<<i<<" "<<p[i].x<<" "<<p[i].y<<endl;
}
for(int i = ; i <= curCnt; ++i)p[i] = q[i];
p[curCnt+] = q[];
p[] = p[curCnt];
cCnt = curCnt;
}
int dcmp(double x)
{
if(fabs(x)<eps) return ;
return x<?-:;
}
void solve(double x,double y,int flag)
{
double a,b,c;
if(flag == )
{
a = -*x+*tx,b = -*y+*ty,c = x*x+y*y-tx*tx-ty*ty;
}
else if(flag==)
{
a = *x-*tx,b = *y-*ty,c = tx*tx+ty*ty-x*x-y*y;
}
// if(dcmp(a)==0&&dcmp(b)==0&&dcmp(c)<=0)
// {
// ans = 0;
// return ;
// }
cut(a,b,c);
}
int main()
{
points[] = point(,);
points[] = point(,);
points[] = point(,);
points[] = point(,);
p[] = p[];
m = ;
tx = ,ty=;
char s[];
double x,y;
initial();
while(scanf("%lf%lf%s",&x,&y,s)!=EOF)
{
int flag;
if(strcmp(s,"Colder")==||strcmp(s,"Same")==)solve(x,y,);
if(strcmp(s,"Hotter")==||strcmp(s,"Same")==)solve(x,y,);
tx = x,ty=y;
double area = ;
for(int i = ; i <= cCnt; ++i)
{
//cout<<p[i].x<<" "<<p[i].y<<endl;
area += p[i].x * p[i + ].y - p[i + ].x * p[i].y;
}
area = fabs(area / 2.0);
ans = area;
printf("%.2f\n",ans);
}
}

poj2540Hotter Colder(半平面交)的更多相关文章

  1. POJ 2540 Hotter Colder(半平面交)

    Description The children's game Hotter Colder is played as follows. Player A leaves the room while p ...

  2. 【POJ 3525】Most Distant Point from the Sea(直线平移、半平面交)

    按逆时针顺序给出n个点,求它们组成的多边形的最大内切圆半径. 二分这个半径,将所有直线向多边形中心平移r距离,如果半平面交不存在那么r大了,否则r小了. 平移直线就是对于向量ab,因为是逆时针的,向中 ...

  3. 【BZOJ-2618】凸多边形 计算几何 + 半平面交 + 增量法 + 三角剖分

    2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 959  Solved: 489[Submit][Status] ...

  4. 【CSU1812】三角形和矩形 【半平面交】

    检验半平面交的板子. #include <stdio.h> #include <bits/stdc++.h> using namespace std; #define gg p ...

  5. 简单几何(半平面交+二分) LA 3890 Most Distant Point from the Sea

    题目传送门 题意:凸多边形的小岛在海里,问岛上的点到海最远的距离. 分析:训练指南P279,二分答案,然后整个多边形往内部收缩,如果半平面交非空,那么这些点构成半平面,存在满足的点. /******* ...

  6. poj 3335(半平面交)

    链接:http://poj.org/problem?id=3335     //大牛们常说的测模板题 ------------------------------------------------- ...

  7. poj3525Most Distant Point from the Sea(半平面交)

    链接 求凸多边形内一点距离边最远. 做法:二分+半平面交判定. 二分距离,每次让每条边向内推进d,用半平面交判定一下是否有核. 本想自己写一个向内推进..仔细一看发现自己的平面交模板上自带.. #in ...

  8. poj1474Video Surveillance(半平面交)

    链接 半平面交的模板题,判断有没有核.: 注意一下最后的核可能为一条线,面积也是为0的,但却是有的. #include<iostream> #include <stdio.h> ...

  9. 半平面交模板(O(n*n)&& O(n*log(n))

    摘自http://blog.csdn.net/accry/article/details/6070621 首先解决问题:什么是半平面? 顾名思义,半平面就是指平面的一半,我们知道,一条直线可以将平面分 ...

随机推荐

  1. Python源代码目录组织结构

  2. 《深度探索C++对象模型》2

    第四章: function语意学 非静态成员函数: 名称的特殊处理: 静态成员函数由于缺乏this指针,因此差不多等于非成员函数: virtual table布局(单一继承): 单一继承下函数调用: ...

  3. 八大排序算法之五--交换排序—冒泡排序(Bubble Sort)

    基本思想: 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将 ...

  4. 开源数据库连接池proxool

    可以根据自己的实际情况,选择不同的配置,可以选择properties.XML.Servlet等配置,官方网站上都有介绍.   1.下载proxool 地址:http://proxool.sourcef ...

  5. 周赛-Equidistant String 分类: 比赛 2015-08-08 15:44 6人阅读 评论(0) 收藏

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  6. 哈希-Gold Balanced Lineup 分类: POJ 哈希 2015-08-07 09:04 2人阅读 评论(0) 收藏

    Gold Balanced Lineup Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13215 Accepted: 3873 ...

  7. 如何快捷输入函数上方的注释代码(Summary)

    写完类或函数(注意必须写完,不然出现的信息会不完整)后,在其上方空行输入/**,然后回车,就可以为其添加Summary.    

  8. Android启动Activity的两种方式与四种启动模式

    1.在一个Activity中调用startActivity()方法 2.在一个Activity中调用startActivityRequest()方法. 重写onActivityResult方法,用来接 ...

  9. [美]莫提默 J. 艾德勒《如何阅读一本书》

      我最近在阅读一本书,这本书的书名叫<如何阅读一本书>(商务出版社,2015),顾名思义.   作者认为,阅读是一件跟写书一样复杂的活动,而许多人并不会阅读. 看过后,你可能会有“我真没 ...

  10. qbxt十一系列四

    关于考试:题目很难,T1和T3都失误,爆零orz 更正:第三组:不存在相同的字符|str|=26,26<=n<=100 [题目分析] 第一反应,组合数学:第二反应,有端倪:jn给了一道题G ...