diff options
author | Stefan Wildemann <gta04@metalstrolche.de> | 2021-08-21 22:11:25 +0200 |
---|---|---|
committer | Stefan Wildemann <gta04@metalstrolche.de> | 2021-09-13 20:51:28 +0200 |
commit | 4113f0d032ec2da0031bf79f8b6c5f5b788131ae (patch) | |
tree | 908e0129abda0cfd29ffaaa79e1cbf58dd0ec8e9 | |
parent | 0ed1660858a6b3055077f3b0d245c0316beb621c (diff) | |
download | navit-4113f0d032ec2da0031bf79f8b6c5f5b788131ae.tar.gz |
Refactor tile calculation code to own file
-rw-r--r-- | navit/maptool/CMakeLists.txt | 2 | ||||
-rw-r--r-- | navit/maptool/tile.c | 95 | ||||
-rw-r--r-- | navit/maptool/tile_calc.c | 119 |
3 files changed, 120 insertions, 96 deletions
diff --git a/navit/maptool/CMakeLists.txt b/navit/maptool/CMakeLists.txt index 8c4c824a8..b1594c02e 100644 --- a/navit/maptool/CMakeLists.txt +++ b/navit/maptool/CMakeLists.txt @@ -10,7 +10,7 @@ if(BUILD_MAPTOOL) add_executable (maptool maptool.c) add_library (maptool_core boundaries.c buffer.c ch.c coastline.c itembin.c itembin_buffer.c itembin_slicer.c misc.c osm.c osm_o5m.c osm_psql.c - osm_relations.c sourcesink.c tempfile.c tile.c zip.c osm_xml.c) + osm_relations.c sourcesink.c tempfile.c tile.c tile_calc.c zip.c osm_xml.c) if(NOT MSVC) PROTOBUF_C_GENERATE_C (PROTO_SRCS PROTO_HDRS osmformat.proto) diff --git a/navit/maptool/tile.c b/navit/maptool/tile.c index 695dd6d4e..1e16f8a73 100644 --- a/navit/maptool/tile.c +++ b/navit/maptool/tile.c @@ -71,101 +71,6 @@ static char** th_get_subtile( const struct tile_head* th, int idx ) { return (char**)subtile_ptr; } -int tile(struct rect *r, char *suffix, char *ret, int max, int overlap, struct rect *tr) { - int x0,x2,x4; - int y0,y2,y4; - int xo,yo; - int i; - struct rect rr=*r; - - x0=world_bbox.l.x; - y0=world_bbox.l.y; - x4=world_bbox.h.x; - y4=world_bbox.h.y; - - if(rr.l.x<x0) - rr.l.x=x0; - if(rr.h.x<x0) - rr.h.x=x0; - if(rr.l.y<y0) - rr.l.y=y0; - if(rr.h.y<y0) - rr.h.y=y0; - if(rr.l.x>x4) - rr.l.x=x4; - if(rr.h.x>x4) - rr.h.x=x4; - if(rr.l.y>y4) - rr.l.y=y4; - if(rr.h.y>y4) - rr.h.y=y4; - - for (i = 0 ; i < max ; i++) { - x2=(x0+x4)/2; - y2=(y0+y4)/2; - xo=(x4-x0)*overlap/100; - yo=(y4-y0)*overlap/100; - if ( contains_bbox(x0,y0,x2+xo,y2+yo,&rr)) { - strcat(ret,"d"); - x4=x2+xo; - y4=y2+yo; - } else if (contains_bbox(x2-xo,y0,x4,y2+yo,&rr)) { - strcat(ret,"c"); - x0=x2-xo; - y4=y2+yo; - } else if (contains_bbox(x0,y2-yo,x2+xo,y4,&rr)) { - strcat(ret,"b"); - x4=x2+xo; - y0=y2-yo; - } else if (contains_bbox(x2-xo,y2-yo,x4,y4,&rr)) { - strcat(ret,"a"); - x0=x2-xo; - y0=y2-yo; - } else - break; - } - if (tr) { - tr->l.x=x0; - tr->l.y=y0; - tr->h.x=x4; - tr->h.y=y4; - } - if (suffix) - strcat(ret,suffix); - return i; -} - -void tile_bbox(char *tile, struct rect *r, int overlap) { - struct coord c; - int xo,yo; - *r=world_bbox; - while (*tile) { - c.x=(r->l.x+r->h.x)/2; - c.y=(r->l.y+r->h.y)/2; - xo=(r->h.x-r->l.x)*overlap/100; - yo=(r->h.y-r->l.y)*overlap/100; - switch (*tile) { - case 'a': - r->l.x=c.x-xo; - r->l.y=c.y-yo; - break; - case 'b': - r->h.x=c.x+xo; - r->l.y=c.y-yo; - break; - case 'c': - r->l.x=c.x-xo; - r->h.y=c.y+yo; - break; - case 'd': - r->h.x=c.x+xo; - r->h.y=c.y+yo; - break; - } - tile++; - } -} - int tile_len(char *tile) { int ret=0; while (tile[0] >= 'a' && tile[0] <= 'd') { diff --git a/navit/maptool/tile_calc.c b/navit/maptool/tile_calc.c new file mode 100644 index 000000000..2590824c6 --- /dev/null +++ b/navit/maptool/tile_calc.c @@ -0,0 +1,119 @@ +/* + * Navit, a modular navigation system. + * Copyright (C) 2005-2008 Navit Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + + +#include <string.h> +#include "maptool.h" +#include "item.h" + +int tile(struct rect *r, char *suffix, char *ret, int max, int overlap, struct rect *tr) { + int x0,x2,x4; + int y0,y2,y4; + int xo,yo; + int i; + struct rect rr=*r; + + x0=world_bbox.l.x; + y0=world_bbox.l.y; + x4=world_bbox.h.x; + y4=world_bbox.h.y; + + if(rr.l.x<x0) + rr.l.x=x0; + if(rr.h.x<x0) + rr.h.x=x0; + if(rr.l.y<y0) + rr.l.y=y0; + if(rr.h.y<y0) + rr.h.y=y0; + if(rr.l.x>x4) + rr.l.x=x4; + if(rr.h.x>x4) + rr.h.x=x4; + if(rr.l.y>y4) + rr.l.y=y4; + if(rr.h.y>y4) + rr.h.y=y4; + + for (i = 0 ; i < max ; i++) { + x2=(x0+x4)/2; + y2=(y0+y4)/2; + xo=(x4-x0)*overlap/100; + yo=(y4-y0)*overlap/100; + if ( contains_bbox(x0,y0,x2+xo,y2+yo,&rr)) { + strcat(ret,"d"); + x4=x2+xo; + y4=y2+yo; + } else if (contains_bbox(x2-xo,y0,x4,y2+yo,&rr)) { + strcat(ret,"c"); + x0=x2-xo; + y4=y2+yo; + } else if (contains_bbox(x0,y2-yo,x2+xo,y4,&rr)) { + strcat(ret,"b"); + x4=x2+xo; + y0=y2-yo; + } else if (contains_bbox(x2-xo,y2-yo,x4,y4,&rr)) { + strcat(ret,"a"); + x0=x2-xo; + y0=y2-yo; + } else + break; + } + if (tr) { + tr->l.x=x0; + tr->l.y=y0; + tr->h.x=x4; + tr->h.y=y4; + } + if (suffix) + strcat(ret,suffix); + return i; +} + +void tile_bbox(char *tile, struct rect *r, int overlap) { + struct coord c; + int xo,yo; + *r=world_bbox; + while (*tile) { + c.x=(r->l.x+r->h.x)/2; + c.y=(r->l.y+r->h.y)/2; + xo=(r->h.x-r->l.x)*overlap/100; + yo=(r->h.y-r->l.y)*overlap/100; + switch (*tile) { + case 'a': + r->l.x=c.x-xo; + r->l.y=c.y-yo; + break; + case 'b': + r->h.x=c.x+xo; + r->l.y=c.y-yo; + break; + case 'c': + r->l.x=c.x-xo; + r->h.y=c.y+yo; + break; + case 'd': + r->h.x=c.x+xo; + r->h.y=c.y+yo; + break; + } + tile++; + } +} + |