Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.10 KB | None | 0 0
  1. #include "set"
  2. #include "vector"
  3. #include "deque"
  4. #include "algorithm"
  5.  
  6.  
  7. struct PointRef {
  8. int vecIdx;
  9. int ptIdx;
  10. };
  11.  
  12. struct Point {
  13. double x;
  14. double y;
  15. };
  16.  
  17. struct Triangle {
  18. PointRef p1;
  19. PointRef p2;
  20. PointRef p3;
  21. int tr1;
  22. int tr2;
  23. int tr3;
  24. };
  25.  
  26. struct TriState {
  27. Point **inPoly;
  28. int nPoly;
  29. int *polySizes;
  30. };
  31.  
  32. enum VertexType {
  33. Split,
  34. Merge,
  35. Left,
  36. Right,
  37. Start,
  38. End
  39. };
  40.  
  41. struct Vertex {
  42. PointRef ref;
  43. Point pt;
  44. VertexType type;
  45. Vertex *newEdge;
  46. int newTriangle;
  47. };
  48.  
  49. struct Edge {
  50. Edge(Point &p1, Point &p2);
  51. friend bool operator<(const Edge &e1, const Edge &e2);
  52. Point from;
  53. Point to;
  54. PointRef helper;
  55. };
  56.  
  57. inline bool compare_Point(Point p1, Point p2) {
  58. return p1.y > p2.y || (p1.y == p2.y && p1.x > p2.x);
  59. }
  60.  
  61. inline bool compare_Vertex(Vertex p1, Vertex p2) {
  62. return compare_Point(p1.pt, p2.pt);
  63. }
  64.  
  65. Edge::Edge(Point &p1, Point &p2) {
  66. if(compare_Point(p1, p2)) {
  67. from = p1;
  68. to = p2;
  69. } else {
  70. from = p2;
  71. to = p1;
  72. }
  73. }
  74.  
  75.  
  76. bool Edge::operator<(const Edge &e1, const Edge &e2)
  77. {
  78. if(compare_Point(e1.from, e2.from))
  79. return e1.from.x + (e1.from.y - e2.to.y)/
  80. (e2.from.y - e2.to.y)*(e1.from.x - e2.to.x)
  81. < e2.from.x;
  82. else
  83. return e2.from.x + (e2.from.y - e2.to.y)/
  84. (e1.from.y - e2.to.y)*(e2.from.x - e2.from.x)
  85. < e1.from.x;
  86. }
  87.  
  88. inline bool crossProduct(Point p, Point q)
  89. {
  90. return p.x*q.y - q.x*p.y;
  91. }
  92.  
  93. inline Point subPt(Point p, Point q) {
  94. p.x -= q.x;
  95. p.y -= q.y;
  96.  
  97. return p;
  98. }
  99.  
  100. VertexType calcVertexType(TriState &st, PointRef ref, Point pt)
  101. {
  102. Point prevPt, nextPt;
  103.  
  104. if(ref.ptIdx == 0)
  105. prevPt = st.inPoly[ref.vecIdx][st.polySizes[ref.vecIdx]-1];
  106. else
  107. prevPt = st.inPoly[ref.vecIdx][ref.ptIdx-1];
  108.  
  109. if(ref.ptIdx == st.polySizes[ref.vecIdx]-1)
  110. nextPt = st.inPoly[ref.vecIdx][0];
  111. else
  112. nextPt = st.inPoly[ref.vecIdx][ref.ptIdx+1];
  113.  
  114. if(compare_Point(prevPt, pt))
  115. {
  116. if (compare_Point(nextPt, pt)) {
  117. if(crossProduct(subPt(nextPt, pt), subPt(prevPt, pt)) <= 0)
  118. return End;
  119. else
  120. return Merge;
  121. } else
  122. return Left;
  123. }
  124. else
  125. {
  126. if(compare_Point(pt, nextPt)) {
  127. if(crossProduct(subPt(nextPt, pt), subPt(prevPt, pt)) <= 0)
  128. return Split;
  129. else
  130. return Start;
  131. } else
  132. return Right;
  133. }
  134. }
  135.  
  136. void monoDir (TriState st, std::vector<Vertex> vertices, std::deque<Vertex> startVertices)
  137. {
  138. int i, j, size;
  139. std::vector<Vertex>::iterator vIt;
  140. std::set<Edge> edges;
  141.  
  142. size = 0;
  143. for(i = 0; i < st.nPoly; i++)
  144. size += st.polySizes[i];
  145.  
  146. // collect all vertices
  147. vertices.reserve(size);
  148. for(i = 0; i < st.nPoly; i++) {
  149. size = st.polySizes[i];
  150. for(j = 0; j < size; j++){
  151. Vertex pi;
  152. pi.ref.vecIdx = i;
  153. pi.ref.ptIdx = j;
  154. pi.pt = st.inPoly[i][j];
  155. pi.type = calcVertexType(st, pi.ref, pi.pt);
  156. pi.newEdge = NULL;
  157. pi.newTriangle = -1;
  158. vertices.push_back(pi);
  159. }
  160. }
  161.  
  162. //sort the vertices
  163. std::sort(vertices.begin(), vertices.end(), &compare_Vertex);
  164.  
  165. for(vIt = vertices.begin(); vIt < vertices.end(); vIt++) {
  166.  
  167. }
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement