struct point{ double x,y; point(double _x=0,double _y=0){ x=_x,y=_y; } point operator+ (const point& a) const{ return point(x+a.x,y+a.y); } point operator- (const point& a) const{ return point(x-a.x,y-a.y); } point operator* (double a) const{ return point(x*a,y*a); } }; // 点 struct line{ point s,e; line(point a,point b){ s=a,e=b; } line(){} }; // 线 double getdis(point a, point b){ double xx=a.x-b.x,yy=a.y-b.y; return sqrt(xx*xx+yy*yy); } // 两点距离 double multi(point a,point b,point c){ double xa,ya,xb,yb; xa=b.x-a.x; ya=b.y-a.y; xb=c.x-b.x; yb=c.y-b.y; return xa*xb+ya*yb; } // 点乘 double cross(point a,point b,point c){ double xa,ya,xb,yb; xa=b.x-a.x; ya=b.y-a.y; xb=c.x-a.x; yb=c.y-a.y; return xa*yb-xb*ya; } // 叉乘 int judgec(line a,line b){ if (max(a.s.x,a.e.x)>=min(b.s.x,b.e.x) && max(a.s.y,a.e.y)>=min(b.s.y,b.e.y) && max(b.s.x,b.e.x)>=min(a.s.x,a.e.x) && max(b.s.y,b.e.y)>=min(a.s.y,a.e.y) && cross(a.s,b.s,b.e)*cross(a.e,b.s,b.e)<=0 && cross(b.s,a.s,a.e)*cross(b.e,a.s,a.e)<=0 ) return 1; else return 0; } // 判断线段是否相交 point getpoi(point a,point b,point c,point d){ double u=cross(a,b,c),v=cross(b,a,d); return point((c.x*v+d.x*u)/(u+v),(c.y*v+d.y*u)/(u+v)); } // 求交点