Advertisement
Guest User

Untitled

a guest
Dec 14th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.64 KB | None | 0 0
  1. namespace split {
  2.     vector<Vertex> poly;
  3.     vector<Point> polyp;
  4.     vector<int> helper;
  5.     vector<int> used;
  6.  
  7.     struct Edge
  8.     {
  9.         int from, to;
  10.         int next;
  11.         bool isBad;
  12.     };
  13.     vector<Edge> edges;
  14.     vector<vector<int>> g;
  15.  
  16.     enum class VertexType
  17.     {
  18.         Start,
  19.         End,
  20.         Split,
  21.         Merge,
  22.         Regular,
  23.     };
  24.  
  25.     bool isInside(Point p, Point p1, Point p2)
  26.     {
  27.         assert(p1.y > p2.y);
  28.         return p2.y <= p.y && p.y <= p1.y;
  29.     }
  30.  
  31.     bool isOnLeft(Point p, Point p1, Point p2)
  32.     {
  33.         assert(p1.y > p2.y);
  34.         return (p2 - p1) % (p - p1) < 0;
  35.     }
  36.  
  37.     int prevEdge(int v)
  38.     {
  39.         return v ? v - 1 : polyp.size() - 1;
  40.     }
  41.  
  42.     int nextEdge(int v)
  43.     {
  44.         return v;
  45.     }
  46.  
  47.     Point prevVert(int e)
  48.     {
  49.         return polyp[e];
  50.     }
  51.  
  52.     Point nextVert(int e)
  53.     {
  54.         return e + 1 < polyp.size() ? polyp[e + 1] : polyp[0];
  55.     }
  56.  
  57.     VertexType getType(int id) {
  58.         auto const& v = poly[id].p;
  59.         auto const& next = nextVert(nextEdge(id));
  60.         auto const& prev = prevVert(prevEdge(id));
  61.  
  62.         auto product = (next - v) % (prev - v);
  63.  
  64.         if (v.y > next.y && v.y > prev.y) {
  65.             if (product > 0)
  66.                 return VertexType::Start;
  67.             else if (product < 0)
  68.                 return VertexType::Split;
  69.             else
  70.                 assert(false);
  71.         }
  72.         else if (v.y < next.y && v.y < prev.y) {
  73.             if (product > 0)
  74.                 return VertexType::End;
  75.             else if (product < 0)
  76.                 return VertexType::Merge;
  77.             else
  78.                 assert(false);
  79.         }
  80.         else {
  81.             if (prev.y != v.y && v.y != next.y)
  82.                 return VertexType::Regular;
  83.             else if (product < 0)
  84.                 return VertexType::Regular;
  85.             else if (v.y == max(prev.y, next.y))
  86.                 return VertexType::Start;
  87.             else if (v.y == min(prev.y, next.y))
  88.                 return VertexType::End;
  89.             else
  90.                 assert(false);
  91.         }
  92.     }
  93.  
  94.     struct VertexWrapper
  95.     {
  96.         int v;
  97.     };
  98.  
  99.     struct EdgeComparator {
  100.         bool operator()(int e1, int e2) {
  101.             auto pe1 = prevVert(e1);
  102.             auto ne1 = nextVert(e1);
  103.             auto pe2 = prevVert(e2);
  104.             auto ne2 = nextVert(e2);
  105.  
  106.             if (isInside(pe1, pe2, ne2))
  107.                 return isOnLeft(pe1, pe2, ne2);
  108.             else if (isInside(ne1, pe2, ne2))
  109.                 return isOnLeft(ne1, pe2, ne2);
  110.             else if (isInside(pe2, pe1, ne1))
  111.                 return !isOnLeft(pe2, pe1, ne1);
  112.             else if (isInside(ne2, pe1, ne1))
  113.                 return !isOnLeft(ne2, pe1, ne1);
  114.             else {
  115.  
  116.                 assert(false);
  117.             }
  118. //            return isOnLeft(prevVert(e1), prevVert(e2), nextVert(e2)) || isOnLeft(nextVert(e1), prevVert(e2), nextVert(e2));
  119.         }
  120.  
  121.         bool operator()(int e, VertexWrapper v)
  122.         {
  123.             return !isOnLeft(polyp[v.v], prevVert(e), nextVert(e));
  124.         }
  125.  
  126.         using is_transparent = true_type;
  127.     };
  128.  
  129.     set<int, EdgeComparator> status;
  130.  
  131.     void addEdge(int from, int to, bool isBad)
  132.     {
  133.         int num = edges.size();
  134.         edges.push_back({from, to, -1, isBad});
  135.         g[from].push_back(num);
  136.     }
  137.  
  138.     void addEdge(int a, int b)
  139.     {
  140.         cerr << endl << endl;
  141.         cerr << "!@#$ EDGE " << a << ' ' << b << endl;
  142.         cerr << endl << endl;
  143.         cerr << endl << endl;
  144.  
  145.         addEdge(a, b, false);
  146.         addEdge(b, a, false);
  147.     }
  148.  
  149.     int getId(Point p)
  150.     {
  151.         for (int i = 0; i < polyp.size(); i++)
  152.             if (polyp[i] == p)
  153.                 return i;
  154.         assert(false);
  155.     }
  156.  
  157.     void printStatus()
  158.     {
  159.         cerr << "STATUS: ";
  160.         for (int e : status) {
  161.             cerr << "(" << e << " : " << getId(prevVert(e)) << ", " << getId(nextVert(e)) << ")" << ' ';
  162.         }
  163.         cerr << endl;
  164.     }
  165.  
  166.     void addToStatus(int e, int v)
  167.     {
  168.         if (prevVert(e).y == nextVert(e).y)
  169.             return;
  170.         cerr << "for " << v  << " adding (" << getId(prevVert(e)) << ", " << getId(nextVert(e)) << ")" << endl;
  171.  
  172.         helper[e] = v;
  173.  
  174.         cerr << "Before adding:";
  175.         printStatus();
  176.         status.insert(e);
  177.         cerr << "After adding:";
  178.         printStatus();
  179.     }
  180.  
  181.     void removeFromStatus(int e, int v)
  182.     {
  183.         if (prevVert(e).y == nextVert(e).y)
  184.             return;
  185.         if (getType(helper[e]) == VertexType::Merge)
  186.             addEdge(v, helper[e]);
  187.  
  188.         status.erase(status.find(e));
  189.     }
  190.  
  191.     int findLeftEdge(int v)
  192.     {
  193.         printStatus();
  194.  
  195.         auto iter = status.lower_bound(VertexWrapper{v});
  196. //        assert(iter != status.end());
  197.         assert(iter != status.begin());
  198.         iter--;
  199.  
  200.         cerr << "for " << v << " found " << *iter << endl;
  201.  
  202.         return *iter;
  203.     }
  204.  
  205.     void updateHelper(int v, bool forceEdge=false)
  206.     {
  207.         int leftEdge = findLeftEdge(v);
  208.         if (forceEdge || getType(helper[leftEdge]) == VertexType::Merge)
  209.             addEdge(v, helper[leftEdge]);
  210.         helper[leftEdge] = v;
  211.     }
  212.  
  213.     void handleStart(int v)
  214.     {
  215.         addToStatus(nextEdge(v), v);
  216.     }
  217.  
  218.     void handleEnd(int v)
  219.     {
  220.         removeFromStatus(prevEdge(v), v);
  221.     }
  222.  
  223.     void handleSplit(int v) {
  224.         updateHelper(v, true);
  225.         addToStatus(nextEdge(v), v);
  226.     }
  227.  
  228.     void handleMerge(int v) {
  229.         removeFromStatus(prevEdge(v), v);
  230.         updateHelper(v);
  231.     }
  232.  
  233.     void handleRegular(int v) {
  234.         if (prevVert(prevEdge(v)).y > nextVert(nextEdge(v)).y) {
  235.             cerr << "!here" << endl;
  236.             removeFromStatus(prevEdge(v), v);
  237.             addToStatus(nextEdge(v), v);
  238.         }
  239.         else {
  240.             cerr << "@here" << endl;
  241.             updateHelper(v);
  242.             cerr << "status after @here:" << endl;
  243.             printStatus();
  244.         }
  245.     }
  246.  
  247.     void dfs(int e, vector<Vertex>& vs)
  248.     {
  249.         used[e] = true;
  250.         vs.push_back(poly[edges[e].from]);
  251.  
  252.         int next_e = edges[e ^ 1].next;
  253.         if (!used[next_e])
  254.             dfs(next_e, vs);
  255.     }
  256.  
  257.     bool testYPoly(vector<Vertex> const& vs) {
  258.         for (int i = 0; i < vs.size(); i++) {
  259.             Point prev = i ? vs[i - 1].p : vs.back().p;
  260.             Point next = i + 1 < vs.size() ? vs[i + 1].p : vs[0].p;
  261.             Point curr = vs[i].p;
  262.  
  263.             auto product = (next - curr) % (prev - curr);
  264.  
  265.             if ((curr.y > next.y && curr.y > prev.y || curr.y < next.y && curr.y < prev.y) && product < 0) {
  266.                 cerr << endl << endl << endl << endl;
  267.                 cerr << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
  268.                 cerr << prev.x << ' ' << prev.y << " ; " << curr.x << ' ' << curr.y << " ; " << next.x << ' ' << next.y << endl;
  269.                 for (int i = 0; i < vs.size(); i++)
  270.                     cerr << vs[i].p.x << ' ' << vs[i].p.y << " ; ";
  271.                 cerr << endl;
  272.  
  273.                 return false;
  274.             }
  275.         }
  276.  
  277.         return true;
  278.     }
  279.  
  280.     bool testSplit(vector<vector<Vertex>> const& split)
  281.     {
  282.         size_t totalTriangles = 0;
  283.         for (auto vs : split) {
  284.             if (!testYPoly(vs))
  285.                 return false;
  286.             totalTriangles += vs.size() - 2;
  287.         }
  288.  
  289.         cout << "all polys are y-monotonos" << endl;
  290.  
  291.         return totalTriangles == poly.size() - 2;
  292.     }
  293.  
  294.     vector<vector<Vertex>> splitYPoly(vector<Vertex> _poly) {
  295.         split::poly.clear();
  296.         split::polyp.clear();
  297.         split::helper.clear();
  298.         split::used.clear();
  299.         split::status.clear();
  300.         split::edges.clear();
  301.         split::g.clear();
  302.  
  303.         poly = _poly;
  304.         g.resize(poly.size());
  305.  
  306.         ofstream output("c.out");
  307.         output << poly.size() << endl;
  308.         for (auto i = 0; i < poly.size(); i++)
  309.             output << poly[i].p.x << ' ' << poly[i].p.y << endl;
  310.  
  311.  
  312.         polyp.resize(poly.size());
  313.         for (size_t i = 0; i < poly.size(); i++)
  314.             polyp[i] = poly[i].p;
  315.  
  316.         helper.resize(_poly.size());
  317.  
  318.         vector<int> ids(poly.size());
  319.         for (int i = 0; i < ids.size(); i++)
  320.             ids[i] = i;
  321.  
  322.         sort(ids.begin(), ids.end(), [](int id1, int id2) {
  323.             return poly[id1].p.y > poly[id2].p.y || poly[id1].p.y == poly[id2].p.y && poly[id1].p.x < poly[id2].p.x;
  324.         });
  325.  
  326.  
  327.         for (auto id : ids)
  328.             cerr << id << ' ';
  329.         cerr << endl;
  330.  
  331.         for (auto id : ids) {
  332.             cerr << "processing " << id << endl;
  333.             switch (getType(id)) {
  334.                 case VertexType::Start:
  335.                     handleStart(id);
  336.                     break;
  337.                 case VertexType::End:
  338.                     handleEnd(id);
  339.                     break;
  340.                 case VertexType::Split:
  341.                     handleSplit(id);
  342.                     break;
  343.                 case VertexType::Merge:
  344.                     handleMerge(id);
  345.                     break;
  346.                 case VertexType::Regular:
  347.                     handleRegular(id);
  348.                     break;
  349.             }
  350.         }
  351.  
  352.         for (int i = 0; i < polyp.size(); i++) {
  353.             addEdge(i, (i + 1) % polyp.size(), false);
  354.             addEdge((i + 1) % polyp.size(), i, true);
  355.         }
  356.  
  357.         ofstream out("a.out");
  358.         for (size_t i = 0; i < polyp.size(); i++)
  359.             for (auto e : g[i])
  360.                 out << edges[e].from << ' ' << edges[e].to << endl;
  361.  
  362.         for (int i = 0; i < polyp.size(); i++) {
  363.             sort(g[i].begin(), g[i].end(), [](int e1, int e2) {
  364.                 return (polyp[edges[e1].to] - polyp[edges[e1].from]).angle() < (polyp[edges[e2].to] - polyp[edges[e2].from]).angle();
  365.             });
  366.  
  367.             for (size_t j = 1; j < g[i].size(); j++)
  368.                 edges[g[i][j]].next = g[i][j - 1];
  369.             edges[g[i][0]].next = g[i].back();
  370.         }
  371.  
  372.         used.resize(edges.size());
  373.         vector<vector<Vertex>> result;
  374.         for (int i = 0; i < edges.size(); i++)
  375.             if (!used[i] && !edges[i].isBad) {
  376.                 vector<Vertex> current;
  377.                 dfs(i, current);
  378.                 result.push_back(current);
  379.             }
  380.  
  381.         ofstream out2("b.out");
  382.         out2 << result.size() << endl;
  383.         for (auto vs : result) {
  384.             out2 << vs.size() << endl;
  385.             for (auto v : vs)
  386.                 out2 << v.p.x << ' ' << v.p.y << endl;
  387.         }
  388.  
  389.         assert(testSplit(result));
  390.  
  391.         return result;
  392.     }
  393. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement