From c3994dd82d489289ebc99ff9c5fa88f560c023ac Mon Sep 17 00:00:00 2001 From: Anthony Towns Date: Sun, 21 Nov 2010 13:07:11 +1000 Subject: [PATCH] AltosSiteMap: extend map if rocket goes far away --- ao-tools/altosui/AltosSiteMap.java | 130 +++++++++++++++++-------- ao-tools/altosui/AltosSiteMapTile.java | 22 ++--- 2 files changed, 98 insertions(+), 54 deletions(-) diff --git a/ao-tools/altosui/AltosSiteMap.java b/ao-tools/altosui/AltosSiteMap.java index 2c542061..25450e7e 100644 --- a/ao-tools/altosui/AltosSiteMap.java +++ b/ao-tools/altosui/AltosSiteMap.java @@ -36,7 +36,7 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay { // preferred vertical step in a tile in naut. miles // will actually choose a step size between x and 2x, where this // is 1.5x - static final double tile_size_nmi = 1.5; + static final double tile_size_nmi = 0.75; static final int px_size = 512; @@ -106,8 +106,23 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay { return latlng(pt, scale_x, scale_y); } - AltosSiteMapTile [] mapTiles = new AltosSiteMapTile[9]; - Point2D.Double [] tileOffset = new Point2D.Double[9]; + Vector mapTiles = new Vector(); + Point2D.Double centre; + + private Point tileOffset(AltosSiteMapTile tile) { + GridBagConstraints c = layout.getConstraints(tile); + return new Point(c.gridx - 100, c.gridy - 100); + } + private Point2D.Double tileCoordOffset(AltosSiteMapTile tile) { + Point p = tileOffset(tile); + return new Point2D.Double(centre.x - p.x*px_size, + centre.y - p.y * px_size); + } + + private Point tileOffset(Point2D.Double p) { + return new Point((int)Math.floor((centre.x+p.x)/px_size), + (int)Math.floor((centre.y+p.y)/px_size)); + } private Point2D.Double getBaseLocation(double lat, double lng) { Point2D.Double locn, north_step; @@ -132,15 +147,16 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay { // nothing } - private void bgLoadMap(final int i, + private void bgLoadMap(final AltosSiteMapTile tile, final File pngfile, final String pngurl) { + //System.out.printf("Loading/fetching map %s\n", pngfile); Thread thread = new Thread() { public void run() { ImageIcon res; res = AltosSiteMapCache.fetchAndLoadMap(pngfile, pngurl); if (res != null) { - mapTiles[i].loadMap(res); + tile.loadMap(res); } else { System.out.printf("# Failed to fetch file %s\n", pngfile); System.out.printf(" wget -O '%s' ''\n", pngfile, pngurl); @@ -154,15 +170,16 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay { AltosPreferences.init(null); AltosSiteMap asm = new AltosSiteMap(true); - Point2D.Double c = asm.getBaseLocation(lat, lng); + asm.centre = asm.getBaseLocation(lat, lng); + Point2D.Double p = new Point2D.Double(); Point2D.Double p2; int dx = -w/2, dy = -h/2; for (int y = dy; y < h+dy; y++) { for (int x = dx; x < w+dx; x++) { LatLng map_latlng = asm.latlng( - -c.x + x*px_size + px_size/2, - -c.y + y*px_size + px_size/2); + -asm.centre.x + x*px_size + px_size/2, + -asm.centre.y + y*px_size + px_size/2); File pngfile = asm.MapFile(map_latlng.lat, map_latlng.lng); String pngurl = asm.MapURL(map_latlng.lat, map_latlng.lng); if (pngfile.exists()) { @@ -177,22 +194,21 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay { } } - private void initMaps(double lat, double lng) { - Point2D.Double c = getBaseLocation(lat, lng); - Point2D.Double p = new Point2D.Double(); + private void initMap(AltosSiteMapTile tile) { + Point2D.Double offset = tileCoordOffset(tile); - for (int i = 0; i < 9; i++) { - int x = i%3 - 1, y = i/3 - 1; + LatLng map_latlng = latlng(px_size/2-offset.x, px_size/2-offset.y); - tileOffset[i] = new Point2D.Double( - c.x - x*px_size, p.y = c.y - y*px_size); - LatLng map_latlng = latlng( - -tileOffset[i].x+px_size/2, - -tileOffset[i].y+px_size/2); + File pngfile = MapFile(map_latlng.lat, map_latlng.lng); + String pngurl = MapURL(map_latlng.lat, map_latlng.lng); + bgLoadMap(tile, pngfile, pngurl); + } + + private void initMaps(double lat, double lng) { + centre = getBaseLocation(lat, lng); - File pngfile = MapFile(map_latlng.lat, map_latlng.lng); - String pngurl = MapURL(map_latlng.lat, map_latlng.lng); - bgLoadMap(i, pngfile, pngurl); + for (AltosSiteMapTile tile : mapTiles) { + initMap(tile); } } @@ -211,6 +227,8 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay { } boolean initialised = false; + Point2D.Double last_pt = null; + int last_state = -1; public void show(AltosState state, int crc_errors) { // if insufficient gps data, nothing to update if (state.gps == null) @@ -228,10 +246,51 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay { } Point2D.Double pt = pt(state.gps.lat, state.gps.lon); - for (int x = 0; x < mapTiles.length; x++) { - mapTiles[x].show(state, crc_errors, - translatePoint(pt, tileOffset[x])); + if (last_pt == pt && last_state == state.state) + return; + + if (last_pt == null) { + last_pt = pt; + } + boolean in_any = false; + for (AltosSiteMapTile tile : mapTiles) { + Point2D.Double ref, lref; + ref = translatePoint(pt, tileCoordOffset(tile)); + lref = translatePoint(last_pt, tileCoordOffset(tile)); + tile.show(state, crc_errors, lref, ref); + if (0 <= ref.x && ref.x < px_size) + if (0 <= ref.y && ref.y < px_size) + in_any = true; } + if (!in_any) { + AltosSiteMapTile tile = addTileAt(tileOffset(pt)); + Point2D.Double ref, lref; + ref = translatePoint(pt, tileCoordOffset(tile)); + lref = translatePoint(last_pt, tileCoordOffset(tile)); + initMap(tile); + setViewportView(comp); + tile.show(state, crc_errors, lref, ref); + } + last_pt = pt; + last_state = state.state; + } + + private AltosSiteMapTile addTileAt(Point offset) { + GridBagConstraints c = new GridBagConstraints(); + c.anchor = GridBagConstraints.CENTER; + c.fill = GridBagConstraints.BOTH; + + // put some space between the map tiles, debugging only + // c.insets = new Insets(5, 5, 5, 5); + // + AltosSiteMapTile t = new AltosSiteMapTile(px_size); + mapTiles.add(t); + c.gridx = offset.x + 100; + c.gridy = offset.y + 100; + layout.setConstraints(t, c); + comp.add(t); + + return t; } private AltosSiteMap(boolean knowWhatYouAreDoing) { @@ -240,8 +299,11 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay { } } + JComponent comp; + private GridBagLayout layout; + public AltosSiteMap() { - JComponent comp = new JComponent() { + comp = new JComponent() { GrabNDrag scroller = new GrabNDrag(this); { addMouseMotionListener(scroller); @@ -250,21 +312,13 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay { } }; - GridBagLayout layout = new GridBagLayout(); + layout = new GridBagLayout(); comp.setLayout(layout); - GridBagConstraints c = new GridBagConstraints(); - c.anchor = GridBagConstraints.CENTER; - c.fill = GridBagConstraints.BOTH; - - // put some space between the map tiles, debugging only - // c.insets = new Insets(5, 5, 5, 5); - for (int x = 0; x < 9; x++) { - c.gridx = x % 3; - c.gridy = x / 3; - mapTiles[x] = new AltosSiteMapTile(px_size); - layout.setConstraints(mapTiles[x], c); - comp.add(mapTiles[x]); + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + addTileAt(new Point(x, y)); + } } setViewportView(comp); setPreferredSize(new Dimension(500,200)); diff --git a/ao-tools/altosui/AltosSiteMapTile.java b/ao-tools/altosui/AltosSiteMapTile.java index fd4cf0bb..ea8c8bd9 100644 --- a/ao-tools/altosui/AltosSiteMapTile.java +++ b/ao-tools/altosui/AltosSiteMapTile.java @@ -32,9 +32,6 @@ import java.awt.geom.Point2D; import java.awt.geom.Line2D; public class AltosSiteMapTile extends JLayeredPane { - Point2D.Double coord_pt; - Point2D.Double last_pt; - JLabel mapLabel; JLabel draw; Graphics2D g2d; @@ -57,19 +54,13 @@ public class AltosSiteMapTile extends JLayeredPane { boolean drawn_landed_circle = false; boolean drawn_boost_circle = false; - public void show(AltosState state, int crc_errors, Point2D.Double pt) { - if (last_pt == null) { - // setLocation(state.pad_lat, state.pad_lon); - // loadMap(); - last_pt = pt; - } - - if (pt != last_pt) { - if (0 <= state.state && state.state < stateColors.length) { - g2d.setColor(stateColors[state.state]); - } - g2d.draw(new Line2D.Double(last_pt, pt)); + public void show(AltosState state, int crc_errors, + Point2D.Double last_pt, Point2D.Double pt) + { + if (0 <= state.state && state.state < stateColors.length) { + g2d.setColor(stateColors[state.state]); } + g2d.draw(new Line2D.Double(last_pt, pt)); int px_size = getWidth(); if (0 <= pt.x && pt.x < px_size) { @@ -100,7 +91,6 @@ public class AltosSiteMapTile extends JLayeredPane { g2d.drawOval((int)pt.x-35, (int)pt.y-35, 70, 70); } - last_pt = pt; repaint(); } -- 2.30.2