summaryrefslogtreecommitdiff
path: root/altoslib
diff options
context:
space:
mode:
Diffstat (limited to 'altoslib')
-rw-r--r--altoslib/AltosGPS.java4
-rw-r--r--altoslib/AltosMap.java25
-rw-r--r--altoslib/AltosMapPath.java31
-rw-r--r--altoslib/AltosMapPathPoint.java14
-rw-r--r--altoslib/AltosMapTransform.java14
5 files changed, 71 insertions, 17 deletions
diff --git a/altoslib/AltosGPS.java b/altoslib/AltosGPS.java
index 8037eb93..57ac4061 100644
--- a/altoslib/AltosGPS.java
+++ b/altoslib/AltosGPS.java
@@ -92,6 +92,10 @@ public class AltosGPS implements Cloneable {
return odt.toEpochSecond();
}
+ public AltosLatLon lat_lon() {
+ return new AltosLatLon(lat, lon);
+ }
+
public AltosGPS(AltosTelemetryMap map) throws ParseException {
String state = map.get_string(AltosTelemetryLegacy.AO_TELEM_GPS_STATE,
AltosTelemetryLegacy.AO_TELEM_GPS_STATE_ERROR);
diff --git a/altoslib/AltosMap.java b/altoslib/AltosMap.java
index b033cbff..69142c37 100644
--- a/altoslib/AltosMap.java
+++ b/altoslib/AltosMap.java
@@ -222,8 +222,7 @@ public class AltosMap implements AltosMapTileListener, AltosMapStoreListener {
return false;
}
- public void show(AltosGPS gps, int state) {
-
+ public void show(AltosGPS gps, double time, int state, double gps_height) {
/*
* If insufficient gps data, nothing to update
*/
@@ -250,7 +249,7 @@ public class AltosMap implements AltosMapTileListener, AltosMapStoreListener {
}
if (path != null) {
- AltosMapRectangle damage = path.add(gps.lat, gps.lon, state);
+ AltosMapRectangle damage = path.add(gps, time, state, gps_height);
if (damage != null)
repaint(damage, AltosMapPath.stroke_width);
@@ -262,7 +261,7 @@ public class AltosMap implements AltosMapTileListener, AltosMapStoreListener {
}
public void show(AltosState state, AltosListenerState listener_state) {
- show(state.gps, state.state());
+ show(state.gps, state.time, state.state(), state.gps_height());
}
public void centre(AltosLatLon lat_lon) {
@@ -290,13 +289,19 @@ public class AltosMap implements AltosMapTileListener, AltosMapStoreListener {
centre(lat_lon);
}
- public void add_mark(double lat, double lon, int state) {
+ public AltosMapMark add_mark(double lat, double lon, int state) {
+ AltosMapMark mark;
synchronized(marks) {
- AltosMapMark mark = map_interface.new_mark(lat, lon, state);
+ mark = map_interface.new_mark(lat, lon, state);
if (mark != null)
marks.add(mark);
}
repaint();
+ return mark;
+ }
+
+ public void del_mark(AltosMapMark mark) {
+ marks.remove(mark);
}
public void clear_marks() {
@@ -490,6 +495,14 @@ public class AltosMap implements AltosMapTileListener, AltosMapStoreListener {
drag_stop(x, y);
}
+ public AltosMapPathPoint nearest(int x, int y) {
+ notice_user_input();
+ if (path == null)
+ return null;
+ AltosLatLon at = transform.screen_lat_lon(new AltosPointInt(x, y));
+ return path.nearest(at);
+ }
+
public AltosMap(AltosMapInterface map_interface, int scale) {
this.map_interface = map_interface;
this.scale = scale;
diff --git a/altoslib/AltosMapPath.java b/altoslib/AltosMapPath.java
index 7104b2f6..bbb6c994 100644
--- a/altoslib/AltosMapPath.java
+++ b/altoslib/AltosMapPath.java
@@ -32,19 +32,44 @@ public abstract class AltosMapPath {
public abstract void paint(AltosMapTransform t);
- public AltosMapRectangle add(double lat, double lon, int state) {
- AltosMapPathPoint point = new AltosMapPathPoint(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<AltosMapPathPoint>();
}
diff --git a/altoslib/AltosMapPathPoint.java b/altoslib/AltosMapPathPoint.java
index 9a1edd42..88a8bfcf 100644
--- a/altoslib/AltosMapPathPoint.java
+++ b/altoslib/AltosMapPathPoint.java
@@ -24,11 +24,13 @@ import java.util.*;
import java.util.concurrent.*;
public class AltosMapPathPoint {
- public AltosLatLon lat_lon;
+ public AltosGPS gps;
+ public double time;
public int state;
+ public double gps_height;
public int hashCode() {
- return lat_lon.hashCode() ^ state;
+ return Double.valueOf(gps.lat).hashCode() ^ Double.valueOf(gps.lon).hashCode() ^ state;
}
public boolean equals(Object o) {
@@ -40,12 +42,14 @@ public class AltosMapPathPoint {
AltosMapPathPoint other = (AltosMapPathPoint) o;
- return lat_lon.equals(other.lat_lon) && state == other.state;
+ return gps.lat == other.gps.lat && gps.lon == other.gps.lon && state == other.state;
}
- public AltosMapPathPoint(AltosLatLon lat_lon, int state) {
- this.lat_lon = lat_lon;
+ public AltosMapPathPoint(AltosGPS gps, double time, int state, double gps_height) {
+ this.gps = gps;
+ this.time = time;
this.state = state;
+ this.gps_height = gps_height;
}
}
diff --git a/altoslib/AltosMapTransform.java b/altoslib/AltosMapTransform.java
index 6bc6c6f8..9eac2654 100644
--- a/altoslib/AltosMapTransform.java
+++ b/altoslib/AltosMapTransform.java
@@ -67,13 +67,13 @@ public class AltosMapTransform {
return lat_lon(screen_point(screen));
}
- public AltosPointDouble point(AltosLatLon lat_lon) {
+ public AltosPointDouble point(double lat, double lon) {
double x, y;
double e;
- x = lat_lon.lon * scale_x;
+ x = lon * scale_x;
- e = Math.sin(Math.toRadians(lat_lon.lat));
+ e = Math.sin(Math.toRadians(lat));
e = Math.max(e,-(1-1.0E-15));
e = Math.min(e, 1-1.0E-15 );
@@ -82,6 +82,10 @@ public class AltosMapTransform {
return new AltosPointDouble(x, y);
}
+ public AltosPointDouble point(AltosLatLon lat_lon) {
+ return point(lat_lon.lat, lat_lon.lon);
+ }
+
public AltosPointDouble screen(AltosPointDouble point) {
return new AltosPointDouble(point.x - offset_x, point.y - offset_y);
}
@@ -102,6 +106,10 @@ public class AltosMapTransform {
return screen(point(lat_lon));
}
+ public AltosPointDouble screen(double lat, double lon) {
+ return screen(point(lat, lon));
+ }
+
private boolean has_location;
public boolean has_location() {