计算几何/半平面交


  裸的半平面交,关于半平面交的入门请看神犇博客:http://blog.csdn.net/accry/article/details/6070621

  然而代码我是抄的proverbs的……

  大体思路是这样的:(一个增量算法)

    维护一个当前的半平面交的点集,每次用一条直线去cut它:

      依次枚举“凸包”上的点,点在直线左边则保留下来了,否则就丢掉=。=

      同时判一下如果“凸包”上连续的两个点分别在直线两侧,就加入这条“凸包”上的线段与直线的交点= =

    然后新点集get!

  最后求个面积>_>

  有个trick是如果给的顺序是顺时针,需要反转成逆时针(用算多边形面积的方法就可以判断,如果是逆时针,面积为正)

 Source Code
Problem: User: sdfzyhy
Memory: 720K Time: 32MS
Language: G++ Result: Accepted Source Code //POJ 1279
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
inline int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
return v*sign;
}
const int N=1e5+;
const double INF=1e9;
typedef long long LL;
/******************tamplate*********************/
const double eps=1e-;
int dcmp(double x){return x>eps ? : x<-eps ? - : ;}
struct Poi{
double x,y;
Poi(){}
Poi(double x,double y):x(x),y(y){}
void read(){scanf("%lf%lf",&x,&y);}
}p[N],tp[N],s[N],o;
typedef Poi Vec;
Vec operator - (const Poi&a,const Poi &b){return Vec(a.x-b.x,a.y-b.y);} int n;
double Cross(const Vec &a,const Vec &b){return a.x*b.y-a.y*b.x;}
double getarea(Poi *p,int n){
double ans=0.0;
F(i,,n) ans+=Cross(p[i]-o,p[i+]-o);
return ans*0.5;
}
Poi getpoint(const Poi &a,const Poi &b,const Poi &c,const Poi &d){
Poi ans,tmp=b-a;
double k1=Cross(d-a,c-a),k2=Cross(c-b,d-b);
ans.x=a.x+tmp.x*k1/(k1+k2);
ans.y=a.y+tmp.y*k1/(k1+k2);
return ans;
} void init(){
n=getint();
F(i,,n) p[i].read();
p[n+]=p[];
}
void Change(){
F(i,,n>>) swap(p[i],p[n-i+]);
p[n+]=p[];
}
void getcut(){
tp[]=tp[]=Poi(-INF,-INF);
tp[]=Poi(INF,-INF);
tp[]=Poi(INF,INF);
tp[]=Poi(-INF,INF);
int num=,size=;
F(i,,n){
size=;
F(j,,num){
if (dcmp(Cross(p[i+]-p[i],tp[j]-p[i]))>=)
s[++size]=tp[j];
if (dcmp(Cross(p[i+]-p[i],tp[j]-p[i]) *
Cross(p[i+]-p[i],tp[j+]-p[i]))<)
s[++size]=getpoint(p[i],p[i+],tp[j],tp[j+]);
}
s[size+]=s[];
F(j,,size+) tp[j]=s[j];
num=size;
}
n=num;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("1279.in","r",stdin);
freopen("1279.out","w",stdout);
#endif
int T=getint();
while(T--){
init();
if (dcmp(getarea(p,n))<=) Change();
getcut();
printf("%.2f\n",fabs(getarea(s,n)));
}
return ;
}
Art Gallery
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 5805   Accepted: 2455

Description

The art galleries of the new and very futuristic building of the Center for Balkan Cooperation have the form of polygons (not necessarily convex). When a big exhibition is organized, watching over all of the pictures is a big security concern. Your task is that for a given gallery to write a program which finds the surface of the area of the floor, from which each point on the walls of the gallery is visible. On the figure 1. a map of a gallery is given in some co-ordinate system. The area wanted is shaded on the figure 2.

Input

The
number of tasks T that your program have to solve will be on the first
row of the input file. Input data for each task start with an integer N,
5 <= N <= 1500. Each of the next N rows of the input will contain
the co-ordinates of a vertex of the polygon ? two integers that fit in
16-bit integer type, separated by a single space. Following the row with
the co-ordinates of the last vertex for the task comes the line with
the number of vertices for the next test and so on.

Output

For
each test you must write on one line the required surface - a number
with exactly two digits after the decimal point (the number should be
rounded to the second digit after the decimal point).

Sample Input

1
7
0 0
4 4
4 7
9 7
13 -1
8 -6
4 -4

Sample Output

80.00

Source

[Submit]   [Go Back]   [Status]   [Discuss]

  

【POJ】【2068】Art Gallery的更多相关文章

  1. 【 POJ - 1204 Word Puzzles】(Trie+爆搜|AC自动机)

    Word Puzzles Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10782 Accepted: 4076 Special ...

  2. 【POJ 1459 power network】

    不可以理解的是,测评站上的0ms是怎么搞出来的. 这一题在建立超级源点和超级汇点后就变得温和可爱了.其实它本身就温和可爱.对比了能够找到的题解: (1)艾德蒙·卡普算法(2)迪尼克算法(3)改进版艾德 ...

  3. 【POJ 2728 Desert King】

    Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 27109Accepted: 7527 Description David the ...

  4. 【POJ 2976 Dropping tests】

    Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 13849Accepted: 4851 Description In a certa ...

  5. 【POJ 3080 Blue Jeans】

    Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 19026Accepted: 8466 Description The Genogr ...

  6. 【POJ各种模板汇总】(写在逆风省选前)(不断更新中)

    1.POJ1258 水水的prim……不过poj上硬是没过,wikioi上的原题却过了 #include<cstring> #include<algorithm> #inclu ...

  7. 【POJ 3669 Meteor Shower】简单BFS

    流星雨撞击地球(平面直角坐标第一象限),问到达安全地带的最少时间. 对于每颗流星雨i,在ti时刻撞击(xi,yi)点,同时导致(xi,yi)和上下左右相邻的点在ti以后的时刻(包括t)不能再经过(被封 ...

  8. 【POJ 2823 Sliding Window】 单调队列

    题目大意:给n个数,一个长度为k(k<n)的闭区间从0滑动到n,求滑动中区间的最大值序列和最小值序列. 最大值和最小值是类似的,在此以最大值为例分析. 数据结构要求:能保存最多k个元素,快速取得 ...

  9. 【POJ 2406 Power Strings】

    Time Limit: 3000MSMemory Limit: 65536K Description Given two strings a and b we define a*b to be the ...

  10. poj 1279 -- Art Gallery (半平面交)

    鏈接:http://poj.org/problem?id=1279 Art Gallery Time Limit: 1000MS   Memory Limit: 10000K Total Submis ...

随机推荐

  1. POJ - 1743 后缀自动机

    POJ - 1743 顺着原字符串找到所有叶子节点,然后自下而上更新,每个节点right的最左和最右,然后求出答案. #include<cstdio> #include<cstrin ...

  2. java程序员修炼之道——大牛告诉我们应该好好学习与修炼以下知识与技能

    —————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— 一:Java语言学习(对线程(thread),串行化,反射,网络编程,JNI技术, ...

  3. Java反射机制demo(七)—反射机制与工厂模式

    Java反射机制demo(七)—反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...

  4. JavaScript 网页脚本语言 由浅入深 (随笔)

    1)基础 学习目的: 1. 客户端表单验证 2. 页面动态效果 3. jQuery的基础 什么是JavaScript? 一种描述性语言,也是一种基于对象和事件驱动的,并具有安全性能的脚本语言 java ...

  5. Java时间间隔问题在Android中的使用

    转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6606720.html 假设我们在做项目的时候,获取到了一段音频,也知道音频长度,那么我们想对音频做一些处理 ...

  6. 关于PIP 总结和记忆巩固

    查找需要安装的包 pip search <包名> 安装python包 pip install  pip install <包名>==1.0.4  pip install -r ...

  7. 【BZOJ】4985: 评分【DP】

    4985: 评分 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 148  Solved: 75[Submit][Status][Discuss] Des ...

  8. bzoj 3240 矩阵乘法+十进制快速幂

    首先,构造出从f[][i]->f[][i+1]的转移矩阵a,和从f[i][m]->f[i+1][1]的转移矩阵b, 那么从f[1][1]转移到f[n][m]就是init*(a^(m-1)* ...

  9. Codeforces Round #294 (Div. 2)C - A and B and Team Training 水题

    C. A and B and Team Training time limit per test 1 second memory limit per test 256 megabytes input ...

  10. Windows下ftp服务器搭建及配置

    Win系统使用ser-u软件进行FTP服务器的搭建下载地址:https://www.serv-u.com/操作步骤如下:1. 点击执行程序进行按照SU-FTP-Server-Windows-v15.1 ...