University stuff.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

Sequential.java 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. class Sequential extends Oblig4 {
  2. Sequential(NPunkter17 points) {
  3. super(points);
  4. name = "Sequential";
  5. }
  6. @Override
  7. void solve() {
  8. findMinMaxXY();
  9. MAX_X = x[maxX];
  10. MAX_Y = y[maxY];
  11. IntList indexes = new IntList(n);
  12. for (int i = 0; i < n; ++i)
  13. indexes.add(i);
  14. coHull = pointsRightOf(maxX, minX, indexes);
  15. coHull.append(pointsRightOf(minX, maxX, indexes));
  16. for (int i = 0; i < coHull.size(); ++i) {
  17. System.out.print(coHull.get(i)+" ");
  18. }
  19. System.out.println("");
  20. }
  21. void findMinMaxXY() {
  22. minX = 0;
  23. maxX = 0;
  24. minY = 0;
  25. maxY = 0;
  26. for (int i = 1; i < n; ++i) {
  27. int px = x[i];
  28. if (px < x[minX])
  29. minX = i;
  30. if (px > x[maxX])
  31. maxX = i;
  32. int py = y[i];
  33. if (py < y[minY])
  34. minY = i;
  35. if (py > y[maxY])
  36. maxY = i;
  37. }
  38. }
  39. IntList addPointsOnLine(IntList indexes, int a, int b, int c, int p1) {
  40. IntList l = new IntList();
  41. // Add points on the line between p1 and p2
  42. for (int i = 0; i < indexes.size(); ++i) {
  43. int idx = indexes.get(i);
  44. double line = lineEquation(a, b, c, idx);
  45. if (line == 0)
  46. l.add(idx);
  47. }
  48. // Calculate distances for sorting
  49. double[] dists = new double[l.size()];
  50. for (int i = 0; i < l.size(); ++i) {
  51. dists[i] = pointDist(p1, l.get(i));
  52. }
  53. // Sort points based on distance from p1
  54. // (Bubble sort, but it's usually really few elements)
  55. boolean sorted;
  56. do {
  57. sorted = true;
  58. // Loop through points, swap non-sorted ones
  59. for (int i = 1; i < l.size(); ++i) {
  60. double dist = dists[i];
  61. double prevDist = dists[i - 1];
  62. // Skip if already sorted
  63. if (prevDist <= dist)
  64. continue;
  65. sorted = false;
  66. // Swap indexes
  67. int tmpi = l.data[i];
  68. l.data[i] = l.data[i - 1];
  69. l.data[i - 1] = tmpi;
  70. // Swap distances
  71. double tmpd = dists[i];
  72. dists[i] = dists[i - 1];
  73. dists[i - 1] = tmpd;
  74. }
  75. } while (!sorted);
  76. return l;
  77. }
  78. IntList pointsRightOf(int p1, int p2, IntList indexes) {
  79. int p3 = -1;
  80. double p3dist = 0;
  81. int a = lineA(p1, p2);
  82. int b = lineB(p1, p2);
  83. int c = lineC(p1, p2);
  84. IntList nwIndexes = new IntList();
  85. for (int i = 0; i < indexes.size(); ++i) {
  86. int idx = indexes.get(i);
  87. if (idx == p1 || idx == p2)
  88. continue;
  89. double line = lineEquation(a, b, c, idx);
  90. if (line > 0)
  91. continue;
  92. nwIndexes.add(idx);
  93. double dist = Math.abs(dist(line, a, b));
  94. if (dist > p3dist) {
  95. p3dist = dist;
  96. p3 = idx;
  97. }
  98. }
  99. if (p3 == -1) {
  100. IntList l = addPointsOnLine(nwIndexes, a, b, c, p1);
  101. l.add(p2);
  102. return l;
  103. }
  104. IntList l = pointsRightOf(p1, p3, nwIndexes);
  105. l.append(pointsRightOf(p3, p2, nwIndexes));
  106. return l;
  107. }
  108. }