void convex_hull(poly & t, poly & r) { unsigned i; Compare order; // Search leftmost vertex order.p0 = t[0]; for (i = 1; i < t.size(); ++i) if (t[i].real() < order.p0.real()) order.p0 = t[i]; sort(t.begin(), t.end(), order); for (i = 0; i < t.size(); ++i) { r.push_back(t[i]); // Pop vertices that become internal while (r.size() > 3u && angle(r.end()[-3], r.end()[-2], r.end()[-1])) { r.end()[-2] = r.back(); r.pop_back(); } } return; }
inline void reduce(poly &a){ int N = (int)a.size(); while (N > 0 && a[N - 1] == 0)a.pop_back(), N--; }