您的位置:首页 > 其它

计算几何模板 更新中

2012-03-29 23:34 211 查看
今天又切了一题,做题的同时当然也验证了各种模板

每次都感觉有所改进

View Code

#include <math.h>
#include <cstdio>
#include<algorithm>
using namespace std;
const  int maxn = 100010;
const double eps = 1e-8;
inline double sgn(double x) {return fabs(x)<eps?0:(x>0?1:-1);}
struct point{
double x,y;
bool operator == (const point& t) const {
return sgn(x-t.x)==0 && sgn(y-t.y)==0;
}
}p[maxn],set[maxn];
inline double cross(point a,point b,point c){return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);}
bool dotOnSeg(point p, point s, point e) {
if ( p == s || p == e )     return true;
return sgn(cross(s,e,p))==0 && sgn((p.x-s.x)*(p.x-e.x))<=0 && sgn((p.y-s.y)*(p.y-e.y))<=0;
}
bool point_in_polygon(point o, point* p, int n) {
int i, t;
point a, b;
p
= p[0];    t = 0;
for (i=0; i < n; i++) {
if ( dotOnSeg(o, p[i], p[i+1]) )        return true;
a = p[i]; b = p[i+1];
if ( a.y > b.y ) {
point tmp = a; a = b; b = tmp;
}
if ( cross(o, a, b) < -eps && a.y < o.y-eps && o.y < b.y+eps )
t++;
}
return t&1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: