sascha@361: package de.intevation.gnv.math;
sascha@361: 
sascha@779: import com.vividsolutions.jts.geom.Coordinate;
sascha@779: 
sascha@361: import java.util.Comparator;
sascha@361: 
sascha@361: /**
sascha@807:  * Compares two coordinates a and b by their L1(Manhattan) distance
sascha@805:  * relative to a reference point r.
sascha@805:  * da = L1(a, r)<br>
sascha@805:  * db = L1(b, r)<br>
sascha@805:  * -1 if da &lt; db, +1 if da &gt; db, 0 else.
sascha@798:  * @author <a href="mailto:sascha.teichmann@intevation.de">Sascha L. Teichmann</a>
sascha@361:  */
sascha@361: public  class L1Comparator
sascha@361: implements    Comparator
sascha@361: {
sascha@361:     private Coordinate ref;
sascha@361: 
sascha@805:     /**
sascha@805:      * Default constructor.
sascha@805:      */
sascha@474:     public L1Comparator() {
sascha@474:     }
sascha@474: 
sascha@805:     /**
sascha@805:      * Constructor to create a L1Comparator with a given reference point.
sascha@805:      * @param ref The reference point.
sascha@805:      */
sascha@361:     public L1Comparator(Coordinate ref) {
sascha@361:         this.ref = ref;
sascha@361:     }
sascha@361: 
sascha@805:     /**
sascha@805:      * Explicitly sets the reference point.
sascha@805:      * @param ref The reference point.
sascha@805:      */
sascha@474:     public void setReference(Coordinate ref) {
sascha@474:         this.ref = ref;
sascha@474:     }
sascha@474: 
sascha@805:     /**
sascha@805:      * Compares to coordinate by their L1 distance to the reference point.
sascha@805:      * @param a The first coordinate.
sascha@805:      * @param b The second coordinate.
sascha@805:      * @return -1 if L1(a, ref) &lt; L1(b, ref),
sascha@805:      * +1 if L1(a, ref) &gt; L1(b, ref), 0 else.
sascha@805:      */
sascha@361:     public int compare(Object a, Object b) {
sascha@361:         Coordinate pa = (Coordinate)a;
sascha@361:         Coordinate pb = (Coordinate)b;
sascha@798:         double da = L1(ref, pa);
sascha@798:         double db = L1(ref, pb);
sascha@361:         if (da < db) return -1;
sascha@361:         if (da > db) return +1;
sascha@361:         return 0;
sascha@361:     }
sascha@798: 
sascha@805:     /**
sascha@805:      * Computes the L1 distance between two points a and b:<br>
sascha@805:      * L1(a, b) = abs(a.x - b.x) + abs(a.y - b.y)
sascha@805:      * @param a The first point.
sascha@805:      * @param b The second point.
sascha@805:      * @return The L1 distance.
sascha@805:      */
sascha@798:     public static double L1(Coordinate a, Coordinate b) {
sascha@798:         return Math.abs(a.x - b.x) + Math.abs(a.y - b.y);
sascha@798:     }
sascha@361: }
sascha@798: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :