Skip to content

Commit a0c4343

Browse files
Added some useful Point extensions
1 parent 86e306f commit a0c4343

File tree

1 file changed

+47
-7
lines changed

1 file changed

+47
-7
lines changed

src/main/java/com/mapcode/Point.java

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)