|
297 | 297 | average-speed (plan/average-speed day-plan plan) |
298 | 298 | elevation (gpx/elevation (:gpx plan)) |
299 | 299 | pauses (plan/pauses day-plan) |
300 | | - main-offset (* (/ km average-speed) box-size) |
| 300 | + main-offset (if (> index 0) |
| 301 | + (* (/ km (plan/average-speed |
| 302 | + (nth (:daily-plans plan) (- index 1)) plan)) box-size) |
| 303 | + 0) |
301 | 304 | total-km-for-day (plan/kilometers-in-a-day day-plan average-speed)] |
302 | 305 | (into [:svg |
303 | 306 | [:text {:x 0 :y 15 |
|
366 | 369 | :font-size ".5em"} |
367 | 370 | description]]) |
368 | 371 |
|
369 | | -(defn plan-main-kilometers-svg [total-distance average-speed] |
370 | | - (into [:svg] |
371 | | - [:g |
372 | | - (loop [i 0 |
373 | | - output [:g]] |
374 | | - (if (< i (/ total-distance average-speed)) |
375 | | - (recur (inc i) |
376 | | - (conj output |
377 | | - [:rect {:x (+ (* 5 box-size) |
378 | | - (* i box-size)) |
379 | | - :y box-size |
380 | | - :width box-size :height box-size |
381 | | - :fill (get-from-palette :background) |
382 | | - :stroke "black" |
383 | | - :stroke-width 0.5}])) |
384 | | - output)) |
385 | | - ;; Opaque box to create the illusion of ticks |
386 | | - [:rect {:x 0 :y 0 :width 400 :height 17 :fill (get-from-palette :background)}] |
387 | | - (loop [i 0 |
388 | | - output [:g]] |
389 | | - (if (< i (/ total-distance average-speed)) |
390 | | - (recur (inc i) |
391 | | - (conj output |
392 | | - [:text {:x (+ left-margin 5 (* i box-size)) |
393 | | - :y 17 |
394 | | - :font-family "Fira Sans" |
395 | | - :font-size ".25em" |
396 | | - :text-anchor "middle"} |
397 | | - (str (* average-speed (+ 1 i)))])) |
398 | | - output))])) |
| 372 | +(defn plan-main-kilometers-svg [plan] |
| 373 | + (let [hourly-distances (plan/hourly-cumulative-distances-in-a-plan plan)] |
| 374 | + (into [:svg] |
| 375 | + [:g |
| 376 | + (loop [i 0 |
| 377 | + output [:g]] |
| 378 | + (if (< i (count hourly-distances)) |
| 379 | + (recur (inc i) |
| 380 | + (conj output |
| 381 | + [:rect {:x (+ (* 5 box-size) |
| 382 | + (* i box-size)) |
| 383 | + :y box-size |
| 384 | + :width box-size :height box-size |
| 385 | + :fill (get-from-palette :background) |
| 386 | + :stroke "black" |
| 387 | + :stroke-width 0.5}])) |
| 388 | + output)) |
| 389 | + ;; Opaque box to create the illusion of ticks |
| 390 | + [:rect {:x 0 :y 0 :width 400 :height 17 :fill (get-from-palette :background)}] |
| 391 | + (loop [i 0 |
| 392 | + output [:g]] |
| 393 | + (if (< i (count hourly-distances)) |
| 394 | + (recur (inc i) |
| 395 | + (conj output |
| 396 | + [:text {:x (+ left-margin 5 (* i box-size)) |
| 397 | + :y 17 |
| 398 | + :font-family "Fira Sans" |
| 399 | + :font-size ".25em" |
| 400 | + :text-anchor "middle"} |
| 401 | + (str (nth hourly-distances i))])) |
| 402 | + output))]))) |
399 | 403 |
|
400 | 404 | (defn plan-diagram [plan] |
401 | | - (let [total-distance (gpx/total-distance (:gpx plan)) |
402 | | - center (gpx/center (gpx/points (:gpx plan))) |
403 | | - average-speed (:average-speed plan)] |
| 405 | + (let [center (gpx/center (gpx/points (:gpx plan)))] |
404 | 406 | [:svg {:width diagram-width |
405 | 407 | :height diagram-height |
406 | 408 | :viewBox "0 0 300 230" |
407 | 409 | :style {:background-color (get-from-palette :background)}} |
408 | 410 | (plan-title (:description plan)) |
409 | 411 | [:g {:transform "translate(0 25)"} |
410 | | - (plan-main-kilometers-svg total-distance |
411 | | - average-speed)] |
| 412 | + (plan-main-kilometers-svg plan)] |
412 | 413 | (loop [index 0 |
413 | 414 | total-kilometers-covered 0 |
414 | 415 | output [:g]] |
415 | 416 | (if (< index (count (:daily-plans plan))) |
416 | | - (recur (inc index) |
417 | | - (+ total-kilometers-covered |
418 | | - (plan/kilometers-in-a-day (nth (:daily-plans plan) index) |
419 | | - average-speed)) |
420 | | - (conj output [:g {:transform (str "translate(0 " |
421 | | - (+ 50 (* index 50)) ")")} |
422 | | - (day-plan->svg plan index |
423 | | - total-kilometers-covered |
424 | | - center)])) |
| 417 | + (let [daily-plan (nth (:daily-plans plan) index)] |
| 418 | + (recur (inc index) |
| 419 | + (+ total-kilometers-covered |
| 420 | + (plan/kilometers-in-a-day daily-plan (plan/average-speed daily-plan plan))) |
| 421 | + (conj output [:g {:transform (str "translate(0 " (+ 50 (* index 50)) ")")} |
| 422 | + (day-plan->svg plan index |
| 423 | + total-kilometers-covered |
| 424 | + center)]))) |
425 | 425 | output))])) |
426 | 426 |
|
427 | 427 | (def plan-viewer |
|
0 commit comments