diff options
Diffstat (limited to 'navit/coord.c')
-rw-r--r-- | navit/coord.c | 251 |
1 files changed, 0 insertions, 251 deletions
diff --git a/navit/coord.c b/navit/coord.c deleted file mode 100644 index 9e554b27..00000000 --- a/navit/coord.c +++ /dev/null @@ -1,251 +0,0 @@ -#include <glib.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <math.h> -#include "debug.h" -#include "coord.h" -#include "transform.h" -#include "projection.h" -/** - * @defgroup coord Coordinate handling functions - * @{ - */ - -/** - * Get a coordinate - * - * @param p Pointer to the coordinate - * @returns the coordinate - */ - -struct coord * -coord_get(unsigned char **p) -{ - struct coord *ret=(struct coord *)(*p); - *p += sizeof(*ret); - return ret; -} - -struct coord * -coord_new(int x, int y) -{ - struct coord *c=g_new(struct coord, 1); - - c->x=x; - c->y=y; - - return c; -} - -void -coord_destroy(struct coord *c) -{ - g_free(c); -} - -struct coord_rect * -coord_rect_new(struct coord *lu, struct coord *rl) -{ - struct coord_rect *r=g_new(struct coord_rect, 1); - - g_assert(lu->x <= rl->x); - g_assert(lu->y >= rl->y); - - r->lu=*lu; - r->rl=*rl; - - return r; - -} - -void -coord_rect_destroy(struct coord_rect *r) -{ - g_free(r); -} - -int -coord_rect_overlap(struct coord_rect *r1, struct coord_rect *r2) -{ - g_assert(r1->lu.x <= r1->rl.x); - g_assert(r1->lu.y >= r1->rl.y); - g_assert(r2->lu.x <= r2->rl.x); - g_assert(r2->lu.y >= r2->rl.y); - dbg(1,"0x%x,0x%x - 0x%x,0x%x vs 0x%x,0x%x - 0x%x,0x%x\n", r1->lu.x, r1->lu.y, r1->rl.x, r1->rl.y, r2->lu.x, r2->lu.y, r2->rl.x, r2->rl.y); - if (r1->lu.x > r2->rl.x) - return 0; - if (r1->rl.x < r2->lu.x) - return 0; - if (r1->lu.y < r2->rl.y) - return 0; - if (r1->rl.y > r2->lu.y) - return 0; - return 1; -} - -int -coord_rect_contains(struct coord_rect *r, struct coord *c) -{ - g_assert(r->lu.x <= r->rl.x); - g_assert(r->lu.y >= r->rl.y); - if (c->x < r->lu.x) - return 0; - if (c->x > r->rl.x) - return 0; - if (c->y < r->rl.y) - return 0; - if (c->y > r->lu.y) - return 0; - return 1; -} - -void -coord_rect_extend(struct coord_rect *r, struct coord *c) -{ - if (c->x < r->lu.x) - r->lu.x=c->x; - if (c->x > r->rl.x) - r->rl.x=c->x; - if (c->y < r->rl.y) - r->rl.y=c->y; - if (c->y > r->lu.y) - r->lu.y=c->y; -} - - /* [Proj:][Ð]DMM.ss[S][S]... N/S [D][D]DMM.ss[S][S]... E/W */ - /* [Proj:][-][D]D.d[d]... [-][D][D]D.d[d]... */ - /* [Proj:][-]0xX [-]0xX */ -/* - * Currently supported: - * [Proj:]-0xX [-]0xX - * - where Proj can be mg/garmin, defaults to mg - * [Proj:][D][D]Dmm.ss[S][S] N/S [D][D]DMM.ss[S][S]... E/W - * [Proj:][-][D]D.d[d]... [-][D][D]D.d[d] - * - where Proj can be geo - */ - -int -coord_parse(const char *c_str, enum projection pro, struct coord *c_ret) -{ - int debug=0; - char *proj=NULL,*s,*co; - const char *str=c_str; - int args,ret = 0; - struct coord_geo g; - struct coord c; - enum projection str_pro=projection_none; - - dbg(1,"enter('%s',%d,%p)\n", c_str, pro, c_ret); - s=strchr(str,' '); - co=strchr(str,':'); - if (co && co < s) { - proj=malloc(co-str+1); - strncpy(proj, str, co-str); - proj[co-str]='\0'; - dbg(1,"projection=%s\n", proj); - str=co+1; - s=strchr(str,' '); - if (!strcmp(proj, "mg")) - str_pro = projection_mg; - else if (!strcmp(proj, "garmin")) - str_pro = projection_garmin; - else if (!strcmp(proj, "geo")) - str_pro = projection_none; - else { - dbg(0, "Unknown projection: %s\n", proj); - goto out; - } - } - if (! s) - return 0; - while (*s == ' ') { - s++; - } - if (!strncmp(s, "0x", 2) || !strncmp(s, "-0x", 3)) { - args=sscanf(str, "%i %i%n",&c.x, &c.y, &ret); - if (args < 2) - goto out; - dbg(1,"str='%s' x=0x%x y=0x%x c=%d\n", str, c.x, c.y, ret); - dbg(1,"rest='%s'\n", str+ret); - - if (str_pro == projection_none) - str_pro=projection_mg; - if (str_pro != pro) { - transform_to_geo(str_pro, &c, &g); - transform_from_geo(pro, &g, &c); - } - *c_ret=c; - } else if (*s == 'N' || *s == 'n' || *s == 'S' || *s == 's') { - double lng, lat; - char ns, ew; - dbg(1,"str='%s'\n", str); - args=sscanf(str, "%lf %c %lf %c%n", &lat, &ns, &lng, &ew, &ret); - if (args < 4) - goto out; - if (str_pro == projection_none) { - g.lat=floor(lat/100); - lat-=g.lat*100; - g.lat+=lat/60; - g.lng=floor(lng/100); - lng-=g.lng*100; - g.lng+=lng/60; - if (ns == 's' || ns == 'S') - g.lat=-g.lat; - if (ew == 'w' || ew == 'W') - g.lng=-g.lng; - transform_from_geo(pro, &g, c_ret); - } - dbg(3,"str='%s' x=%f ns=%c y=%f ew=%c c=%d\n", str, lng, ns, lat, ew, ret); - dbg(3,"rest='%s'\n", str+ret); - } else { - double lng, lat; - args=sscanf(str, "%lf %lf%n", &lng, &lat, &ret); - if (args < 2) - goto out; - dbg(1,"str='%s' x=%f y=%f c=%d\n", str, lng, lat, ret); - dbg(1,"rest='%s'\n", str+ret); - g.lng=lng; - g.lat=lat; - transform_from_geo(pro, &g, c_ret); - } - if (debug) - printf("rest='%s'\n", str+ret); - ret+=str-c_str; - if (debug) { - printf("args=%d\n", args); - printf("ret=%d delta=%d ret_str='%s'\n", ret, str-c_str, c_str+ret); - } -out: - if (proj) - free(proj); - return ret; -} - -void -coord_print(enum projection pro, struct coord *c, FILE *out) { - unsigned int x; - unsigned int y; - char *sign_x = ""; - char *sign_y = ""; - - if ( c->x < 0 ) { - x = -c->x; - sign_x = "-"; - } else { - x = c->x; - } - if ( c->y < 0 ) { - y = -c->y; - sign_y = "-"; - } else { - y = c->y; - } - fprintf( out, "%s: %s0x%x %s0x%x\n", - projection_to_name( pro ), - sign_x, x, - sign_y, y ); - return; -} - -/** @} */ |