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个商家,,每个商家所需要的物品和物品的个数都不一样,,,每个发货地有的物品和物品的个数也不一样,,, 从不同的发货地到不同 ...
随机推荐
- orcale复制表结构及其数据
http://hi.baidu.com/tag/Oracle/feeds http://hi.baidu.com/gqftuisidibabiq/item/14d306cc87cbdf45bcef69 ...
- 设置符合条件的DataGridView的行的颜色的两种方法
Private Sub dgvInfo_RowPrePaint(sender As Object, e As DataGridViewRowPrePaintEventArgs) Handles dgv ...
- Twitter Bootstrap JavaScript插件
Twitter Bootstrap JavaScript插件本文收集了10款非常不错的JavaScript Twitter bootstrap扩展插件,利用Boostrap开发者可以节省大量的时间修复 ...
- PHP中使用Ajax
在PHP中使用Ajax来获取数据库中的数据,从而达到不刷新页面就可以获取. 首先在JS中定义变量如: var xmlHttp;function getXmlHttp(){ if(window.Acti ...
- .net创建并安装windows服务案例
1. 创建windows服务[引用博文]: 1. 将这个服务程序切换到设计视图2. 右击设计视图选择“添加安装程序”3. 切换到刚被添加的ProjectInstaller的设计视图4. 设置servi ...
- mac下Android apk 破解流程
相关工具下载:http://pan.baidu.com/s/1kTkOicn 首先你要有eclipse工具,在sdk目录下有如下工具可以使用 android:adb shell:进入交互shell ...
- sqlserver中数据的四种插入方式
1.insert into stuInfo(name,stuId) values('李洁','19291727')insert into stuInfo(name,stuId) values('李康' ...
- 取xml文件转成List<T>对象的两种方法
读取xml文件转成List<T>对象的两种方法(附源码) 读取xml文件转成List<T>对象的两种方法(附源码) 读取xml文件,是项目中经常要用到的,所以就总结一下,最 ...
- sublime text 3 插件:package control
sublime text 3安装package control import urllib.request,os,hashlib; h = 'eb2297e1a458f27d836c04bb0cbaf ...
- algorithm(算法)
algorithm(算法) STL中算可以分为三种, 1.变序型队列算法,可以改变容器内的数据: 2.非变序型队列算法,处理容器内的数据而不改变他们 : 3.通用数值算法,这涉及到很多专业领域的算术操 ...