POJ 1474

半平面交模板

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

const int MAXN=110;
const double eps=1e-8;
struct point {
	double x,y;
};
point pts[MAXN],p[MAXN],q[MAXN];
int ansCnt,curCnt,n;

double DB(double d){
	if(d>eps) return 1;
	if(d<-eps) return -1;
	return 0;
}

void initial(){
	for(int i=1;i<=n;i++)
	p[i]=pts[i];
	p[n+1]=p[1];
	p[0]=p[n];
	ansCnt=n;
}

void getline(point x,point y,double &a,double &b,double &c){
	a=y.y-x.y;
	b=x.x-y.x;
	c=x.y*y.x-x.x*y.y;
}

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=0;
	for(int i=1;i<=ansCnt;i++){
		if(DB(a*p[i].x+b*p[i].y+c)>=0) q[++curCnt]=p[i];
		else {
			if(DB(a*p[i-1].x+b*p[i-1].y+c)>0) q[++curCnt]=intersect(p[i],p[i-1],a,b,c);
			if(DB(a*p[i+1].x+b*p[i+1].y+c)>0) q[++curCnt]=intersect(p[i],p[i+1],a,b,c);
		}
	}
	for(int i=1;i<=curCnt;i++){
		p[i]=q[i];
	}
	ansCnt=curCnt;
	p[ansCnt+1]=p[1]; p[0]=p[ansCnt];
}

void slove(){
	initial();
	for(int i=1;i<=n;i++){
		double a,b,c;
		getline(pts[i],pts[i+1],a,b,c);
		cut(a,b,c);
	}
}

int main(){
	int cas=0;
	while(scanf("%d",&n),n){
		cas++;
		for(int i=1;i<=n;i++)
		scanf("%lf%lf",&pts[i].x,&pts[i].y);
		pts[n+1]=pts[1];
		slove();
		printf("Floor #%d\n",cas);
		if(ansCnt>=1)
		printf("Surveillance is possible.\n");
		else printf("Surveillance is impossible.\n");
		printf("\n");
	}
	return 0;
}

  

POJ 1474

时间: 2024-10-05 10:57:49

POJ 1474的相关文章

半平面交 模板 poj 3335 poj 3130 poj 1474 判断半平面交是否为空集

半平面交模板 const double pi= acos(-1.0); #define arc(x) (x / 180 * pi) const double EPS = 1e-8; const int Max_N = 105; struct Point{ double x,y; Point(){} Point(double x, double y):x(x),y(y){} Point operator - (Point p){ return Point(x- p.x , y - p.y ) ;

POJ 1474 多边形的核(半平面交)

Video Surveillance Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3145   Accepted: 1391 Description A friend of yours has taken the job of security officer at the Star-Buy Company, a famous depart- ment store. One of his tasks is to ins

poj 3335 /poj 3130/ poj 1474 半平面交 判断核是否存在 / poj1279 半平面交 求核的面积

1 /*************** 2 poj 3335 点序顺时针 3 ***************/ 4 #include <iostream> 5 #include <cmath> 6 #include <algorithm> 7 using namespace std; 8 const double eps = 1e-8; 9 const double maxn = 0x7f7f7f7f; 10 int dcmp(double x){ 11 if(fabs(

Video Surveillance POJ - 1474 (半平面交)

Video Surveillance POJ - 1474 题意:多边形是否有内核 思路:平面半交题,注意直线的存入顺序 1 // 2 // Created by HJYL on 2020/2/6. 3 // 4 #include<iostream> 5 #include<stdio.h> 6 #include<algorithm> 7 #include<math.h> 8 using namespace std; 9 typedef long long l

poj 1474 Video Surveillance (半平面交)

链接:http://poj.org/problem?id=1474 Video Surveillance Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3247   Accepted: 1440 Description A friend of yours has taken the job of security officer at the Star-Buy Company, a famous depart- ment

POJ 1474 Video Surveillance 半平面交

和POJ 3130,POJ 3335一样.求多边形的核 #include <iostream> #include <cstdio> #include <cmath> #define eps 1e-18 using namespace std; const int MAXN = 105; double a, b, c; int n, cnt; struct Point { double x, y; }point[MAXN], p[MAXN], tp[MAXN]; void

POJ 1474 Video Surveillance 半平面交求多边形是否有核

裸的半平面交求多边形是否有核. 多边形的核: 在多边形核上的点可以看到多边形的所有顶点,凸多边形的核显然就是多边形本身. 多边形的核是一个凸包,对多边形的所有边都做向着多边形的半平面交在判断一下是否构成凸包就可以了 一样的题目还有POJ3335 Video Surveillance Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3438   Accepted: 1523 Description A friend of y

POJ 1474 Video Surveillance 半平面交求多边形内核存在性

题目大意:一个楼有很多层,每一层是一个多多边形,问每一层是否有点能够看到这一层的全貌. 思路:半平面交解多边形内核存在性,裸题.题中怎么没写数据范围?..让我还re几次.. CODE: #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 3010 #define EPS 1e-8 #de

[转] POJ几何分类

转自:http://blog.csdn.net/tyger/article/details/4480029 计算几何题的特点与做题要领:1.大部分不会很难,少部分题目思路很巧妙2.做计算几何题目,模板很重要,模板必须高度可靠.3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面大部分是模板.如果代码一片混乱,那么会严重影响做题正确率.4.注意精度控制.5.能用整数的地方尽量用整数,要想到扩大数据的方法(扩大一倍,或扩大sqrt2).因为整数不用考虑浮点误差,而且运算比浮点快. 一.点