[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/osm 793dad377e 1/2: Optimize track algorithm
From: |
ELPA Syncer |
Subject: |
[elpa] externals/osm 793dad377e 1/2: Optimize track algorithm |
Date: |
Wed, 9 Mar 2022 18:57:42 -0500 (EST) |
branch: externals/osm
commit 793dad377eb48066c11c911d19c3df9a77f15664
Author: Daniel Mendler <mail@daniel-mendler.de>
Commit: Daniel Mendler <mail@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))