University stuff.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Sequential.java 1.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. class Sequential extends Oblig4 {
  2. Sequential(int[] x, int[] y, int n) {
  3. super(x, y, n);
  4. name = "Sequential";
  5. }
  6. @Override
  7. void solve() {
  8. MinMaxXY minmax = findMinMax();
  9. MAX_X = x[minmax.maxX];
  10. MAX_Y = y[minmax.maxY];
  11. IntList indexes = new IntList(n);
  12. for (int i = 0; i < n; ++i)
  13. indexes.add(i);
  14. coHull = pointsRightOf(minmax.maxX, minmax.minX, indexes);
  15. coHull.append(pointsRightOf(minmax.minX, minmax.maxX, indexes));
  16. }
  17. class MinMaxXY {
  18. int minX, maxX, maxY;
  19. }
  20. MinMaxXY findMinMax() {
  21. int minX = 0;
  22. int maxX = 0;
  23. int maxY = 0;
  24. for (int i = 1; i < n; ++i) {
  25. if (x[i] < x[minX])
  26. minX = i;
  27. if (x[i] > x[maxX])
  28. maxX = i;
  29. if (y[i] > y[maxY])
  30. maxY = i;
  31. }
  32. MinMaxXY minmax = new MinMaxXY();
  33. minmax.minX = minX;
  34. minmax.maxX = maxX;
  35. minmax.maxY = maxY;
  36. return minmax;
  37. }
  38. IntList pointsRightOf(int p1, int p2, IntList indexes) {
  39. int p3 = -1;
  40. double p3dist = 0;
  41. int a = lineA(p1, p2);
  42. int b = lineB(p1, p2);
  43. int c = lineC(p1, p2);
  44. IntList nwIndexes = new IntList();
  45. for (int i = 0; i < indexes.size(); ++i) {
  46. int idx = indexes.get(i);
  47. if (idx == p1 || idx == p2)
  48. continue;
  49. double line = lineEquation(a, b, c, idx);
  50. if (line > 0)
  51. continue;
  52. nwIndexes.add(idx);
  53. double dist = Math.abs(dist(line, a, b));
  54. if (dist > p3dist) {
  55. p3dist = dist;
  56. p3 = idx;
  57. }
  58. }
  59. if (p3 == -1) {
  60. IntList l = addPointsOnLine(nwIndexes, a, b, c, p1);
  61. l.add(p2);
  62. return l;
  63. }
  64. IntList l = pointsRightOf(p1, p3, nwIndexes);
  65. l.append(pointsRightOf(p3, p2, nwIndexes));
  66. return l;
  67. }
  68. }