# 計算幾何 模板 ```cpp= struct point{ ll x, y; point operator+(point p1){ return point{x+p1.x, y+p1.y}; } point operator-(point p1){ return point{x-p1.x, y-p1.y}; } ll operator^(point p1){ return x*p1.y-p1.x*y; } ll operator*(point p1){ return x*p1.x+y*p1.y; } }; bool onseg(point p1, point p2, point p3){ point a=p1-p3, b=p2-p3; return (a^b)==0 && (a*b)<=0; } int sign(ll num){ if(num<0) return -1; else if(num>0) return 1; return 0; } bool banana(point p1, point p2, point q1, point q2){ if(onseg(p1, p2, q1) || onseg(p1, p2, q2) || onseg(q1, q2, p1) || onseg(q1, q2, p2)) return true; if(sign((p2-p1)^(q1-p1))*sign((p2-p1)^(q2-p1))<0 && sign((q2-q1)^(p1-q1))*sign((q2-q1)^(p2-q1))<0) return true; return false; } ```