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个商家,,每个商家所需要的物品和物品的个数都不一样,,,每个发货地有的物品和物品的个数也不一样,,, 从不同的发货地到不同 ...
随机推荐
- zepto.js的基本介绍与使用
最近看到了一篇文章,是介绍一种新的js框架,名为zepto.js,他适用于移动设备已经桌面浏览器除了ie系列的.. 他兼容jquery的API,所以学起来或用起来并不吃力.他比jquery的优势在于1 ...
- jquery简单异步读取xml文件
$.ajax({ url: '../XmlFiles/Sm.xml', async: true, cache: false, ...
- 对Extjs中store的多种操作
Store.getCount()返回的是store中的所有数据记录,然后使用for循环遍历整个store,从而得到每条记录. 除了使用getCount()的方法外,还可以使用each()函数,如下面的 ...
- Web应用和RESTful架构
Web应用和RESTful架构 单页Web应用 概述 单页Web应用并不是突然诞生的一门新技术,而是web展示的一种新的尝试.它将所有的动作局限于一个Web页面,在加载站点首页的时候就加载站点需要的J ...
- SpringMVC格式化显示
SpringMVC学习系列(7) 之 格式化显示 在系列(6)中我们介绍了如何验证提交的数据的正确性,当数据验证通过后就会被我们保存起来.保存的数据会用于以后的展示,这才是保存的价值.那么在展示的时候 ...
- ASP.NET SignalR 2.0入门指南
ASP.NET SignalR 2.0入门指南 介绍SignalR ASP.NET SignalR 是一个为 ASP.NET 开发人员的库,简化了将实时 web 功能添加到应用程序的过程.实时Web功 ...
- xmlDom
加载并解析xml文件: <script type="text/javascript"> try //Internet Explorer { xmlDoc=new Act ...
- D6
今天依旧很惨...本来第二题可以A的,感觉很久没有碰数学,出现这样的低级错误,简直逗了...晚上的话打算找了书店,静下心来看点书进去吧 但是其他题目就不太好写了..我直接发题解好了 T1:贪心 其实贪 ...
- Model Binding To A List
[文章来源see here] Using the DefaultModelBinder in ASP.NET MVC, you can bind submitted form values to ar ...
- 【hanoi】hanoi移动次数和移动步骤
#include<stdio.h> #include<stdlib.h> //移动次数 int hanoi(int num) { ; ) { ; } else { all = ...