POJ 半平面交 模板题 三枚
给出三个半平面交的裸题。
不会的上百度上谷(gu)歌(gou)一下。
毕竟学长的语文是体育老师教的。(卡格玩笑,别当真。)
这种东西明白就好,代码可以当模板。
//poj1474 Video Surveillance
//点集默认顺时针
//算法参考:http://www.cnblogs.com/huangxf/p/4067763.html
#include<cstdio>
#include<cmath>
using namespace std;
const int N=1e5+;
struct point{
double x,y;
}p[N],tmp[N],q[N];
double a,b,c;int cas,n,m;
void get_line(point p1,point p2){
a=p2.y-p1.y;
b=p1.x-p2.x;
c=p2.x*p1.y -p2.y*p1.x;
}
point cross(point p1,point p2){
double u=fabs(a*p1.x+b*p1.y+c);
double v=fabs(a*p2.x+b*p2.y+c);
point ret;
ret.x=(v*p1.x+u*p2.x)/(u+v);
ret.y=(v*p1.y+u*p2.y)/(u+v);
return ret;
}
void cut(){
int tm=;//顺时针都是> or >=;否则都取反
for(int i=;i<=m;i++){
if(a*q[i].x+b*q[i].y+c>=){
// c由于精度问题,可能会偏小,所以有些点本应在右侧而没在,故应该接着判断
tmp[++tm]=q[i];
}
else{
if(a*q[i-].x+b*q[i-].y+c>)
//如果p[i-1]在直线的右侧的话,则将p[i],p[i-1]形成的直线与已知直线的交点作为核的一个顶点
//(这样的话,由于精度的问题,核的面积可能会有所减少)
tmp[++tm]=cross(q[i-],q[i]);
if(a*q[i+].x+b*q[i+].y+c>)
tmp[++tm]=cross(q[i],q[i+]);
}
}
for(int i=;i<=tm;i++) q[i]=tmp[i];//将tmp中暂存的核的顶点转移到q中
q[]=q[tm];q[tm+]=q[];m=tm;
}
void solve(){
for(int i=;i<=n;i++) q[i]=p[i];
q[]=p[n];q[n+]=q[];p[n+]=p[];
//读入的多边形的顶点(顺时针)、p为存放最终切割得到的多边形顶点的数组、暂存核的顶点
m=n;//m为最终切割得到的多边形的顶点数,将其初始化为多边形的顶点的个数
for(int i=;i<=n;i++){
get_line(p[i],p[i+]);
cut();
}
}
int main(){
for(cas=;~scanf("%d",&n)&&n;cas++){
for(int i=;i<=n;i++) scanf("%lf%lf",&p[i].x,&p[i].y);
solve();
printf("Floor #%d\nSurveillance is ",cas);
puts(m?"possible.\n":"impossible.\n");
}
return ;
}
以下同理
//poj3335 Rotating Scoreboard
//点集默认顺时针
#include<cstdio>
#include<cmath>
using namespace std;
const int N=1e5+;
struct point{
double x,y;
}p[N],tmp[N],q[N];
double a,b,c;int cas,n,m;
void get_line(point p1,point p2){
a=p2.y-p1.y;
b=p1.x-p2.x;
c=p2.x*p1.y -p2.y*p1.x;
}
point cross(point p1,point p2){
double u=fabs(a*p1.x+b*p1.y+c);
double v=fabs(a*p2.x+b*p2.y+c);
point ret;
ret.x=(v*p1.x+u*p2.x)/(u+v);
ret.y=(v*p1.y+u*p2.y)/(u+v);
return ret;
}
void cut(){
int tm=;
for(int i=;i<=m;i++){
if(a*q[i].x+b*q[i].y+c>=){
tmp[++tm]=q[i];
}
else{
if(a*q[i-].x+b*q[i-].y+c>)
tmp[++tm]=cross(q[i-],q[i]);
if(a*q[i+].x+b*q[i+].y+c>)
tmp[++tm]=cross(q[i],q[i+]);
}
}
for(int i=;i<=tm;i++) q[i]=tmp[i];
q[]=q[tm];q[tm+]=q[];m=tm;
}
void solve(){
for(int i=;i<=n;i++) q[i]=p[i];
q[]=p[n];q[n+]=q[];p[n+]=p[];
m=n;
for(int i=;i<=n;i++){
get_line(p[i],p[i+]);
cut();
}
}
int main(){
for(scanf("%d",&cas);cas--;){
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%lf%lf",&p[i].x,&p[i].y);
solve();
puts(m?"YES":"NO");
}
return ;
}
//poj3130 How I Mathematician Wonder What You Are!
//点集默认逆时针
#include<cstdio>
#include<cmath>
using namespace std;
const int N=1e5+;
struct point{
double x,y;
}p[N],tmp[N],q[N];
double a,b,c;int cas,n,m;
void get_line(point p1,point p2){
a=p2.y-p1.y;
b=p1.x-p2.x;
c=p2.x*p1.y -p2.y*p1.x;
}
point cross(point p1,point p2){
double u=fabs(a*p1.x+b*p1.y+c);
double v=fabs(a*p2.x+b*p2.y+c);
point ret;
ret.x=(v*p1.x+u*p2.x)/(u+v);
ret.y=(v*p1.y+u*p2.y)/(u+v);
return ret;
}
void cut(){
int tm=;
for(int i=;i<=m;i++){
if(a*q[i].x+b*q[i].y+c<=){
tmp[++tm]=q[i];
}
else{
if(a*q[i-].x+b*q[i-].y+c<)
tmp[++tm]=cross(q[i-],q[i]);
if(a*q[i+].x+b*q[i+].y+c<)
tmp[++tm]=cross(q[i],q[i+]);
}
}
for(int i=;i<=tm;i++) q[i]=tmp[i];
q[]=q[tm];q[tm+]=q[];m=tm;
}
void solve(){
for(int i=;i<=n;i++) q[i]=p[i];
q[]=p[n];q[n+]=q[];p[n+]=p[];
m=n;
for(int i=;i<=n;i++){
get_line(p[i],p[i+]);
cut();
}
}
int main(){
while(scanf("%d",&n)==&&n){
for(int i=;i<=n;i++) scanf("%lf%lf",&p[i].x,&p[i].y);
solve();
puts(m?"":"");
}
return ;
}
POJ 半平面交 模板题 三枚的更多相关文章
- 再来一道测半平面交模板题 Poj1279 Art Gallery
地址:http://poj.org/problem?id=1279 题目: Art Gallery Time Limit: 1000MS Memory Limit: 10000K Total Su ...
- POJ 3525 /// 半平面交 模板
题目大意: 给定n,接下来n行逆时针给定小岛的n个顶点 输出岛内离海最远的点与海的距离 半平面交模板题 将整个小岛视为由许多半平面围成 那么以相同的比例缩小这些半平面 一直到缩小到一个点时 那个点就是 ...
- bzoj 2618 半平面交模板+学习笔记
题目大意 给你n个凸多边形,求多边形的交的面积 分析 题意\(=\)给你一堆边,让你求半平面交的面积 做法 半平面交模板 1.定义半平面为向量的左侧 2.将所有向量的起点放到一个中心,以中心参照进行逆 ...
- 半平面交模板(O(n*n)&& O(n*log(n))
摘自http://blog.csdn.net/accry/article/details/6070621 首先解决问题:什么是半平面? 顾名思义,半平面就是指平面的一半,我们知道,一条直线可以将平面分 ...
- POJ Oulipo KMP 模板题
http://poj.org/problem?id=3461 Oulipo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4 ...
- bzoj 2618【半平面交模板】
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> usin ...
- POJ Oulipo(KMP模板题)
题意:找出模板在文本串中出现的次数 思路:KMP模板题 #include<cstdio> #include<cstring> #include<cmath> #in ...
- hdu 2544 hdu 1874 poj 2387 Dijkstra 模板题
hdu 2544 求点1到点n的最短路 无向图 Sample Input2 1 //结点数 边数1 2 3 //u v w3 31 2 52 3 53 1 20 0 Sample Output32 ...
- Minimum Cost POJ - 2516(模板题。。没啥好说的。。)
题意: 从发货地到商家 送货 求送货花费的最小费用... 有m个发货地,,,n个商家,,每个商家所需要的物品和物品的个数都不一样,,,每个发货地有的物品和物品的个数也不一样,,, 从不同的发货地到不同 ...
随机推荐
- 苹果公司的新的编程语言 Swift 高级语言(十五)--协议
协议定义了适合某个特定任务或功能须要的方法.属性和其他需求的一个蓝图.协议本身不提供这些需求的实现,它仅仅是描写叙述了一个任务或功能实现的蓝图. 协议与java 语言中的接口定义类似,都是描写叙述了一 ...
- Progit Update Check Page
######### ######### #########
- ODBC操作数据库
/*ODBC使用步骤:(ODBC数据源由微软平台提供) * 1.配置ODBC数据源(控制面板->管理工具->ODBC数据源) * 2.加载并注册驱动程序,导入java.sql.*包 * 3 ...
- 第三方控件netadvantage UltraWebGrid总结
1.个人习惯前台绑定好实体字段,禁止自动生成:一些属性设置:AutoGenerateColumns="false" <igtbl:UltraWebGrid ID=" ...
- Git工作流:中心工作流(翻译)
使用Git作为版本控制器,有众多可能的工作流(Workflow),这使得我们这些新鸟不知道在实际工作中不知道该选择哪种工作流.这里我们对最常见的Git工作流做一个对比,为企业团队提供一个参考. 正如你 ...
- iOS基础 - 控制器
一.当两个控制器互为父子关系的时候,它们的view一般也是互为父子关系 比如想添加A控制器的view到B控制器的view上,就应该让A控制器成为B控制器的子控制器,而B控制器就称为A控制器的父控制器 ...
- Webapi备忘-20140109
r01的翻译系列:http://www.cnblogs.com/r01cn/category/428069.html 接收FROM数据 Webapi接收表单数据,如果有多个数据比如x=1&y= ...
- IP包头
上图为IP报头的结构图,下图为捕捉的IP数据包
- c/c++操作访问数据,是堆中的数据快还是栈中的数据快
这里的问题其实问的是对堆与栈的数据访问有什么不同. 观察如下代码: #include<stdio.h> #include<iostream> using namespace s ...
- 一个HttpWebRequest工具类
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.N ...