Bump java lib versions in preparation for 1.9.2
[fw/altos] / altoslib / AltosMapPath.java
index 272a4316c78f212296de23ba1cb43ca82a58dd08..67f35f6c367ac1a226e4f2bc19e67adb55028469 100644 (file)
@@ -3,7 +3,8 @@
  *
  * 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; version 2 of the License.
+ * 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
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altoslib_6;
+package org.altusmetrum.altoslib_14;
 
 import java.io.*;
 import java.lang.Math;
 import java.util.*;
 import java.util.concurrent.*;
 
-class PathPoint {
-       AltosLatLon     lat_lon;
-       int             state;
-
-       public PathPoint(AltosLatLon lat_lon, int state) {
-               this.lat_lon = lat_lon;
-               this.state = state;
-       }
-
-       public boolean equals(PathPoint other) {
-               if (other == null)
-                       return false;
-
-               return lat_lon.equals(other.lat_lon) && state == other.state;
-       }
-}
-
 public abstract class AltosMapPath {
 
-       LinkedList<PathPoint>   points = new LinkedList<PathPoint>();
-       PathPoint               last_point = null;
+       public LinkedList<AltosMapPathPoint>    points = new LinkedList<AltosMapPathPoint>();
+       public AltosMapPathPoint                last_point = null;
 
        static public int stroke_width = 6;
 
        public abstract void paint(AltosMapTransform t);
 
-       public AltosMapRectangle add(double lat, double lon, int state) {
-               PathPoint               point = new PathPoint(new AltosLatLon (lat, lon), state);
+       public AltosMapRectangle add(AltosGPS gps, double time, int state, double gps_height) {
+               AltosMapPathPoint               point = new AltosMapPathPoint(gps, time, state, gps_height);
                AltosMapRectangle       rect = null;
 
                if (!point.equals(last_point)) {
                        if (last_point != null)
-                               rect = new AltosMapRectangle(last_point.lat_lon, point.lat_lon);
+                               rect = new AltosMapRectangle(last_point.gps.lat_lon(), point.gps.lat_lon());
                        points.add (point);
                        last_point = point;
                }
                return rect;
        }
 
+       private double dist(AltosLatLon lat_lon, AltosMapPathPoint point) {
+               return (new AltosGreatCircle(lat_lon.lat,
+                                            lat_lon.lon,
+                                            point.gps.lat,
+                                            point.gps.lon)).distance;
+       }
+
+       public AltosMapPathPoint nearest(AltosLatLon lat_lon) {
+               AltosMapPathPoint nearest = null;
+               double nearest_dist = 0;
+               for (AltosMapPathPoint point : points) {
+                       if (nearest == null) {
+                               nearest = point;
+                               nearest_dist = dist(lat_lon, point);
+                       } else {
+                               double d = dist(lat_lon, point);
+                               if (d < nearest_dist) {
+                                       nearest = point;
+                                       nearest_dist = d;
+                               }
+                       }
+               }
+               return nearest;
+       }
+
        public void clear () {
-               points = new LinkedList<PathPoint>();
+               points = new LinkedList<AltosMapPathPoint>();
        }
 }