University stuff.
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

Sequential.java 1.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. class Sequential extends Oblig4 {
  2. Sequential(NPunkter17 points) {
  3. super(points);
  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. for (int i = 0; i < coHull.size(); ++i) {
  17. System.out.print(coHull.get(i)+" ");
  18. }
  19. System.out.println("");
  20. }
  21. class MinMaxXY {
  22. int minX, maxX, maxY;
  23. }
  24. MinMaxXY findMinMax() {
  25. int minX = 0;
  26. int maxX = 0;
  27. int maxY = 0;
  28. for (int i = 1; i < n; ++i) {
  29. int px = x[i];
  30. if (px < x[minX])
  31. minX = i;
  32. if (px > x[maxX])
  33. maxX = i;
  34. int py = y[i];
  35. if (py > y[maxY])
  36. maxY = i;
  37. }
  38. MinMaxXY minmax = new MinMaxXY();
  39. minmax.minX = minX;
  40. minmax.maxX = maxX;
  41. minmax.maxY = maxY;
  42. return minmax;
  43. }
  44. IntList pointsRightOf(int p1, int p2, IntList indexes) {
  45. int p3 = -1;
  46. double p3dist = 0;
  47. int a = lineA(p1, p2);
  48. int b = lineB(p1, p2);
  49. int c = lineC(p1, p2);
  50. IntList nwIndexes = new IntList();
  51. for (int i = 0; i < indexes.size(); ++i) {
  52. int idx = indexes.get(i);
  53. if (idx == p1 || idx == p2)
  54. continue;
  55. double line = lineEquation(a, b, c, idx);
  56. if (line > 0)
  57. continue;
  58. nwIndexes.add(idx);
  59. double dist = Math.abs(dist(line, a, b));
  60. if (dist > p3dist) {
  61. p3dist = dist;
  62. p3 = idx;
  63. }
  64. }
  65. if (p3 == -1) {
  66. IntList l = addPointsOnLine(nwIndexes, a, b, c, p1);
  67. l.add(p2);
  68. return l;
  69. }
  70. IntList l = pointsRightOf(p1, p3, nwIndexes);
  71. l.append(pointsRightOf(p3, p2, nwIndexes));
  72. return l;
  73. }
  74. }