计算几何板子

随做题也不一定补充。

int js(double x)
{
	if(Abs(x) < eps) return 0;
	return x > 0 ? 1 : -1;
}
struct point
{
	double x,y;
	
	point(){}
	point(double xx,double yy){
		x = xx;
		y = yy;
	}
	
	void Get(){scanf("%lf %lf",&x,&y);}
	
	void print(){printf("%.2f %.2f\n",x,y);}
	
	point operator + (const point &C){return point(x+C.x,y+C.y);}
	point operator - (const point &C){return point(x-C.x,y-C.y);}
	point operator * (const double C){return point(x*C,y*C);}
	bool operator < (const point &px)const{
		if(x != px.x) return x < px.x;
		return y < px.y;
	}
	bool operator == (const point &C)const{
		return (!js(x-C.x)) && (!js(y-C.y));
	}
	
	point rot90(){return point(-y,x);}
}p[MAXN];
double cross(point A,point B){return A.x*B.y-A.y*B.x;}
double dot(point A,point B){return A.x*B.x+A.y*B.y;}
double len(point A){return sqrt(A.x*A.x+A.y*A.y);}

bool OnSegment(point A,point B1,point B2)
{
	point c1 = B1 - A,c2 = B2 - A;//向量
	if(js(cross(c1,c2))) return 0;//判断向量共线
	if(js(c1.x*c2.x) <= 0 && js(c1.y*c2.y) <= 0) return 1;//判断向量异向
	return 0;
}
bool check(point A1,point A2,point B1,point B2)
{
	if(OnSegment(A1,B1,B2) || OnSegment(A2,B1,B2)) return 1;
	if(OnSegment(B1,A1,A2) || OnSegment(B2,A1,A2)) return 1;
	point C1 = A2-A1,C2 = B2-B1;
	if(!js(cross(C1,C2))) return 0;
	double c1 = cross(A2-A1,B1-A1),c2 = cross(A2-A1,B2-A1),
		   c3 = cross(B2-B1,A1-B1),c4 = cross(B2-B1,A2-B1);
	return (js(c1) * js(c2) <= 0) && (js(c3) * js(c4) <= 0);
}
point inter(point A1, point A2, point B1, point B2)//intersection
{
    point c1 = A2 - A1, c2 = B2 - B1;
    double t = cross(c2,(A1 - B1)) / cross(c1,c2);
    return c1*t+A1;
}
point Cir(point A,point B,point C){return inter((A+B)/2,(B-A).rot90(),(A+C)/2,(C-A).rot90());}//三点求圆心(不共线) 
上一篇:云原生 | 混沌工程工具 ChaosBlade Operator 入门篇


下一篇:华山论剑之浅谈XMPP协议实现即时通讯功能