Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- vector<Vector> prepare(vector<Vector> a) {
- int n = (int)a.size();
- int i = 0;
- for (int j = 1; j < n; ++j) {
- if (make_pair(a[j].y, -a[j].x) > make_pair(a[i].y, -a[i].x)) {
- i = j;
- }
- }
- rotate(a.begin(), a.begin() + i, a.end());
- a.push_back(a[0]);
- a.push_back(a[1]);
- return a;
- }
- double angle(Vector a) {
- if (a.y == 0 && a.x == 0) {
- assert(false);
- }
- double ans = atan2l(a.y, a.x);
- return ans;
- }
- vector<Vector> sum(vector<Vector> a, vector<Vector> b) {
- int n = (int)a.size(), m = (int)b.size();
- assert(n && m);
- a = prepare(a);
- b = prepare(b);
- vector<Vector> answer;
- while (i < n || j < m) {
- answer.push_back(a[i] + b[j]);
- if (i >= n) {
- ++j;
- continue;
- }
- if (j >= m) {
- ++i;
- continue;
- }
- if (angle(vec(a[i], a[i + 1])) < angle(vec(b[j], b[j + 1]))) {
- ++i;
- } else if (angle(vec(a[i], a[i + 1])) > angle(vec(b[j], b[j + 1]))) {
- ++j;
- } else {
- assert(i < n && j < m);
- ++i;
- ++j;
- }
- }
- return answer;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement