private static Point computeLineCentroid(Polyline polyline) { double xSum = 0; double ySum = 0; double weightSum = 0; for (int i = 0; i < polyline.getPathCount(); i++) { Point startPoint = polyline.getPoint(polyline.getPathStart(i)); Point endPoint = polyline.getPoint(polyline.getPathEnd(i) - 1); double dx = endPoint.getX() - startPoint.getX(); double dy = endPoint.getY() - startPoint.getY(); double length = sqrt(dx * dx + dy * dy); weightSum += length; xSum += (startPoint.getX() + endPoint.getX()) * length / 2; ySum += (startPoint.getY() + endPoint.getY()) * length / 2; } return new Point(xSum / weightSum, ySum / weightSum); }
@Override public Point interpolate(Polyline p, double l, double f) { assert (f >= 0 && f <= 1); Point a = p.getPoint(0); double d = l * f; double s = 0, ds = 0; if (f < 0 + 1E-10) { return p.getPoint(0); } if (f > 1 - 1E-10) { return p.getPoint(p.getPointCount() - 1); } for (int i = 1; i < p.getPointCount(); ++i) { Point b = p.getPoint(i); ds = distance(a, b); if ((s + ds) >= d) { return interpolate(a, b, (d - s) / ds); } s = s + ds; a = b; } return null; }
private static Point computeLineCentroid(Polyline polyline) { double xSum = 0; double ySum = 0; double weightSum = 0; for (int i = 0; i < polyline.getPathCount(); i++) { Point startPoint = polyline.getPoint(polyline.getPathStart(i)); Point endPoint = polyline.getPoint(polyline.getPathEnd(i) - 1); double dx = endPoint.getX() - startPoint.getX(); double dy = endPoint.getY() - startPoint.getY(); double length = sqrt(dx * dx + dy * dy); weightSum += length; xSum += (startPoint.getX() + endPoint.getX()) * length / 2; ySum += (startPoint.getY() + endPoint.getY()) * length / 2; } return new Point(xSum / weightSum, ySum / weightSum); }
@Override public double azimuth(Polyline p, double l, double f) { assert (f >= 0 && f <= 1); Point a = p.getPoint(0); double d = l * f; double s = 0, ds = 0; if (f < 0 + 1E-10) { return azimuth(p.getPoint(0), p.getPoint(1), 0); } if (f > 1 - 1E-10) { return azimuth(p.getPoint(p.getPointCount() - 2), p.getPoint(p.getPointCount() - 1), f); } for (int i = 1; i < p.getPointCount(); ++i) { Point b = p.getPoint(i); ds = distance(a, b); if ((s + ds) >= d) { return azimuth(a, b, (d - s) / ds); } s = s + ds; a = b; } return Double.NaN; }
private static Point computeLineCentroid(Polyline polyline) { double xSum = 0; double ySum = 0; double weightSum = 0; for (int i = 0; i < polyline.getPathCount(); i++) { Point startPoint = polyline.getPoint(polyline.getPathStart(i)); Point endPoint = polyline.getPoint(polyline.getPathEnd(i) - 1); double dx = endPoint.getX() - startPoint.getX(); double dy = endPoint.getY() - startPoint.getY(); double length = sqrt(dx * dx + dy * dy); weightSum += length; xSum += (startPoint.getX() + endPoint.getX()) * length / 2; ySum += (startPoint.getY() + endPoint.getY()) * length / 2; } return new Point(xSum / weightSum, ySum / weightSum); }
@Override public double intercept(Polyline p, Point c) { double d = Double.MAX_VALUE; Point a = p.getPoint(0); double s = 0, sf = 0, ds = 0; for (int i = 1; i < p.getPointCount(); ++i) { Point b = p.getPoint(i); ds = distance(a, b); double f_ = intercept(a, b, c); f_ = (f_ > 1) ? 1 : (f_ < 0) ? 0 : f_; Point x = interpolate(a, b, f_); double d_ = distance(c, x); if (d_ < d) { sf = (f_ * ds) + s; d = d_; } s = s + ds; a = b; } return s == 0 ? 0 : sf / s; }
private Polyline monitorRoute(MatcherCandidate candidate) { Polyline routes = new Polyline(); MatcherCandidate predecessor = candidate; while (predecessor != null) { MatcherTransition transition = predecessor.transition(); if (transition != null) { Polyline route = transition.route().geometry(); routes.startPath(route.getPoint(0)); for (int i = 1; i < route.getPointCount(); ++i) { routes.lineTo(route.getPoint(i)); } } predecessor = predecessor.predecessor(); } return routes; }
Point a = source().edge().geometry().getPoint(0); Point b = source().edge().geometry().getPoint(i); s += spatial.distance(a, b); a = b; geometry.lineTo(segment.getPoint(j)); Point a = target().edge().geometry().getPoint(0); Point b = target().edge().geometry().getPoint(i); s += spatial.distance(a, b); a = b; double tf = target().edge().length() * target().fraction(); double s = 0; Point a = source().edge().geometry().getPoint(0); Point b = source().edge().geometry().getPoint(i); s += spatial.distance(a, b); a = b;