void cut(poly &p){ bool flag = 1; while(flag && p.s() > eps){ flag = 0; rep(i, n) if(cross(l[i], p)){ poly *L = new poly(); int st = 0, sz = p.ver.size(); for(; !cross(line(p.ver[st], p.ver[(st + 1) % sz]), l[i]); st = (st + 1) % sz); L->ver.pb(crossPoint(line(p.ver[st], p.ver[(st + 1) % sz]), l[i])); for(st = (st + 1) % sz; !cross(line(p.ver[st], p.ver[(st + 1) % sz]), l[i]); st = (st + 1) % sz) L->ver.pb(p.ver[st]); L->ver.pb(p.ver[st]); L->ver.pb(crossPoint(line(p.ver[st], p.ver[(st + 1) % sz]), l[i])); cut(*L); L->ver.clear(); L->ver.pb(crossPoint(line(p.ver[st], p.ver[(st + 1) % sz]), l[i])); for(st = (st + 1) % sz; !cross(line(p.ver[st], p.ver[(st + 1) % sz]), l[i]); st = (st + 1) % sz) L->ver.pb(p.ver[st]); L->ver.pb(p.ver[st]); L->ver.pb(crossPoint(line(p.ver[st], p.ver[(st + 1) % sz]), l[i])); p.ver = L->ver; delete(L); flag = 1; } } double s = p.s(); if(s > eps && s < inf) ans.pb(s); }