first cut at turnon scripts for EasyTimer v2
[fw/altos] / altoslib / AltosMapTransform.java
index b6d4f4356af8166b4dd3322092aaa2ce9682dd39..3f8f290c9f87faa419358de317a3210ea879d583 100644 (file)
@@ -16,7 +16,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altoslib_12;
+package org.altusmetrum.altoslib_14;
 
 import java.io.*;
 import java.lang.Math;
@@ -29,6 +29,8 @@ public class AltosMapTransform {
 
        double  offset_x, offset_y;
 
+       int     width, height;
+
        public AltosLatLon lat_lon (AltosPointDouble point) {
                double lat, lon;
                double rads;
@@ -67,13 +69,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 +84,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 +108,43 @@ public class AltosMapTransform {
                return screen(point(lat_lon));
        }
 
+       public AltosPointDouble screen(double lat, double lon) {
+               return screen(point(lat, lon));
+       }
+
+       /* Return first longitude value which ends up on-screen */
+       public double first_lon(double lon) {
+               /* Find a longitude left of the screen */
+               for (;;) {
+                       double x = lon * scale_x - offset_x;
+                       if (x < 0)
+                               break;
+                       lon -= 360.0;
+               }
+               /* Find the first longitude on the screen */
+               for (;;) {
+                       double x = lon * scale_x - offset_x;
+                       if (x >= 0)
+                               break;
+                       lon += 360.0;
+               }
+               return lon;
+       }
+
+       /* Return last longitude value which ends up on-screen */
+       public double last_lon(double lon) {
+               lon = first_lon(lon);
+
+               for(;;) {
+                       double next_lon = lon + 360.0;
+                       double next_x = next_lon * scale_x - offset_x;
+                       if (next_x >= width)
+                               break;
+                       lon = next_lon;
+               }
+               return lon;
+       }
+
        private boolean has_location;
 
        public boolean has_location() {
@@ -112,6 +155,9 @@ public class AltosMapTransform {
                scale_x = 256/360.0 * Math.pow(2, zoom);
                scale_y = 256/(2.0*Math.PI) * Math.pow(2, zoom);
 
+               this.width = width;
+               this.height = height;
+
                AltosPointDouble centre_pt = point(centre_lat_lon);
 
                has_location = (centre_lat_lon.lat != 0 || centre_lat_lon.lon != 0);