1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
| import java.util.Arrays;
public class PointList { private int coords[]; private int size; public PointList() { this(100); }
public PointList(int capacity) { coords = new int[capacity * 2]; size = 0; }
public int getX(int i) { return coords[0 + 2 * i]; } public int getY(int i) { return coords[1 + 2 * i]; } public int getSize() { return size; } public int getCapacity() { return coords.length / 2; }
public void add(int x, int y) { if(size * 2 == coords.length) { expand(); } coords[0 + 2 * size] = x; coords[1 + 2 * size] = y; size++; }
+ public void add(int index, int x, int y) + { + if(index < 0 || index > size + 2) + { + throw new IndexOutOfBoundsException(); + } + if(size * 2 == coords.length) { expand(); } + System.arraycopy(coords, index * 2, coords, index * 2 + 2, 2 * (size - index)); + coords[0 + 2 * index] = x; + coords[1 + 2 * index] = y; + size++; + }
public void clear() { size = 0; }
public void setCapacity(int c) { if(c < size) { c = size; } if(c < 1) { c = 1; } coords = Arrays.copyOf(coords, c * 2); }
protected void expand() { coords = Arrays.copyOf(coords, coords.length + 100); }
+ public void ensureCapacity(int c) + { + if(coords.length * 2 < c) + { + setCapacity(c); + } + }
+ public void add(PointList other) + { + ensureCapacity(size + other.size); + System.arraycopy(other.coords, 0, coords, size * 2, other.size * 2); + }
+ public PointList copyRange(int start, int length) + { + PointList temp = new PointList(length); + System.arraycopy(coords, 0, temp.coords, 0, (length > size ? size : length) * 2); + return temp + } + public void remove(int index) + { + if(index < 0 || index > size) + { + throw new IndexOutOfBoundsException(); + } + if(size > 1) + { + System.arraycopy(coords, index * 2 + 2, coords, index * 2, 2 * (size - index)); + } + size--; + } } |