summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Wildemann <gta04@metalstrolche.de>2021-08-21 22:11:25 +0200
committerStefan Wildemann <gta04@metalstrolche.de>2021-09-13 20:51:28 +0200
commit4113f0d032ec2da0031bf79f8b6c5f5b788131ae (patch)
tree908e0129abda0cfd29ffaaa79e1cbf58dd0ec8e9
parent0ed1660858a6b3055077f3b0d245c0316beb621c (diff)
downloadnavit-4113f0d032ec2da0031bf79f8b6c5f5b788131ae.tar.gz
Refactor tile calculation code to own file
-rw-r--r--navit/maptool/CMakeLists.txt2
-rw-r--r--navit/maptool/tile.c95
-rw-r--r--navit/maptool/tile_calc.c119
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++;
+ }
+}
+