package fr.unistra.pelican.util.data.distances;
import java.util.ArrayList;
import fr.unistra.pelican.util.Keypoint;
import fr.unistra.pelican.util.data.Data;
import fr.unistra.pelican.util.data.KeypointArrayData;
/**
* @author Régis Witz
*/
public class KeypointArrayEuclideanDistance extends EuclideanDistance {
@Override
@SuppressWarnings( "unchecked" )
public double distance( Data d1, Data d2 ) {
ArrayList<Keypoint> values =
( ArrayList<Keypoint> ) ( ( KeypointArrayData ) d1 ).getValues();
ArrayList<Keypoint> values2 =
( ArrayList<Keypoint> ) ( ( KeypointArrayData ) d2 ).getValues();
int nbpoints = values.get(0).getDescLength();
int nbpoints2 = values2.get(0).getDescLength();
if( nbpoints != nbpoints2 ) {
System.err.println( "Incompatible keypoint descriptors lengths !" );
return 1;
}
double distance = 0, d, min;
for ( Keypoint k1 : values ) {
min = 1;
for ( Keypoint k2 : values2 ) {
d = k1.data.distance( k2.data );
if ( d < min ) min = d;
}
distance += min;
}
if ( nbpoints > 0 ) distance /= nbpoints;
assert 0 <= distance && distance <= 1 :
this.getClass().getName() + " €[0;1] unverified : " + distance + ".";
return distance;
}
}