题意:求问多边形的核(能够看到所有点的点)是否存在。

/*
对于这样的题目,我只能面向std编程了,然而还是不理解。
算法可参考:http://www.cnblogs.com/huangxf/p/4067763.html
*/
#include<cstdio>
#include<iostream>
#include<cmath>
#define N 110
using namespace std;
int m;
double r;
int cCnt,curCnt;////此时cCnt为最终切割得到的多边形的顶点数、暂存顶点个数
struct point{
double x,y;
};
//读入的多边形的顶点(顺时针)、p为存放最终切割得到的多边形顶点的数组、暂存核的顶点
point points[N],p[N],q[N];
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){
double u=fabs(a*x.x+b*x.y+c);
double v=fabs(a*y.x+b*y.y+c);
point pt;
pt.x=(x.x * v + y.x * u) / (u + v);
pt.y=(x.y * v + y.y * u) / (u + v);
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>=) q[++curCnt]=p[i];
// c由于精度问题,可能会偏小,所以有些点本应在右侧而没在,故应该接着判断
else {
if(a*p[i-].x+b*p[i-].y+c>){
//如果p[i-1]在直线的右侧的话,则将p[i],p[i-1]形成的直线与已知直线的交点作为核的一个顶点
//(这样的话,由于精度的问题,核的面积可能会有所减少)
q[++curCnt]=intersect(p[i],p[i-],a,b,c);
}
if(a*p[i+].x+b*p[i+].y+c>){
q[++curCnt]=intersect(p[i],p[i+],a,b,c);
}
}
}
for(int i=;i<=curCnt;i++) p[i]=q[i];//将q中暂存的核的顶点转移到p中
p[curCnt+]=q[];p[]=p[curCnt];
cCnt=curCnt;
}
void solve(){
//注意:默认点是顺时针,如果题目不是顺时针,规整化方向
initial();
for(int i=;i<=m;i++){
double a,b,c;
getline(points[i],points[i+],a,b,c);
cut(a,b,c);
}
}
void guizhenghua(){
//规整化方向,逆时针变顺时针,顺时针变逆时针
for(int i=;i<=m;i++) q[i]=points[m-i+];
for(int i=;i<=m;i++) points[i]=q[i];
}
int main(){
int t;
while(cin>>m){
if(m==) break;
for(int i=;i<=m;i++)
scanf("%lf%lf",&points[i].x,&points[i].y);
guizhenghua();
points[m+]=points[];
solve();
if(cCnt<) printf("0\n");
else printf("1\n");
}
return ;
}

How I Mathematician Wonder What You Are!(poj 3130)的更多相关文章

  1. Games:取石子游戏(POJ 1067)

    取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 37662   Accepted: 12594 Descripti ...

  2. BFS 或 同余模定理(poj 1426)

    题目:Find The Multiple 题意:求给出的数的倍数,该倍数是只由 1与 0构成的10进制数. 思路:nonzero multiple  非零倍数  啊. 英语弱到爆炸,理解不了题意... ...

  3. 并查集+关系的传递(poj 1182)

    题目:食物链 题意:给定一些关系.判断关系的正确性,后给出的关系服从之前的关系: 思路:难点不在并查集,在于关系的判断,尤其是子节点与根节点的关系的判断: 这个关系看似没给出,但是给出子节点与父节点的 ...

  4. 01背包问题:Charm Bracelet (POJ 3624)(外加一个常数的优化)

    Charm Bracelet    POJ 3624 就是一道典型的01背包问题: #include<iostream> #include<stdio.h> #include& ...

  5. 昂贵的聘礼(poj 1062)

    Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低 ...

  6. Collecting Bugs(POJ 2096)

    Collecting Bugs Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 3064   Accepted: 1505 ...

  7. Scout YYF I(POJ 3744)

    Scout YYF I Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5565   Accepted: 1553 Descr ...

  8. Power string(poj 2406)

    题目大意,给出一个字符串s,求最大的k,使得s能表示成a^k的形式,如 abab 可以表示成(ab)^2: 方法:首先 先求kmp算法求出next数组:如果 len mod (len-next[len ...

  9. A - TOYS(POJ - 2318) 计算几何的一道基础题

    Calculate the number of toys that land in each bin of a partitioned toy box. 计算每一个玩具箱里面玩具的数量 Mom and ...

随机推荐

  1. queue,指针求最短路的区别

    这里以spfa为例://都用邻接表存边: 指针: int h=1,t=1; q[h]=x; while(h<=t){ int u=q[h]; vis[u]=0; for(int i=head[u ...

  2. geek 的博客

    hexo 适合前端 geek 的博客   原文出自:http://www.qiangji.tk/hexo%E9%80%82%E5%90%88%E5%89%8D%E7%AB%AFgeek%E7%9A%8 ...

  3. C语言变参函数的编写

    1. 引言 一般我们编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的实际参数.但在某些情况下我 们希望函数的参数个数可以根据需要确定,因此c语言引入可变参数函数.典型的 ...

  4. Python基础-输入输出(IO)

    Python基础-输入输出(IO) 程序会有输入和输出,输入可以从标准输入或是从一个文件读入数据,程序的输出可以以一种友好可读的方式(human-readable)打印出来,或是写进一个文件,而标准输 ...

  5. 把事务封装成类似Serializable用法的特性

    把事务封装成类似Serializable用法的特性 最近几天上班没事可做就想着整理常用的类库方法,验证.消息.分页.模版引擎.数据库操作.ini操作.文本操作.xml操作等,最后就是现在这个事务特性. ...

  6. Ubuntu12.04安装配置Theano

    上次写了一个关于DL的开篇内容,本来说是要继续跟进的,后来教研室里面出了一些事情,加上写论文.和隔壁教研室做实验,就一直拖到现在.早就让小K配置环境研究研究Theano,这货和我一样也发拖延症了,理由 ...

  7. WPF实现打印功能

    WPF实现打印功能 在WPF 中可以通过PrintDialog 类方便的实现应用程序打印功能,本文将使用一个简单实例进行演示.首先在VS中编辑一个图形(如下图所示). 将需要打印的内容放入同一个< ...

  8. 做了一个quartz用到的cron在线生成器

    做了一个quartz用到的cron在线生成器 做了一个quartz用到的cron在线生成器   做这个的目的是前期在做Quartz时老是不知道如何去写,我想也有很多人和我一样吧. 有一次使用了一个老外 ...

  9. flowplayer视频播放插件

    flowplayer视频播放插件 最近项目中需要添加播放视频的功能,视频文件是flv格式的.在网上找了一些jQuery视频播放插件,还是觉得“flowplayer”要好一些.特将使用方法记录一下. f ...

  10. 挖一下插件v1.3版本发布

    Chrome图片下载插件,支持网页截屏 v.1.3更新说明: 新增屏蔽图片功能,可以将不想看到的图片隐藏 新增屏蔽图片管理选项,可以根据实际的需求取消屏蔽图片 优化操作界面 项目地址:https:// ...