/** * Computes the difference between two points: <code>p1 - p2</code>. * @param p1 A point. * @param p2 Another point. * @return The difference as a point object. */ public static Point diff(Point p1, Point p2) { return new Point(p1.x - p2.x, p1.y - p2.y); }
static double findMinDist(Point pos, Iterable<Point> points) { double minDist = Double.POSITIVE_INFINITY; for (final Point p : points) { final double dist = Point.distance(pos, p); if (dist < minDist) { minDist = dist; } } return minDist; }
/** * Warning: very inefficient! If this function is needed regularly it is * advised to use {@link TableGraph} instead. {@inheritDoc} */ @Override public Collection<Point> getIncomingConnections(Point node) { final Set<Point> set = new LinkedHashSet<>(); for (final Entry<Point, Point> entry : multimap.entries()) { if (entry.getValue().equals(node)) { set.add(entry.getKey()); } } return set; }
/** * Returns the center of a list of points. * @param points The list of points * @return A new point indicating the center of the given points. */ public static Point centroid(Iterable<Point> points) { int size = 0; Point sumPoint = new Point(0, 0); for (final Point p : points) { sumPoint = Point.add(sumPoint, p); size++; } return divide(sumPoint, size); }
static void addPath(Graph<?> graph, Point... points) { final List<Point> newPoints = newArrayList(); for (int i = 0; i < points.length - 1; i++) { final double dist = Point.distance(points[i], points[i + 1]); final Point unit = Point.divide(Point.diff(points[i + 1], points[i]), dist); final int numPoints = DoubleMath.roundToInt(dist / POINT_DISTANCE, RoundingMode.FLOOR); for (int j = 0; j < numPoints; j++) { final double factor = j * POINT_DISTANCE; newPoints.add(new Point(points[i].x + factor * unit.x, points[i].y + factor * unit.y)); } } newPoints.add(points[points.length - 1]); Graphs.addPath(graph, newPoints.toArray(new Point[newPoints.size()])); }
@Test public void pointFuncs() { assertEquals(new Point(0, 0), Point.diff(new Point(10, 0), new Point(10, 0))); assertEquals(new Point(234, 333.3), PointTestUtil .duplicate(Point.parsePoint(new Point(234, 333.3).toString()))); assertFalse(new Point(0, 0).equals(null)); assertFalse(new Point(0, 0).equals(new Point(0, 1))); assertFalse(new Point(0, 0).equals(new Point(1, 0))); assertFalse(new Point(0, 0).equals(new Point(1, 1))); assertTrue(new Point(0, 0).equals(new Point(0, 0))); assertFalse(new Point(0, 0).equals(new Object())); assertFalse(new Point(0, 0).equals(new Point(1, 0))); }
@Test public void distanceTest() { final Point p1 = new Point(0, 0); final Point p2 = new Point(10, 0); final Point p3 = new Point(10, 10); final Point p4 = new Point(0, 10); assertEquals(10, Point.distance(p1, p2), EPSILON); assertEquals(14.14, Point.distance(p1, p3), 0.01); assertEquals(14.14, Point.distance(p3, p1), 0.01); assertEquals(10, Point.distance(p1, p4), EPSILON); assertEquals(14.14, Point.distance(p2, p4), 0.01); assertEquals(14.14, Point.distance(p4, p2), 0.01); }
@Override public int hashCode() { int h = 1; h *= 1000003; h ^= (this.time >>> 32) ^ this.time; h *= 1000003; h ^= this.position.hashCode(); return h; }
static Point unit(Point from, Point to) { return normalize(Point.diff(from, to)); }
static Point normalize(Point p) { return Point.divide(p, PointUtil.length(p)); }
static void addPath(Graph<?> graph, Point... points) { final List<Point> newPoints = newArrayList(); for (int i = 0; i < points.length - 1; i++) { final double dist = Point.distance(points[i], points[i + 1]); final Point unit = Point.divide(Point.diff(points[i + 1], points[i]), dist); final int numPoints = DoubleMath.roundToInt(dist / POINT_DISTANCE, RoundingMode.FLOOR); for (int j = 0; j < numPoints; j++) { final double factor = j * POINT_DISTANCE; newPoints.add(new Point(points[i].x + factor * unit.x, points[i].y + factor * unit.y)); } } newPoints.add(points[points.length - 1]); Graphs.addPath(graph, newPoints.toArray(new Point[newPoints.size()])); }
/** * Returns the center of a list of points. * @param points The list of points * @return A new point indicating the center of the given points. */ public static Point centroid(Iterable<Point> points) { int size = 0; Point sumPoint = new Point(0, 0); for (final Point p : points) { sumPoint = Point.add(sumPoint, p); size++; } return divide(sumPoint, size); }
@Override public int hashCode() { int h = 1; h *= 1000003; h ^= (this.time >>> 32) ^ this.time; h *= 1000003; h ^= this.position.hashCode(); return h; }
/** * Situation: <code>SW(tru2) ->- SE ->- tru1 ->- NE </code><br> * tru2 moves towards tru1, it should end up between SE and tru1. */ @Test public void followPathMoveTowardOther() { final TestRoadUser tru1 = new TestRoadUser(); model.addObjectAt(tru1, SW); model.followPath(tru1, asPath(SW, SE, NE), hour(12)); final TestRoadUser tru2 = new TestRoadUser(); model.addObjectAt(tru2, SW); final MoveProgress pp = model.followPath(tru2, asPath(SW, SE, model.getPosition(tru1)), hour(11)); assertEquals(11, pp.distance().getValue(), EPSILON); final Point p1 = model.getPosition(tru1); final Point p2 = model.getPosition(tru2); final Point diff = Point.diff(p1, p2); assertTrue(diff.x == 0 && diff.y > 0); }
/** * Computes the sum between two points: <code>p1 + p2</code>. * @param p1 A point. * @param p2 Another point. * @return The sum as a point object. */ public static Point add(Point p1, Point p2) { return new Point(p1.x + p2.x, p1.y + p2.y); }