/** * Creates a new {@link InverseDistanceWeightingInterpolator} based on a * {@link KNearestNeighborSearch}. * * @param search * - the {@link KNearestNeighborSearch} * @param p * power applied to the distance, higher values result in * 'sharper' results, 0 results in a non-weighted mean of the * <em>k</em> nearest neighbors. */ public InverseDistanceWeightingInterpolator( final KNearestNeighborSearch< T > search, final double p ) { super( search.numDimensions() ); this.search = search; this.p = p; p2 = p / 2.0; search.search( this ); this.value = search.getSampler( 0 ).get().copy(); this.numNeighbors = search.getK(); }
/** * Creates a new {@link InverseDistanceWeightingInterpolator} using a copy * of the passed {@link KNearestNeighborSearch}. */ @Override public InverseDistanceWeightingInterpolator< T > create( final KNearestNeighborSearch< T > search ) { return new InverseDistanceWeightingInterpolator< T >( search.copy(), p ); }
@Override public T get() { search.search( this ); if ( numNeighbors == 1 || search.getSquareDistance( 0 ) / search.getSquareDistance( 1 ) < minThreshold ) value.set( search.getSampler( 0 ).get() ); else { double sumIntensity = 0; double sumWeights = 0; for ( int i = 0; i < numNeighbors; ++i ) { final Sampler< T > sampler = search.getSampler( i ); if ( sampler == null ) break; final T t = sampler.get(); final double weight = computeWeight( search.getSquareDistance( i ) ); sumWeights += weight; sumIntensity += t.getRealDouble() * weight; } value.setReal( sumIntensity / sumWeights ); } return value; }
public static < P extends Point > ArrayList< LocalCoordinateSystemPointDescriptor< P > > createLocalCoordinateSystemPointDescriptors( final KDTree< VirtualPointNode< P > > tree, final ArrayList< VirtualPointNode< P > > basisPoints, final int numNeighbors, final boolean normalize ) { final KNearestNeighborSearch< VirtualPointNode< P > > nnsearch = new KNearestNeighborSearchOnKDTree< VirtualPointNode< P > >( tree, numNeighbors + 1 ); final ArrayList< LocalCoordinateSystemPointDescriptor< P > > descriptors = new ArrayList< LocalCoordinateSystemPointDescriptor< P > > ( ); for ( final VirtualPointNode< P > p : basisPoints ) { final ArrayList< P > neighbors = new ArrayList< P >(); nnsearch.search( p ); // the first hit is always the point itself for ( int n = 1; n <= numNeighbors + 1; ++n ) neighbors.add( nnsearch.getSampler( n ).get().getPoint() ); try { descriptors.add( new LocalCoordinateSystemPointDescriptor<P>( p.getPoint(), neighbors, normalize ) ); } catch ( NoSuitablePointsException e ) { e.printStackTrace(); } } return descriptors; }
@Override public T get() { search.search( this ); if ( numNeighbors == 1 || search.getSquareDistance( 0 ) / search.getSquareDistance( 1 ) < minThreshold ) value.set( search.getSampler( 0 ).get() ); else { double sumIntensity = 0; double sumWeights = 0; for ( int i = 0; i < numNeighbors; ++i ) { final Sampler< T > sampler = search.getSampler( i ); if ( sampler == null ) break; final T t = sampler.get(); final double weight = computeWeight( search.getSquareDistance( i ) ); sumWeights += weight; sumIntensity += t.getRealDouble() * weight; } value.setReal( sumIntensity / sumWeights ); } return value; }
nnsearch.search( p ); neighbors.add( nnsearch.getSampler( n ).get().getPoint() );
/** * Creates a new {@link InverseDistanceWeightingInterpolator} based on a * {@link KNearestNeighborSearch}. * * @param search * - the {@link KNearestNeighborSearch} * @param p * power applied to the distance, higher values result in * 'sharper' results, 0 results in a non-weighted mean of the * <em>k</em> nearest neighbors. */ public InverseDistanceWeightingInterpolator( final KNearestNeighborSearch< T > search, final double p ) { super( search.numDimensions() ); this.search = search; this.p = p; p2 = p / 2.0; search.search( this ); this.value = search.getSampler( 0 ).get().copy(); this.numNeighbors = search.getK(); }
nnsearch.search( descriptorA ); double best = descriptorA.descriptorDistance( nnsearch.getSampler( 0 ).get() ); double secondBest = descriptorA.descriptorDistance( nnsearch.getSampler( 1 ).get() ); if ( isCorrect( descriptorA.getBasisPoint(), nnsearch.getSampler( 0 ).get().getBasisPoint() ) )
@Override public InverseDistanceWeightingInterpolator< T > copy() { return new InverseDistanceWeightingInterpolator< T >( search.copy(), p ); }
@Override public InverseDistanceWeightingInterpolator< T > copy() { return new InverseDistanceWeightingInterpolator< T >( search.copy(), p ); }
/** * Creates a new {@link InverseDistanceWeightingInterpolator} using a copy * of the passed {@link KNearestNeighborSearch}. */ @Override public InverseDistanceWeightingInterpolator< T > create( final KNearestNeighborSearch< T > search ) { return new InverseDistanceWeightingInterpolator< T >( search.copy(), p ); }