Guest User

Untitled

a guest
Jul 18th, 2018
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.75 KB | None | 0 0
  1. private Polygon[] regularizeLeftist(Point[] vertexes,
  2. HashMap<Point, Point> next, HashMap<Point, Point> prev,
  3. Edge[][] edges, pdouble currentx) {
  4.  
  5. Vector<Point> points = new Vector<Point>(2 * n);
  6.  
  7. for (int i = 0; i < n; i++) {
  8. points.add(vertexes[i]);
  9.  
  10. if (i < n - 1) {
  11. next.put(vertexes[i], vertexes[i + 1]);
  12. } else {
  13. next.put(vertexes[i], vertexes[0]);
  14. }
  15.  
  16. if (i > 0) {
  17. prev.put(vertexes[i], vertexes[i - 1]);
  18. } else {
  19. prev.put(vertexes[i], vertexes[n - 1]);
  20. }
  21. }
  22.  
  23. Arrays.sort(vertexes, new PointsComparator());
  24.  
  25. currentx.value = vertexes[0].x;
  26.  
  27. for (int i = 0; i < n; i++) {
  28. edges[vertexes[i].number][next.get(vertexes[i]).number] = new Edge(
  29. vertexes[i], next.get(vertexes[i]), currentx);
  30. }
  31.  
  32. TreeSet<Edge> line = new TreeSet<Edge>();
  33.  
  34. Point v;
  35. Point w;
  36. Point vnext;
  37. Point vprev;
  38.  
  39. Edge enext;
  40. Edge eprev;
  41.  
  42. for (int i = 0; i < n; i++) {
  43. currentx.value = vertexes[i].x;
  44.  
  45. v = vertexes[i];
  46. vnext = next.get(v);
  47. vprev = prev.get(v);
  48.  
  49. if (vnext.x < v.x && vprev.x < v.x) {
  50. if (vnext.y > vprev.y) {
  51. enext = line.higher(edges[v.number][vnext.number]);
  52. eprev = line.lower(edges[vprev.number][v.number]);
  53. } else {
  54. eprev = line.lower(edges[v.number][vnext.number]);
  55. enext = line.higher(edges[vprev.number][v.number]);
  56. }
  57.  
  58. line.remove(edges[v.number][vnext.number]);
  59. line.remove(edges[vprev.number][v.number]);
  60.  
  61. if (enext != null)
  62. enext.controlPoint = v;
  63. continue;
  64. }
  65.  
  66. if (vprev.x < v.x && v.x < vnext.x) {
  67. enext = line.higher(edges[vprev.number][v.number]);
  68. eprev = line.lower(edges[vprev.number][v.number]);
  69.  
  70. line.remove(edges[vprev.number][v.number]);
  71. line.add(edges[v.number][vnext.number]);
  72.  
  73. if (enext != null)
  74. enext.controlPoint = v;
  75.  
  76. edges[v.number][vnext.number].controlPoint = v;
  77. continue;
  78. }
  79.  
  80. if (vnext.x < v.x && v.x < vprev.x) {
  81. enext = line.higher(edges[v.number][vnext.number]);
  82. eprev = line.lower(edges[v.number][vnext.number]);
  83.  
  84. line.remove(edges[v.number][vnext.number]);
  85. line.add(edges[vprev.number][v.number]);
  86.  
  87. if (enext != null)
  88. enext.controlPoint = v;
  89.  
  90. edges[vprev.number][v.number].controlPoint = v;
  91. continue;
  92. }
  93.  
  94. if (vnext.x > v.x && vprev.x > v.x) {
  95. if (vnext.y > vprev.y) {
  96. enext = line.higher(edges[v.number][vnext.number]);
  97. eprev = line.lower(edges[vprev.number][v.number]);
  98. } else {
  99. eprev = line.lower(edges[v.number][vnext.number]);
  100. enext = line.higher(edges[vprev.number][v.number]);
  101. }
  102.  
  103. line.add(edges[vprev.number][v.number]);
  104. line.add(edges[v.number][vnext.number]);
  105.  
  106. if (new geometry.Vector(vprev, v)
  107. .vectorMultiplication(new geometry.Vector(v, vnext)) > 0) {
  108. if (enext != null)
  109. enext.controlPoint = v;
  110. edges[vprev.number][v.number].controlPoint = edges[v.number][vnext.number].controlPoint = v;
  111. continue;
  112. }
  113.  
  114. w = null;
  115. if (enext != null && eprev != null)
  116. w = enext.controlPoint;
  117.  
  118. if (w != null) {
  119. Point tmp1 = v.clone();
  120. Point tmp2 = w.clone();
  121.  
  122. points.add(tmp1);
  123. points.add(tmp2);
  124.  
  125. next.put(tmp1, tmp2);
  126. prev.put(tmp2, tmp1);
  127.  
  128. next.put(tmp2, next.get(w));
  129. prev.put(next.get(w), tmp2);
  130.  
  131. next.put(vprev, tmp1);
  132. prev.put(tmp1, vprev);
  133.  
  134. next.put(w, v);
  135. prev.put(v, w);
  136.  
  137. edges[w.number][v.number] = new Edge(w, v, currentx);
  138. edges[v.number][w.number] = new Edge(v, w, currentx);
  139.  
  140. if (vnext.y > vprev.y) {
  141. enext.controlPoint = v;
  142. edges[vprev.number][v.number].controlPoint = tmp1;
  143. edges[v.number][vnext.number].controlPoint = v;
  144. } else {
  145. enext.controlPoint = tmp1;
  146. edges[vprev.number][v.number].controlPoint = v;
  147. edges[v.number][vnext.number].controlPoint = tmp1;
  148. }
  149. }
  150. }
  151. }
  152.  
  153. Vector<Polygon> withoutLeftist = new Vector<Polygon>();
  154. Vector<Point> current = new Vector<Point>();
  155.  
  156. HashMap<Point, Boolean> was = new HashMap<Point, Boolean>();
  157.  
  158. Point tmp;
  159. for (int i = 0; i < points.size(); i++) {
  160. tmp = points.get(i);
  161.  
  162. if (was.get(tmp) == null) {
  163. current.clear();
  164. while (was.get(tmp) == null) {
  165. was.put(tmp, true);
  166. current.add(tmp);
  167. tmp = next.get(tmp);
  168. }
  169.  
  170. withoutLeftist.add(new Polygon(current.size(), current));
  171. }
  172. }
  173.  
  174. Polygon[] result = new Polygon[withoutLeftist.size()];
  175.  
  176. for (int i = 0; i < withoutLeftist.size(); i++) {
  177. result[i] = withoutLeftist.get(i);
  178. }
  179. return result;
  180. }
  181.  
  182. private Polygon[] regularizeRightist(Vector<Point> allPoints,
  183. HashMap<Point, Point> next, HashMap<Point, Point> prev,
  184. Edge[][] edges, pdouble currentx) {
  185. Arrays.sort(vertexes, new PointsComparator());
  186.  
  187. Point v;
  188. Point vnext;
  189. Point vprev;
  190.  
  191. Point w;
  192.  
  193. Edge enext;
  194. Edge eprev;
  195.  
  196. TreeSet<Edge> line = new TreeSet<Edge>();
  197.  
  198. Vector<Point> points = new Vector<Point>(2 * n);
  199.  
  200. for (int i = 0; i < n; i++) {
  201. points.add(vertexes[i]);
  202. }
  203.  
  204. for (int i = n - 1; i >= 0; i--) {
  205. currentx.value = vertexes[i].x;
  206.  
  207. v = vertexes[i];
  208. vnext = next.get(v);
  209. vprev = prev.get(v);
  210.  
  211. if (vnext.x > v.x && vprev.x > v.x) {
  212. if (vnext.y > vprev.y) {
  213. enext = line.higher(edges[v.number][vnext.number]);
  214. eprev = line.lower(edges[vprev.number][v.number]);
  215. } else {
  216. eprev = line.lower(edges[v.number][vnext.number]);
  217. enext = line.higher(edges[vprev.number][v.number]);
  218. }
  219.  
  220. line.remove(edges[v.number][vnext.number]);
  221. line.remove(edges[vprev.number][v.number]);
  222.  
  223. if (enext != null)
  224. enext.controlPoint = v;
  225. continue;
  226. }
  227.  
  228. if (vprev.x < v.x && v.x < vnext.x) {
  229. enext = line.higher(edges[v.number][vnext.number]);
  230. eprev = line.lower(edges[v.number][vnext.number]);
  231.  
  232. line.remove(edges[v.number][vnext.number]);
  233. line.add(edges[vprev.number][v.number]);
  234.  
  235. if (enext != null)
  236. enext.controlPoint = v;
  237.  
  238. edges[vprev.number][v.number].controlPoint = v;
  239. continue;
  240. }
  241.  
  242. if (vnext.x < v.x && v.x < vprev.x) {
  243. enext = line.higher(edges[vprev.number][v.number]);
  244. eprev = line.lower(edges[vprev.number][v.number]);
  245.  
  246. line.remove(edges[vprev.number][v.number]);
  247. line.add(edges[v.number][vnext.number]);
  248.  
  249. if (enext != null)
  250. enext.controlPoint = v;
  251.  
  252. edges[v.number][vnext.number].controlPoint = v;
  253. continue;
  254. }
  255.  
  256. if (vnext.x < v.x && vprev.x < v.x) {
  257. if (vnext.y > vprev.y) {
  258. enext = line.higher(edges[v.number][vnext.number]);
  259. eprev = line.lower(edges[vprev.number][v.number]);
  260. } else {
  261. eprev = line.lower(edges[v.number][vnext.number]);
  262. enext = line.higher(edges[vprev.number][v.number]);
  263. }
  264.  
  265. line.add(edges[vprev.number][v.number]);
  266. line.add(edges[v.number][vnext.number]);
  267.  
  268. if (new geometry.Vector(vprev, v)
  269. .vectorMultiplication(new geometry.Vector(v, vnext)) > 0) {
  270. edges[vprev.number][v.number].controlPoint = edges[v.number][vnext.number].controlPoint = v;
  271. if (enext != null)
  272. enext.controlPoint = v;
  273. continue;
  274. }
  275.  
  276. w = null;
  277. if (enext != null && eprev != null)
  278. w = enext.controlPoint;
  279.  
  280. if (w != null) {
  281. Point tmp1 = v.clone();
  282. Point tmp2 = w.clone();
  283.  
  284. points.add(tmp1);
  285. points.add(tmp2);
  286.  
  287. next.put(tmp2, tmp1);
  288. prev.put(tmp1, tmp2);
  289.  
  290. next.put(tmp1, vnext);
  291. prev.put(vnext, tmp1);
  292.  
  293. next.put(prev.get(w), tmp2);
  294. prev.put(tmp2, prev.get(w));
  295.  
  296. next.put(v, w);
  297. prev.put(w, v);
  298.  
  299. edges[w.number][v.number] = new Edge(w, v, currentx);
  300. edges[v.number][w.number] = new Edge(v, w, currentx);
  301.  
  302. if (vnext.y < vprev.y) {
  303. edges[vprev.number][v.number].controlPoint = tmp1;
  304. edges[v.number][vnext.number].controlPoint = v;
  305. enext.controlPoint = v;
  306. } else {
  307. edges[vprev.number][v.number].controlPoint = v;
  308. edges[v.number][vnext.number].controlPoint = tmp1;
  309. enext.controlPoint = tmp1;
  310. }
  311. }
  312. }
  313. }
  314.  
  315. Vector<Polygon> res = new Vector<Polygon>();
  316. Vector<Point> current = new Vector<Point>();
  317.  
  318. HashMap<Point, Boolean> was = new HashMap<Point, Boolean>();
  319.  
  320. Point tmp;
  321. for (int i = 0; i < points.size(); i++) {
  322. tmp = points.get(i);
  323.  
  324. if (was.get(tmp) == null) {
  325. current.clear();
  326. while (was.get(tmp) == null) {
  327. was.put(tmp, true);
  328. current.add(tmp);
  329. tmp = next.get(tmp);
  330. }
  331.  
  332. res.add(new Polygon(current.size(), current));
  333. }
  334. }
  335.  
  336. Polygon[] result = new Polygon[res.size()];
  337.  
  338. for (int i = 0; i < res.size(); i++) {
  339. result[i] = res.get(i);
  340. }
  341.  
  342. allPoints.addAll(points);
  343.  
  344. return result;
  345. }
  346.  
  347. public Polygon[] doRegularization() {
  348. for (int i = 0; i < n; i++) {
  349. vertexes[i].number = i;
  350. }
  351.  
  352. Point[] copy = new Point[n];
  353. for (int i = 0; i < n; i++) {
  354. copy[i] = vertexes[i].clone();
  355. }
  356.  
  357. HashMap<Point, Point> next = new HashMap<Point, Point>();
  358. HashMap<Point, Point> prev = new HashMap<Point, Point>();
  359.  
  360. Edge[][] edges = new Edge[n][n];
  361.  
  362. Random rand = new Random();
  363. double angle = rand.nextDouble() * 0.0001 + 0.0001;
  364.  
  365. for (int i = 0; i < n; i++) {
  366. copy[i].rotate(Math.cos(angle), Math.sin(angle));
  367. }
  368.  
  369. pdouble currentx = new pdouble(0);
  370.  
  371. Polygon[] withoutLeftist = regularizeLeftist(copy, next, prev, edges,
  372. currentx);
  373.  
  374. Polygon[] cur;
  375. Vector<Polygon> withoutBreaks = new Vector<Polygon>(2 * n);
  376.  
  377. Vector<Point> allPoints = new Vector<Point>(2 * n);
  378.  
  379. for (int i = 0; i < withoutLeftist.length; i++) {
  380. cur = withoutLeftist[i].regularizeRightist(allPoints, next, prev,
  381. edges, currentx);
  382. for (int j = 0; j < cur.length; j++) {
  383. withoutBreaks.add(cur[j]);
  384. }
  385. }
  386.  
  387. Polygon[] result = new Polygon[withoutBreaks.size()];
  388. for (int i = 0; i < withoutBreaks.size(); i++) {
  389. result[i] = withoutBreaks.get(i);
  390. }
  391.  
  392. for (int i = 0; i < allPoints.size(); i++) {
  393. Point tmp = allPoints.get(i);
  394. tmp.x = vertexes[tmp.number].x;
  395. tmp.y = vertexes[tmp.number].y;
  396. }
  397.  
  398. return result;
  399. }
  400.  
  401. private Polygon[] triangulateMonotone() {
  402. if (n == 3)
  403. return new Polygon[] { this };
  404.  
  405. HashMap<Point, Point> next = new HashMap<Point, Point>();
  406. HashMap<Point, Point> prev = new HashMap<Point, Point>();
  407.  
  408. for (int i = 0; i < n; i++) {
  409. if (i == 0)
  410. prev.put(vertexes[i], vertexes[n - 1]);
  411. else
  412. prev.put(vertexes[i], vertexes[i - 1]);
  413.  
  414. next.put(vertexes[i], vertexes[(i + 1) % n]);
  415. }
  416.  
  417. Vector<Polygon> result = new Vector<Polygon>(n);
  418.  
  419. Point min = new Point(Double.POSITIVE_INFINITY, 0);
  420. Point max = new Point(Double.NEGATIVE_INFINITY, 0);
  421.  
  422. for (int i = 0; i < n; i++) {
  423. if (vertexes[i].x < min.x)
  424. min = vertexes[i];
  425. if (vertexes[i].x > max.x)
  426. max = vertexes[i];
  427. }
  428.  
  429. Point up = min;
  430. Point down = min;
  431.  
  432. Point nextup;
  433. Point nextdown;
  434. Point previous;
  435.  
  436. Point tmp;
  437.  
  438. while (down == min || up != next.get(down)) {
  439. nextup = prev.get(up);
  440. nextdown = next.get(down);
  441.  
  442. if (up == down && up == min) {
  443. if (nextdown.x < nextup.x)
  444. down = nextdown;
  445. else
  446. up = nextup;
  447. continue;
  448. }
  449.  
  450. if (down == next.get(up)) {
  451. if (nextup.x < nextdown.x) {
  452. if (down == min) {
  453. if (new geometry.Vector(nextup, up)
  454. .vectorMultiplication(new geometry.Vector(up,
  455. down)) > 0) {
  456. result.add(new Polygon(3, new Point[] { up, down,
  457. nextup }));
  458. up = nextup;
  459. } else {
  460. result.add(new Polygon(3, new Point[] { up, down,
  461. nextdown }));
  462. down = nextdown;
  463. }
  464. } else {
  465. result.add(new Polygon(3, new Point[] { up, down,
  466. nextup }));
  467. up = nextup;
  468. }
  469. } else {
  470. if (up == min) {
  471. if (new geometry.Vector(up, down)
  472. .vectorMultiplication(new geometry.Vector(down,
  473. nextdown)) > 0) {
  474. result.add(new Polygon(3, new Point[] { up, down,
  475. nextdown }));
  476. down = nextdown;
  477. } else {
  478. result.add(new Polygon(3, new Point[] { nextup, up,
  479. down }));
  480. up = nextup;
  481. }
  482. } else {
  483. result.add(new Polygon(3, new Point[] { up, down,
  484. nextdown }));
  485. down = nextdown;
  486. }
  487. }
  488. continue;
  489. }
  490.  
  491. if (nextup.x < nextdown.x) {
  492. previous = next.get(up);
  493.  
  494. tmp = new Segment(previous, up).intersect(new Segment(nextup,
  495. down))[0];
  496.  
  497. if (tmp == null) {
  498. result
  499. .add(new Polygon(3,
  500. new Point[] { down, nextup, up }));
  501. up = nextup;
  502. } else {
  503. result.add(new Polygon(3,
  504. new Point[] { down, nextdown, up }));
  505. down = nextdown;
  506. }
  507. } else {
  508. previous = prev.get(down);
  509.  
  510. tmp = new Segment(previous, down).intersect(new Segment(
  511. nextdown, up))[0];
  512.  
  513. if (tmp == null) {
  514. result.add(new Polygon(3,
  515. new Point[] { down, nextdown, up }));
  516. down = nextdown;
  517. } else {
  518. result
  519. .add(new Polygon(3,
  520. new Point[] { down, nextup, up }));
  521. up = nextup;
  522. }
  523.  
  524. }
  525. }
  526.  
  527. Polygon[] ans = new Polygon[result.size()];
  528. int j = 0;
  529.  
  530. for (Iterator<Polygon> i = result.iterator(); i.hasNext();) {
  531. ans[j++] = i.next();
  532. }
  533.  
  534. return ans;
  535. }
  536.  
  537. public Polygon[] doTriangulation() {
  538. Polygon[] monotones = doRegularization();
  539.  
  540. Vector<Polygon> result = new Vector<Polygon>();
  541. Polygon[] current;
  542.  
  543. for (int i = 0; i < monotones.length; i++) {
  544. current = monotones[i].triangulateMonotone();
  545.  
  546. for (int j = 0; j < current.length; j++) {
  547. result.add(current[j]);
  548. }
  549. }
  550.  
  551. Polygon[] triangles = new Polygon[result.size()];
  552.  
  553. int j = 0;
  554.  
  555. for (Iterator<Polygon> i = result.iterator(); i.hasNext();) {
  556. triangles[j++] = i.next();
  557. }
  558. return triangles;
  559. }
Add Comment
Please, Sign In to add comment