void vik_coord_convert(VikCoord *coord, VikCoordMode dest_mode)
{
- static VikCoord tmp;
+ VikCoord tmp;
if ( coord->mode != dest_mode )
{
if ( dest_mode == VIK_COORD_LATLON ) {
static gdouble vik_coord_diff_safe(const VikCoord *c1, const VikCoord *c2)
{
- static struct LatLon a, b;
+ struct LatLon a, b;
vik_coord_to_latlon ( c1, &a );
vik_coord_to_latlon ( c2, &b );
return a_coords_latlon_diff ( &a, &b );
else /* VIK_COORD_UTM */
return coord1->utm_zone == coord2->utm_zone && coord1->north_south == coord2->north_south && coord1->east_west == coord2->east_west;
}
+
+static void get_north_west(struct LatLon *center, struct LatLon *dist, struct LatLon *nw)
+{
+ nw->lat = center->lat + dist->lat;
+ nw->lon = center->lon - dist->lon;
+ if (nw->lon < -180)
+ nw->lon += 360.0;
+ if (nw->lat > 90.0) { /* over north pole */
+ nw->lat = 180 - nw->lat;
+ nw->lon = nw->lon - 180;
+ }
+}
+
+static void get_south_east(struct LatLon *center, struct LatLon *dist, struct LatLon *se)
+{
+ se->lat = center->lat - dist->lat;
+ se->lon = center->lon + dist->lon;
+ if (se->lon > 180.0)
+ se->lon -= 360.0;
+ if (se->lat < -90.0) { /* over south pole */
+ se->lat += 180;
+ se->lon = se->lon - 180;
+ }
+}
+
+void vik_coord_set_area(const VikCoord *coord, const struct LatLon *wh, VikCoord *tl, VikCoord *br)
+{
+ struct LatLon center, nw, se;
+ struct LatLon dist;
+
+ dist.lat = wh->lat/2;
+ dist.lon = wh->lon/2;
+
+ vik_coord_to_latlon(coord, ¢er);
+ get_north_west(¢er, &dist, &nw);
+ get_south_east(¢er, &dist, &se);
+
+ *((struct LatLon *)tl) = nw;
+ *((struct LatLon *)br) = se;
+ tl->mode = br->mode = VIK_COORD_LATLON;
+}
+
+gboolean vik_coord_inside(const VikCoord *coord, const VikCoord *tl, const VikCoord *br)
+{
+ struct LatLon ll, tl_ll, br_ll;
+
+ vik_coord_to_latlon(coord, &ll);
+ vik_coord_to_latlon(tl, &tl_ll);
+ vik_coord_to_latlon(br, &br_ll);
+
+ if ((ll.lat > tl_ll.lat) || (ll.lon < tl_ll.lon))
+ return FALSE;
+ if ((ll.lat < br_ll.lat) || (ll.lon > br_ll.lon))
+ return FALSE;
+ return TRUE;
+}