22 package org.matsim.core.network;
26 import java.util.ArrayList;
27 import java.util.List;
57 public LinkQuadTree(
final double minX,
final double minY,
final double maxX,
final double maxY) {
73 public void remove(
final Link link) {
101 private enum ChildPosition {CHILD_NW, CHILD_NE, CHILD_SE, CHILD_SW,NO_CHILD }
111 private final ArrayList<LinkWrapper>
links =
new ArrayList<>(3);
114 public QuadTreeNode(
final double minX,
final double minY,
final double maxX,
final double maxY) {
115 this.minX = Math.min(minX, maxX);
116 this.minY = Math.min(minY, maxY);
117 this.maxX = Math.max(minX, maxX);
118 this.maxY = Math.max(minY, maxY);
122 if (this.children == null && this.links.isEmpty()) {
133 if (this.children == null) {
136 this.children[pos.ordinal()].
put(w);
144 for (
int i = 0, n = this.links.size(); i < n; i++) {
146 if (w2.link.equals(w.link)) {
147 this.links.remove(i);
152 return this.children[pos.ordinal()].
remove(w);
170 if (tmp < bestDistanceIndicator.
value) {
171 bestDistanceIndicator.
value = tmp;
177 if (this.children != null) {
200 tmp = child.
getNearest(x, y, bestDistanceIndicator);
214 double centerX = (minX +
maxX) / 2;
215 double centerY = (minY +
maxY) / 2;
222 List<LinkWrapper> keep =
new ArrayList<>(this.links.size() / 2);
228 this.children[pos.ordinal()].
put(w);
235 this.links.ensureCapacity(keep.size() + 5);
236 this.links.addAll(keep);
241 double centerX = (minX +
maxX) / 2;
242 double centerY = (minY +
maxY) / 2;
244 if (w.maxX < centerX && w.minY >= centerY) {
248 if (w.minX >= centerX && w.minY >= centerY) {
251 if (w.minX >= centerX && w.maxY < centerY) {
254 if (w.maxX < centerX && w.maxY < centerY) {
267 double centerX = (minX +
maxX) / 2;
268 double centerY = (minY +
maxY) / 2;
269 if (x < centerX && y >= centerY) {
272 if (x >= centerX && y >= centerY) {
297 if (this.minX <= x && x <= this.maxX) {
300 distanceX = Math.min(Math.abs(
this.minX - x), Math.abs(this.maxX - x));
302 if (this.minY <= y && y <= this.maxY) {
305 distanceY = Math.min(Math.abs(
this.minY - y), Math.abs(this.maxY - y));
308 return distanceX * distanceX + distanceY * distanceY;
321 if ((lineDX == 0.0) && (lineDY == 0.0)) {
326 double u = ((x - fx)*lineDX + (y - fy)*lineDY) / (lineDX*lineDX + lineDY*lineDY);
340 private static double calcDistanceIndicator(
final double fromX,
final double fromY,
final double toX,
final double toY) {
341 double xDiff = toX - fromX;
342 double yDiff = toY - fromY;
343 return (xDiff*xDiff) + (yDiff*yDiff);
364 this.minX = fx - Math.abs(fx)*1e-8;
365 this.maxX = fx + Math.abs(fx)*1e-8;
367 this.minX = Math.min(fx, tx);
368 this.maxX = Math.max(fx, tx);
371 this.minY = fy - Math.abs(fy)*1e-8;
372 this.maxY = fy + Math.abs(fy)*1e-8;
374 this.minY = Math.min(fy, ty);
375 this.maxY = Math.max(fy, ty);
double calcDistanceIndicator(final double x, final double y)
static double calcDistanceIndicator(final double fromX, final double fromY, final double toX, final double toY)
Link getNearest(final double x, final double y)
LinkWrapper(final Link link)
ChildPosition getChildPosition(final double x, final double y)
LinkQuadTree(final double minX, final double minY, final double maxX, final double maxY)
QuadTreeNode(final double minX, final double minY, final double maxX, final double maxY)
void put(final LinkWrapper w)
final ArrayList< LinkWrapper > links
static double calcLineSegmentDistanceIndicator(final double x, final double y, final Link link)
MutableDouble(final double value)
void put(final Link link)
LinkWrapper getNearest(final double x, final double y, final MutableDouble bestDistanceIndicator)
boolean remove(final LinkWrapper w)
ChildPosition getChildPosition(final LinkWrapper w)