X-Git-Url: https://git.gag.com/?a=blobdiff_plain;ds=sidebyside;f=altoslib%2FAltosMapPath.java;h=bbb6c994aae11833dc9853797c7305ad5204f99c;hb=HEAD;hp=272a4316c78f212296de23ba1cb43ca82a58dd08;hpb=29edc37a8de56cb6eb028e3bf3f56aa70f109eba;p=fw%2Faltos diff --git a/altoslib/AltosMapPath.java b/altoslib/AltosMapPath.java index 272a4316..67f35f6c 100644 --- a/altoslib/AltosMapPath.java +++ b/altoslib/AltosMapPath.java @@ -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 @@ -15,53 +16,61 @@ * 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 points = new LinkedList(); - PathPoint last_point = null; + public LinkedList points = new LinkedList(); + 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(); + points = new LinkedList(); } }