protected static final float distance(Coordinate a, Coordinate b) { float s = 0; for (int i = 0; i < a.getDimensions(); i++) { final float fa = a.getOrdinate(i).floatValue(); final float fb = b.getOrdinate(i).floatValue(); s += (fa - fb) * (fa - fb); } return s; }
@Override public String asciiHeader() { return coord.asciiHeader(); }
@Override public byte[] binaryHeader() { return coord.binaryHeader(); }
@Override public Number getOrdinate(int dimension) { return coord.getOrdinate(dimension); }
@Override public int getDimensions() { return coord.getDimensions(); }
@Override public void setOrdinate(int dimension, Number value) { coord.setOrdinate(dimension, value); } }
@Override public void readBinary(DataInput in) throws IOException { coord.readBinary(in); }
@Override public void readASCII(Scanner in) throws IOException { coord.readASCII(in); }
@Override public void writeBinary(DataOutput out) throws IOException { coord.writeBinary(out); }
@Override public void writeASCII(PrintWriter out) throws IOException { coord.writeASCII(out); }
/** * Construct a {@link Point2dImpl} using the first two ordinates of a * {@link Coordinate}. * * @param coord * the {@link Coordinate} */ public Point2dImpl(Coordinate coord) { x = coord.getOrdinate(0).floatValue(); y = coord.getOrdinate(1).floatValue(); }
protected static final float distance(Coordinate a, Coordinate b) { float s = 0; for (int i = 0; i < a.getDimensions(); i++) { final float fa = a.getOrdinate(i).floatValue(); final float fb = b.getOrdinate(i).floatValue(); s += (fa - fb) * (fa - fb); } return s; }
discriminate = tmpNode._discriminate; ordinate1 = tmpNode._point.getOrdinate(discriminate).doubleValue(); ordinate2 = lowerExtreme.getOrdinate(discriminate).doubleValue(); ordinate2 = upperExtreme.getOrdinate(discriminate).doubleValue();
/** * Determines if a point is contained within a given k-dimensional bounding * box. */ static final boolean isContained( Coordinate point, Coordinate lower, Coordinate upper) { int dimensions; double ordinate1, ordinate2, ordinate3; dimensions = point.getDimensions(); for (int i = 0; i < dimensions; ++i) { ordinate1 = point.getOrdinate(i).doubleValue(); ordinate2 = lower.getOrdinate(i).doubleValue(); ordinate3 = upper.getOrdinate(i).doubleValue(); if (ordinate1 < ordinate2 || ordinate1 > ordinate3) return false; } return true; }
discriminate = tmpNode._discriminate; ordinate1 = tmpNode._point.getOrdinate(discriminate).doubleValue(); ordinate2 = lowerExtreme.getOrdinate(discriminate).doubleValue(); ordinate2 = upperExtreme.getOrdinate(discriminate).doubleValue();
/** * Determines if a point is contained within a given k-dimensional bounding * box. */ static final boolean isContained( Coordinate point, Coordinate lower, Coordinate upper) { int dimensions; double ordinate1, ordinate2, ordinate3; dimensions = point.getDimensions(); for (int i = 0; i < dimensions; ++i) { ordinate1 = point.getOrdinate(i).doubleValue(); ordinate2 = lower.getOrdinate(i).doubleValue(); ordinate3 = upper.getOrdinate(i).doubleValue(); if (ordinate1 < ordinate2 || ordinate1 > ordinate3) return false; } return true; }
private void checkSubtree(KDNode<T> node, Coordinate query, NNState state) { if (node == null) return; final float dist = distance(query, node._point); if (dist < state.bestDist) { state.best = node._point; state.bestDist = dist; } if (state.bestDist == 0) return; final float d = node._point.getOrdinate(node._discriminate).floatValue() - query.getOrdinate(node._discriminate).floatValue(); if (d * d > state.bestDist) { // check subtree final double ordinate1 = query.getOrdinate(node._discriminate).doubleValue(); final double ordinate2 = node._point.getOrdinate(node._discriminate).doubleValue(); if (ordinate1 > ordinate2) checkSubtree(node._right, query, state); else checkSubtree(node._left, query, state); } else { checkSubtree(node._left, query, state); checkSubtree(node._right, query, state); } }
private Stack<KDNode<T>> walkdown(Coordinate point) { if (_root == null) return null; else { final Stack<KDNode<T>> stack = new Stack<KDNode<T>>(); int discriminate, dimensions; KDNode<T> curNode, tmpNode; double ordinate1, ordinate2; curNode = _root; do { tmpNode = curNode; stack.push(tmpNode); if (tmpNode._point == point) return stack; discriminate = tmpNode._discriminate; ordinate1 = point.getOrdinate(discriminate).doubleValue(); ordinate2 = tmpNode._point.getOrdinate(discriminate).doubleValue(); if (ordinate1 > ordinate2) curNode = tmpNode._right; else curNode = tmpNode._left; } while (curNode != null); dimensions = point.getDimensions(); if (++discriminate >= dimensions) discriminate = 0; return stack; } }
private void checkSubtree(KDNode<T> node, Coordinate query, NNState state) { if (node == null) return; final float dist = distance(query, node._point); if (dist < state.bestDist) { state.best = node._point; state.bestDist = dist; } if (state.bestDist == 0) return; final float d = node._point.getOrdinate(node._discriminate).floatValue() - query.getOrdinate(node._discriminate).floatValue(); if (d * d > state.bestDist) { // check subtree final double ordinate1 = query.getOrdinate(node._discriminate).doubleValue(); final double ordinate2 = node._point.getOrdinate(node._discriminate).doubleValue(); if (ordinate1 > ordinate2) checkSubtree(node._right, query, state); else checkSubtree(node._left, query, state); } else { checkSubtree(node._left, query, state); checkSubtree(node._right, query, state); } }
private Stack<KDNode<T>> walkdown(Coordinate point) { if (_root == null) return null; else { final Stack<KDNode<T>> stack = new Stack<KDNode<T>>(); int discriminate, dimensions; KDNode<T> curNode, tmpNode; double ordinate1, ordinate2; curNode = _root; do { tmpNode = curNode; stack.push(tmpNode); if (tmpNode._point == point) return stack; discriminate = tmpNode._discriminate; ordinate1 = point.getOrdinate(discriminate).doubleValue(); ordinate2 = tmpNode._point.getOrdinate(discriminate).doubleValue(); if (ordinate1 > ordinate2) curNode = tmpNode._right; else curNode = tmpNode._left; } while (curNode != null); dimensions = point.getDimensions(); if (++discriminate >= dimensions) discriminate = 0; return stack; } }