我正在尝试构建this bicycle station map animation的制图quil可视化衍生物。我试图在quil中使用新的默认功能模式,因为它看起来像处理鼠标事件和更新显示的许多工作。但是,我遇到了一个问题,即绘图的一部分(背景图)花费的时间太长而无法完全呈现,即使帧速率非常低。
根据this visualization的建议,我将通过下载并将其安装到leiningen localrepo来安装UnfoldingMaps依赖项,如下所示:
$ lein localrepo install /path/to/library/Unfolding.jar unfolding 0.9.6
$ lein localrepo install /path/to/library/json4processing.jar json4proc 0.9.6
我的project.clj文件如下所示:
(defproject transit-map "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:plugins [[lein-localrepo "0.5.3"]]
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.6.0"]
[org.clojure/data.json "0.2.5"]
[quil "2.2.5"]
[unfolding "0.9.6"] ; Installed in local repo
[json4proc "0.9.6"] ; Ditto; shipped with unfolding
[log4j "1.2.15"]])
而且,我的简单core.clj看起来像这样:
(ns transit-map.core
(:import (de.fhpotsdam.unfolding UnfoldingMap)
(de.fhpotsdam.unfolding.geo Location)
(de.fhpotsdam.unfolding.providers StamenMapProvider)
(de.fhpotsdam.unfolding.marker SimplePointMarker))
(:require [quil.core :as q]
[quil.middleware :as m]))
(defn setup []
;; Only has close to enough time to plot if the framerate is very
;; low, and even then doesn't quite get the job done.
(q/frame-rate 1)
;; setup function returns initial state.
;; State is one big happy hashmap
{:bg-map (doto (UnfoldingMap.
(quil.applet/current-applet)
(de.fhpotsdam.unfolding.providers.StamenMapProvider$TonerBackground.))
(.setZoomRange 10 12)
(.zoomToLevel 11)
(.panTo (Location. 47.625 -122.332071))
(.draw))})
(defn update-state [state])
(defn draw-state [state]
(.draw (state :bg-map)))
(q/defsketch transit-map
:title "Transit map"
:size [250 500]
;; setup function called only once, during sketch initialization.
:setup setup
;; update-state is called on each iteration before draw-state.
:update update-state
:draw draw-state
;; This sketch uses functional-mode middleware.
:middleware [m/fun-mode])
值得注意的是,只需很少的努力,就可以了。即使帧速率拨回1fps,背景图像也无法呈现:
有关如何为此特定元素提供完整渲染所需时间的任何建议吗?最终,我希望以超过1fps的速度做一些动画。我开始怀疑我最好的选择是获取静态图像并将其丢弃在后台。但是,人们可以在这里推荐其他什么吗?
答案 0 :(得分:1)
好吧,看起来将地图上下文存储在状态hashmap中就是问题所在。将setup
中的背景地图定义为:
(def bgmap
(doto (UnfoldingMap.
(quil.applet/current-applet)
(de.fhpotsdam.unfolding.providers.StamenMapProvider$TonerBackground.))
(.setZoomRange 10 13)
(.zoomToLevel 12)
(.draw)))
如果我然后在draw-state
中调用draw方法,则可以工作:
(.draw bgmap)
我可以将帧率设置为合理的水平,而背景地图的相对较慢的绘制只需要几帧即可完全填充 - 正是我所寻找的。 p>