123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- class Sequential extends Oblig4 {
- Sequential(NPunkter17 points) {
- super(points);
- name = "Sequential";
- }
-
- @Override
- void solve() {
- findMinMaxXY();
- MAX_X = x[maxX];
- MAX_Y = y[maxY];
-
- IntList indexes = new IntList(n);
- for (int i = 0; i < n; ++i)
- indexes.add(i);
-
- coHull = pointsRightOf(maxX, minX, indexes);
- coHull.append(pointsRightOf(minX, maxX, indexes));
-
- for (int i = 0; i < coHull.size(); ++i) {
- System.out.print(coHull.get(i)+" ");
- }
- System.out.println("");
- }
-
- void findMinMaxXY() {
- minX = 0;
- maxX = 0;
- minY = 0;
- maxY = 0;
-
- for (int i = 1; i < n; ++i) {
- int px = x[i];
- if (px < x[minX])
- minX = i;
- if (px > x[maxX])
- maxX = i;
-
- int py = y[i];
- if (py < y[minY])
- minY = i;
- if (py > y[maxY])
- maxY = i;
- }
- }
-
- IntList addPointsOnLine(IntList indexes, int a, int b, int c, int p1) {
- IntList l = new IntList();
-
- // Add points on the line between p1 and p2
- for (int i = 0; i < indexes.size(); ++i) {
- int idx = indexes.get(i);
-
- double line = lineEquation(a, b, c, idx);
- if (line == 0)
- l.add(idx);
- }
-
- // Calculate distances for sorting
- double[] dists = new double[l.size()];
- for (int i = 0; i < l.size(); ++i) {
- dists[i] = pointDist(p1, l.get(i));
- }
-
- // Sort points based on distance from p1
- // (Bubble sort, but it's usually really few elements)
- boolean sorted;
- do {
- sorted = true;
-
- // Loop through points, swap non-sorted ones
- for (int i = 1; i < l.size(); ++i) {
- double dist = dists[i];
- double prevDist = dists[i - 1];
-
- // Skip if already sorted
- if (prevDist <= dist)
- continue;
-
- sorted = false;
-
- // Swap indexes
- int tmpi = l.data[i];
- l.data[i] = l.data[i - 1];
- l.data[i - 1] = tmpi;
-
- // Swap distances
- double tmpd = dists[i];
- dists[i] = dists[i - 1];
- dists[i - 1] = tmpd;
- }
- } while (!sorted);
-
- return l;
- }
-
- IntList pointsRightOf(int p1, int p2, IntList indexes) {
- int p3 = -1;
- double p3dist = 0;
-
- int a = lineA(p1, p2);
- int b = lineB(p1, p2);
- int c = lineC(p1, p2);
-
- IntList nwIndexes = new IntList();
-
- for (int i = 0; i < indexes.size(); ++i) {
- int idx = indexes.get(i);
- if (idx == p1 || idx == p2)
- continue;
-
- double line = lineEquation(a, b, c, idx);
- if (line > 0)
- continue;
-
- nwIndexes.add(idx);
-
- double dist = Math.abs(dist(line, a, b));
- if (dist > p3dist) {
- p3dist = dist;
- p3 = idx;
- }
- }
-
- if (p3 == -1) {
- IntList l = addPointsOnLine(nwIndexes, a, b, c, p1);
- l.add(p2);
-
- return l;
- }
-
- IntList l = pointsRightOf(p1, p3, nwIndexes);
- l.append(pointsRightOf(p3, p2, nwIndexes));
- return l;
- }
- }
|