nasarouf

2D polygon filling

Apr 20th, 2017
733
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.95 KB | None | 0 0
  1. //2D polygon filling (arbitrary poly; full and partial pixels are counted. handles slivers. x incremened ++)
  2.  
  3. // old, untested code
  4.  
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <cmath>
  8. #include <map>
  9. using namespace std;
  10.  
  11.  
  12. #define MAX 100
  13. #define X first
  14. #define YY second
  15. #define A first
  16. #define B second
  17. typedef pair<int,int> PII;
  18. typedef pair<PII,PII> Seg;
  19.  
  20. pair<double,double> y[MAX];
  21. int Y[MAX];
  22. PII p[MAX];
  23. Seg seg[MAX],li[MAX];
  24. map<int,int> m;
  25.  
  26. int main() {
  27.     int x, i, it, n, a, lin, lit, j, segn;
  28.     Seg s, tmp;
  29.     while ((cin >> n) && n) {
  30.         for (i = 0; i < n; i++) cin >> p[i].first >> p[i].second;
  31.         segn = 0;
  32.         m.clear();
  33.         for (i = j = 0; i < n; i++) {
  34.             if (p[i].first == p[(i + 1) % n].first) continue;
  35.             else if (p[i] < p[(i + 1) % n]) seg[j++] = (make_pair(p[i], p[(i + 1) % n]));
  36.             else seg[j++] = (make_pair(p[(i + 1) % n], p[i]));
  37.         }
  38.         segn = j;
  39.         sort(seg, seg + segn);
  40.         a = 0;
  41.         x = seg[0].first.first;
  42.         it = 0;
  43.         lin = 0;
  44.         while (it < segn || lin) {
  45.             for (i = 0, lit = 0; lit < lin; lit++, i++)
  46.                 y[i] = make_pair(li[lit].A.YY + (double)(li[lit].B.YY - li[lit].A.B)*(x - 1 - li[lit].A.X) / (double)(li[lit].B.X - li[lit].A.X),
  47.                     li[lit].A.YY + (double)(li[lit].B.YY - li[lit].A.YY)*(x - li[lit].A.X) / (double)(li[lit].B.X - li[lit].A.X));
  48.             n = i;
  49.             sort(y, y + n);
  50.             for (i = 0; i < n; i += 2) {
  51.                 Y[i + 1] = (int)(ceil(max(y[i + 1].first, y[i + 1].second)));
  52.                 Y[i] = floor(min(y[i].first, y[i].second));
  53.             }
  54.             for (i = 0; i < n; i += 2) {
  55.                 if (i && Y[i] < Y[i - 1]) Y[i] = Y[i - 1];
  56.                 if (Y[i + 1] < Y[i]) Y[i + 1] = Y[i];
  57.                 a += Y[i + 1] - Y[i];
  58.             }
  59.             if (m[x])
  60.                 for (i = 0; i < lin; )
  61.                     if (li[i].second.first == x) swap(li[i], li[--lin], tmp);
  62.                     else i++;
  63.             while (it < segn && seg[it].first.first == x) {
  64.                 li[lin++] = seg[it];
  65.                 m[seg[it].second.first] = 1;
  66.                 it++;
  67.             }
  68.             x++;
  69.         }
  70.         cout << a << endl;
  71.     }
  72.     return 0;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment