/*- * #%L * Fiji distribution of ImageJ for the life sciences. * %% * Copyright (C) 2007 - 2017 Fiji developers. * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-2.0.html>. * #L% */ package mpicbg.icp; import fiji.util.KDTree; import fiji.util.NearestNeighborSearch; import fiji.util.node.Leaf; import java.util.ArrayList; import java.util.List; import mpicbg.models.Point; import mpicbg.models.PointMatch; public class SimplePointMatchIdentification < P extends Point & Leaf<P> > implements PointMatchIdentification<P> { double distanceThresold; public SimplePointMatchIdentification( final double distanceThreshold ) { this.distanceThresold = distanceThreshold; } public SimplePointMatchIdentification() { this.distanceThresold = Double.MAX_VALUE; } public void setDistanceThreshold( final double distanceThreshold ) { this.distanceThresold = distanceThreshold; } public double getDistanceThreshold() { return this.distanceThresold; } @Override public ArrayList<PointMatch> assignPointMatches( final List<P> target, final List<P> reference ) { final ArrayList<PointMatch> pointMatches = new ArrayList<PointMatch>(); final KDTree<P> kdTreeTarget = new KDTree<P>( target ); final NearestNeighborSearch<P> nnSearchTarget = new NearestNeighborSearch<P>( kdTreeTarget ); for ( final P point : reference ) { final P correspondingPoint = nnSearchTarget.findNearestNeighbor( point ); if ( correspondingPoint.distanceTo( point ) <= distanceThresold ) pointMatches.add( new PointMatch ( correspondingPoint, point ) ); } return pointMatches; } }