貌似是第一次做计算几何的题, 以前都是了解里面些概念但没做过题....主要是没精力来完善到这一块....而且比赛的时候"疲于奔命"似的做其他被人刷爆的题目.....
边讲题边讲我对计算几何初步的理解.....
double dist(POINT p1,POINT p2) // 返回两点之间欧氏距离 { return( sqrt( (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y) ) ); }
int cross(point p0,point p1,point p2) { return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x); } bool cmp(point p1,point p2) { int tmp=cross(a[0],p1,p2); if(tmp>0) return true; else return false; }
bool cmp(const point &a, const point &b) { double angle1 = atan2(a.y, a.x); double angle2 = atan2(b.y, b.x); double angle = angle1-angle2; if(angle>pi) angle-=2*pi; if(angle<-pi) angle = 2*pi+angle; return angle<0; }
//计算cross product (P1-P0)x(P2-P0) double xmult(point p1,point p2,point p0){ return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y); } //判三点共线 int dots_inline(point p1,point p2,point p3){ return zero(xmult(p1,p2,p3)); } //判两直线平行 int parallel(line u,line v){ return zero((u.a.x-u.b.x)*(v.a.y-v.b.y)-(v.a.x-v.b.x)*(u.a.y-u.b.y)); }
int64 getarea(Point p1,Point p2) { return (int64)p1.x*p2.y-(int64)p2.x*p1.y; //叉积 为三角形面积两倍 }
//判两点在线段同侧,点在线段上返回0 int same_side(point p1,point p2,line l){ return xmult(l.a,p1,l.b)*xmult(l.a,p2,l.b)>eps; } //判两点在线段异侧,点在线段上返回0 int opposite_side(point p1,point p2,line l){ return xmult(l.a,p1,l.b)*xmult(l.a,p2,l.b)<-eps; //叉积异号 }那么, 这题要判定的是 一点 在两线段中间(含点在线段上)的情况.只需做一点改变,
//判断两直线在点两边 int is(line l1, line l2, point p) { int ret = xmult(l1.a, p, l1.b)*xmult(l2.a, p, l2.b)>eps; return !ret; }
bool solve() { REP(n<<1) //枚举点 { FOR(j, i+1, n*2-1) { if(zero(p[i].x-p[j].x) && zero(p[i].y-p[j].y)) continue; int find = 1; FOR(k, 0, n-1) //枚举线段 { if(!intersection_seg(l[k].a, l[k].b, p[i], p[j])) { find = 0; break; } } if(find) return true; } } return false; }
写这东西拖了两天,不爽....各种事情..各种欠账...