POJ 1279 Art Gallery 半平面交求多边形核
第一道半平面交,只会写N^2。
将每条边化作一个不等式,ax+by+c>0,所以要固定顺序,方便求解。
半平面交其实就是对一系列的不等式组进行求解可行解。
如果某点在直线右侧,说明那个点在区域内,否则出现在左边,就可能会有交点,将交点求出加入。
//#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#define ll long long
#define Max(a,b) (((a) > (b)) ? (a) : (b))
#define Min(a,b) (((a) < (b)) ? (a) : (b))
#define Abs(x) (((x) > 0) ? (x) : (-(x)))
using namespace std; const int MAXN = ;
const double eps = 1e-; struct POINT{
double x;
double y;
POINT() : x(), y() {};
POINT(double _x_, double _y_) : x(_x_), y(_y_) {};
}; struct LINE{
POINT a;
POINT b;
LINE() {};
LINE(POINT _a_, POINT _b_) : a(_a_), b(_b_) {};
}; POINT point[MAXN];//记录最开始的多边形
POINT temp[MAXN]; //临时保存新切割的多边形
POINT ans[MAXN]; //保存新切割出的多边形
LINE lline;
int n,m;//n的原先的点数,m是新切割出的多边形的点数 void Coefficient(const LINE & L, double & A, double & B, double & C){
A = L.b.y - L.a.y;
B = L.a.x - L.b.x;
C = L.b.x * L.a.y - L.a.x * L.b.y;
} double Cross(const POINT & a, const POINT & b, const POINT &o){
return (a.x - o.x) * (b.y - o.y) - (b.x - o.x) * (a.y - o.y);
} POINT Intersection(const LINE & A, const LINE & B){
double A1, B1, C1;
double A2, B2, C2;
Coefficient(A, A1, B1, C1);
Coefficient(B, A2, B2, C2);
POINT temp_point(, );
temp_point.x = -(B2 * C1 - B1 * C2) / (A1 * B2 - A2 * B1);
temp_point.y = (A2 * C1 - A1 * C2) / (A1 * B2 - A2 * B1);
return temp_point;
} //求面积,正为顺时针,和叉积写法有关
double PointArea(POINT p[],int n){
double area = ;
for(int i = ; i < n; ++i)
area += Cross(p[], p[i], p[i+]);
return -area / 2.0;
} void Cut(){ //用直线ax+by+c==0切割多边形
int cut_m = , i;
double a, b, c;
Coefficient(lline, a, b, c);
for(i = ; i <= m; ++i){
if(a * ans[i].x + b*ans[i].y + c >= ) //题目是顺时钟给出点的,所以一个点在直线右边的话,那么带入值就会大于等于0
temp[++cut_m] = ans[i]; //说明这个点还在切割后的多边形内,将其保留
else{
if(a * ans[i - ].x + b * ans[i - ].y + c > ){ //该点不在多边形内,但是它和它相邻的点构成直线与
LINE line1(ans[i - ], ans[i]); //ax+by+c==0所构成的交点可能在新切割出的多边形内,
temp[++cut_m] = Intersection(lline, line1); //所以保留交点
}
if(a * ans[i + ].x + b * ans[i + ].y + c > ){
LINE line1(ans[i + ], ans[i]);
temp[++cut_m] = Intersection(lline, line1); //所以保留交点
}
}
}
for(i = ; i <= cut_m; ++i) ans[i] = temp[i];
ans[cut_m + ] = temp[];
ans[] = temp[cut_m];
m = cut_m;
} void solve(){
int i;
point[] = point[n];
point[n+] = point[];
for(i = ; i <= n + ; ++i){
ans[i] = point[i];
}
m = n;
for(i = ;i <= n; ++i){
lline.a = point[i];
lline.b = point[i + ]; //根据point[i]和point[i+1]确定直线ax+by+c==0
Cut(); //用直线ax+by+c==0切割多边形
}
printf("%.2f\n",Abs(PointArea(ans,m)));
} int main(){
int caseNum,i;
scanf("%d",&caseNum);
while(caseNum--){
scanf("%d",&n);
for(i = ; i <= n; ++i){
scanf("%lf%lf",&point[i].x,&point[i].y);
}
solve();
}
return ;
}
POJ 1279 Art Gallery 半平面交求多边形核的更多相关文章
- POJ 1279 Art Gallery 半平面交/多边形求核
http://poj.org/problem?id=1279 顺时针给你一个多边形...求能看到所有点的面积...用半平面对所有边取交即可,模版题 这里的半平面交是O(n^2)的算法...比较逗比.. ...
- POJ 1279 Art Gallery 半平面交 多边形的核
题意:求多边形的核的面积 套模板即可 #include <iostream> #include <cstdio> #include <cmath> #define ...
- POJ 1279 Art Gallery(半平面交)
题目链接 回忆了一下,半平面交,整理了一下模版. #include <cstdio> #include <cstring> #include <string> #i ...
- POJ 1279 Art Gallery(半平面交求多边形核的面积)
题目链接 题意 : 求一个多边形的核的面积. 思路 : 半平面交求多边形的核,然后在求面积即可. #include <stdio.h> #include <string.h> ...
- POJ 3335 Rotating Scoreboard(半平面交求多边形核)
题目链接 题意 : 给你一个多边形,问你在多边形内部是否存在这样的点,使得这个点能够看到任何在多边形边界上的点. 思路 : 半平面交求多边形内核. 半平面交资料 关于求多边形内核的算法 什么是多边形的 ...
- poj 1279 Art Gallery - 求多边形核的面积
/* poj 1279 Art Gallery - 求多边形核的面积 */ #include<stdio.h> #include<math.h> #include <al ...
- poj 1279 -- Art Gallery (半平面交)
鏈接:http://poj.org/problem?id=1279 Art Gallery Time Limit: 1000MS Memory Limit: 10000K Total Submis ...
- poj 1279 Art Gallery (Half Plane Intersection)
1279 -- Art Gallery 还是半平面交的问题,要求求出多边形中可以观察到多边形所有边的位置区域的面积.其实就是把每一条边看作有向直线然后套用半平面交.这题在输入的时候应该用多边形的有向面 ...
- POJ 3335 Rotating Scoreboard 半平面交求核
LINK 题意:给出一个多边形,求是否存在核. 思路:比较裸的题,要注意的是求系数和交点时的x和y坐标不要搞混...判断核的顶点数是否大于1就行了 /** @Date : 2017-07-20 19: ...
随机推荐
- poj 3358
/** 大意: 给定小数(p/q),求其循环节的大小和循环节开始的位置 解法: 若出现循环 ai*2^m= aj%p; 即 2^m %p =1 若2与p 互素,则可由欧拉函数的, 不互素,需将其转化为 ...
- 我的第一个REST客户端程序!
Delphi:XE8 看了好几天的资料了,也没有弄出来一个REST程序,尝试了XE8中带的例子,也都没有搞懂.我在网上不断搜索,看是否能够找到适合自己的文章,希望能够做出来一个REST的小例子,万幸, ...
- php中 $$str 中 "$$" 的解释
原文:php中 $$str 中 "$$" 的解释 这种写法称为可变变量有时候使用可变变量名是很方便的.就是说,一个变量的变量名可以动态的设置和使用.一个普通的变量通过声明来设置,例 ...
- 一个php user class
这个类叫php user class.php user class is an easy to use php snippet for user manipulation (register, log ...
- [Windows编程] 开发DLL必读《Best Practices for Creating DLLs》
开发DLL的时候,需要十分注意 DllMain 函数,因为在多线程环境下DLLMain里面的代码很容易引发线程死锁. 这篇MSDN文章<Best Practices for Creating D ...
- ccMacros
#ifndef __CCMACROS_H__ #define __CCMACROS_H__ #ifndef _USE_MATH_DEFINES #define _USE_MATH_DEFINES #e ...
- Android开发中内置apk程序
首先申明,这里的方法介绍是针对我司自己项目中的具体开发板而做的. Mg701内置APK有三种方式 一. 这种方法必须要自己编写Android.mk文件(关于Android.mk可以参考 ...
- 各浏览器对 window.open() 的窗口特征 sFeatures 参数支持程度存在差异
标准参考 无. 问题描述 使用 window.open 方法可以弹出一个新窗口,其中 open 方法的 sFeatures 参数选项在各浏览器中支持程度不一,这有可能导致同样的代码使各浏览器中弹出窗口 ...
- ajax不执行success回调而是执行了error回调
最近在看jQuery的API文档,在使用到jQuery的ajax时,如果指定了dataType为json,老是不执行success回调,而是执行了error回调函数. 附上代码如下: JScrip ...
- MySQl 存储过程+游标
DROP PROCEDURE IF exists pro_Insertflightplan_stat; create procedure pro_Insertflightplan_stat(exec ...