branch: externals/osm commit 793dad377eb48066c11c911d19c3df9a77f15664 Author: Daniel Mendler <m...@daniel-mendler.de> Commit: Daniel Mendler <m...@daniel-mendler.de>
Optimize track algorithm --- osm.el | 52 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/osm.el b/osm.el index 370a16260d..542503114f 100644 --- a/osm.el +++ b/osm.el @@ -626,6 +626,7 @@ Should be at least 7 days according to the server usage policies." pins)) ;; TODO This is not yet as robust as it should be. Rethink the algorithm. +;; Sometimes artifacts occur, set osm-tile-border=debug. (defun osm--compute-tracks () "Compute track hash table." (let ((tracks (make-hash-table :test #'equal)) @@ -633,45 +634,44 @@ Should be at least 7 days according to the server usage policies." (dolist (file osm--gpx-files) (clrhash segs) (dolist (seg (cadr file)) - (let ((px0 (osm--lon-to-x (cdar seg) osm--zoom)) - (py0 (osm--lat-to-y (caar seg) osm--zoom))) + (let ((p0 (cons (osm--lon-to-x (cdar seg) osm--zoom) + (osm--lat-to-y (caar seg) osm--zoom)))) (dolist (pt (cdr seg)) (let* ((px1 (osm--lon-to-x (cdr pt) osm--zoom)) (py1 (osm--lat-to-y (car pt) osm--zoom)) - (x0 (/ px0 256)) - (y0 (/ py0 256)) - (x1 (/ px1 256)) - (y1 (/ py1 256)) - (pdx (- px1 px0)) - (pdy (- py1 py0)) - (dx (abs (- x1 x0))) - (dy (- (abs (- y1 y0)))) - (sx (if (< x0 x1) 1 -1)) - (sy (if (< y0 y1) 1 -1)) - (err (+ dx dy))) + (pdx (- px1 (car p0))) + (pdy (- py1 (cdr p0)))) ;; Ignore point if too close to last point (unless (< (+ (* pdx pdx) (* pdy pdy)) 50) + (let* ((p1 (cons px1 py1)) + (x0 (/ (car p0) 256)) + (y0 (/ (cdr p0) 256)) + (x1 (/ px1 256)) + (y1 (/ py1 256)) + (dx (abs (- x1 x0))) + (dy (- (abs (- y1 y0)))) + (sx (if (< x0 x1) 1 -1)) + (sy (if (< y0 y1) 1 -1)) + (err (+ dx dy))) ;; Bresenham with "antialiasing" (while - (let ((v0 (cons px0 py0)) - (v1 (cons px1 py1)) - (ex (< (* err 2) dx)) + (let ((ex (< (* err 2) dx)) (ey (> (* err 2) dy)) (key (cons x0 y0))) - (unless (equal (gethash key segs) v0) - (push v0 (gethash key segs))) - (push v1 (gethash key segs)) + (unless (equal (gethash key segs) p0) + (push p0 (gethash key segs))) + (push p1 (gethash key segs)) (unless (and (= x0 x1) (= y0 y1)) ;; "Antialiasing" (when (and ey ex) (setq key (cons (+ x0 sx) y0)) - (unless (equal (gethash key segs) v0) - (push v0 (gethash key segs))) - (push v1 (gethash key segs)) + (unless (equal (gethash key segs) p0) + (push p0 (gethash key segs))) + (push p1 (gethash key segs)) (setq key (cons x0 (+ y0 sy))) - (unless (equal (gethash key segs) v0) - (push v0 (gethash key segs))) - (push v1 (gethash key segs))) + (unless (equal (gethash key segs) p0) + (push p0 (gethash key segs))) + (push p1 (gethash key segs))) (when ey (cl-incf err dy) (cl-incf x0 sx)) @@ -679,7 +679,7 @@ Should be at least 7 days according to the server usage policies." (cl-incf err dx) (cl-incf y0 sy)) t))) - (setq px0 px1 py0 py1)))))) + (setq p0 p1))))))) (maphash (lambda (k v) (push v (gethash k tracks))) segs)) tracks))