On this page
article
Sweep Direction
Sobre
Passa por todas as ordenacoes dos pontos definitas por “direcoes”
Assume que nao existem pontos coincidentes
O(n^2 log n)
Link original: sweepDirection.cpp
Código
void sweep_direction(vector<pt> v) {
int n = v.size();
sort(v.begin(), v.end(), [](pt a, pt b) {
if (a.x != b.x) return a.x < b.x;
return a.y > b.y;
});
vector<int> at(n);
iota(at.begin(), at.end(), 0);
vector<pair<int, int>> swapp;
for (int i = 0; i < n; i++) for (int j = i+1; j < n; j++)
swapp.push_back({i, j}), swapp.push_back({j, i});
sort(swapp.begin(), swapp.end(), [&](auto a, auto b) {
pt A = rotate90(v[a.first] - v[a.second]);
pt B = rotate90(v[b.first] - v[b.second]);
if (quad(A) == quad(B) and !sarea2(pt(0, 0), A, B)) return a < b;
return compare_angle(A, B);
});
for (auto par : swapp) {
assert(abs(at[par.first] - at[par.second]) == 1);
int l = min(at[par.first], at[par.second]),
r = n-1 - max(at[par.first], at[par.second]);
// l e r sao quantos caras tem de cada lado do par de pontos
// (cada par eh visitado duas vezes)
swap(v[at[par.first]], v[at[par.second]]);
swap(at[par.first], at[par.second]);
}
}