@@ -54,15 +54,27 @@ public class Point {
5454 */
5555 @ Nonnull
5656 public static Point fromDeg (final double latDeg , final double lonDeg ) {
57- return new Point (latDeg , lonDeg , true );
57+ return new Point (latDeg , lonDeg );
58+ }
59+
60+ @ Nonnull
61+ public static Point fromPoint (@ Nonnull final Point point ) {
62+ Point p = new Point ();
63+ p .lat32 = point .lat32 ;
64+ p .lon32 = point .lon32 ;
65+ p .fraclat = point .fraclat ;
66+ p .fraclon = point .fraclon ;
67+ p .defined = point .defined ;
68+ return p ;
5869 }
5970
6071 // Constants to handle fractions without floating point error accumulation
6172 private static final double MICRODEG_TO_DEG_FACTOR = 1000000.0 ;
6273 public static final double MAX_PRECISION_FACTOR = 810000.0 ;
63- public static final double FRACLON_PRECISION_FACTOR = 3240000.0 ;
64- private static final double MICROLAT_MAX_PRECISION_FACTOR = (MICRODEG_TO_DEG_FACTOR *MAX_PRECISION_FACTOR );
65- private static final double MICROLON_MAX_PRECISION_FACTOR = (MICRODEG_TO_DEG_FACTOR *FRACLON_PRECISION_FACTOR );
74+ private static final double FRACLON_PRECISION_FACTOR = 3240000.0 ;
75+ private static final double FRACLAT_PRECISION_FACTOR = 810000.0 ;
76+ private static final double MICROLAT_MAX_PRECISION_FACTOR = (MICRODEG_TO_DEG_FACTOR * FRACLAT_PRECISION_FACTOR );
77+ private static final double MICROLON_MAX_PRECISION_FACTOR = (MICRODEG_TO_DEG_FACTOR * FRACLON_PRECISION_FACTOR );
6678
6779 /**
6880 * Get the latitude in degrees.
@@ -217,6 +229,34 @@ public boolean equals(final Object obj) {
217229 private double fraclat ; // whole nr of MICROLAT_MAX_PRECISION_FACTOR, relative to lat32
218230 private double fraclon ; // whole nr of MICROLON_MAX_PRECISION_FACTOR, relative to lon32
219231
232+ public void setMaxLatToMicroDeg (final int maxMicroLat ) {
233+ if ( (lat32 > maxMicroLat ) || ((lat32 == maxMicroLat ) && (fraclat >0 )) ) {
234+ lat32 = maxMicroLat -1 ;
235+ fraclat = FRACLAT_PRECISION_FACTOR - 1 ;
236+ }
237+ }
238+
239+ public void setMaxLonToMicroDeg (final int maxMicroLon ) {
240+ if ( (lon32 > maxMicroLon ) || ((lon32 == maxMicroLon ) && (fraclon >0 )) ) {
241+ lon32 = maxMicroLon -1 ;
242+ fraclon = FRACLON_PRECISION_FACTOR - 1 ;
243+ }
244+ }
245+
246+ public void setMinLatToMicroDeg (final int minMicroLat ) {
247+ if (lat32 < minMicroLat ) {
248+ lat32 = minMicroLat ;
249+ fraclat = 0 ;
250+ }
251+ }
252+
253+ public void setMinLonToMicroDeg (final int minMicroLon ) {
254+ if (lon32 < minMicroLon ) {
255+ lon32 = minMicroLon ;
256+ fraclon = 0 ;
257+ }
258+ }
259+
220260 /**
221261 * Points can be "undefined" within the mapcode implementation, but never outside of that.
222262 * Any methods creating or setting undefined points must be package private and external
@@ -231,16 +271,16 @@ private Point() {
231271 defined = false ;
232272 }
233273
234- private Point (final double latDeg , final double lonDeg , final boolean wrap ) {
274+ private Point (final double latDeg , final double lonDeg ) {
235275
236276 double lat = latDeg + 90 ;
237277 if (lat < 0 ) { lat = 0 ; } else if (lat > 180 ) { lat = 180 ; }
238278 // lat now [0..180]
239279 lat *= MICROLAT_MAX_PRECISION_FACTOR ;
240280 fraclat = Math .floor (lat + 0.1 );
241- double f = fraclat / MAX_PRECISION_FACTOR ;
281+ double f = fraclat / FRACLAT_PRECISION_FACTOR ;
242282 lat32 = (int ) f ;
243- fraclat -= ((double ) lat32 * MAX_PRECISION_FACTOR );
283+ fraclat -= ((double ) lat32 * FRACLAT_PRECISION_FACTOR );
244284 lat32 -= 90000000 ;
245285
246286 double lon = lonDeg - (360.0 * Math .floor (lonDeg / 360 )); // lon now in [0..360>
0 commit comments