#include "intersect.cpp"
template<typenamereal_t>classPolygon{usingpoint_t=Point<real_t>;public:std::vector<point_t>g;Polygon():g(0){;}Polygon(constintn):g(n,point_t()){;}Polygon(conststd::vector<point_t>&g_):g(g_){;}voidpush_back(constpoint_t&p){g.push_back(p);}point_t&front(){returng.front();}point_t&back(){returng.back();}intsize()const{returng.size();}voidresize(intn){g.resize(n);}point_t&operator[](inti){i%=size();returng[i<0?i+size():i];}constpoint_t&operator[](inti)const{i%=size();returng[i<0?i+size():i];}};template<typenamereal_t>real_tarea(constPolygon<real_t>&g){real_tres=0;intn=g.size();for(inti=0;i<n;++i){res+=cross(g[i].p,g[i+1].p);}returnres/2;}template<typenamereal_t>intis_in_polygon(constPolygon<real_t>&g,constPoint<real_t>&p){// in -> 1// on -> 0// out -> -1intn=g.size();real_tsum=0;for(inti=0;i<n;i++){if(isis_sp(Segment<real_t>(g[i],g[i+1]),p))return0;// onsum+=arg((g[i+1]-p)*std::conj(g[i]-p));}returnabs(sum)>0.5?1:-1;}