Я ищу способ визуализации двумерного Java-массива, который обновляется в симуляции, написанной в clojure, таким же образом, как я бы использовал imshow в matplotlib для визуализации массива numpy.
Какой лучший способ сделать это? В качестве альтернативы я могу сохранить массивы на диск и визуализировать их в matplotlib. Каков наилучший способ сделать это?
Вот моя попытка, основанная на Java-коде здесь , но делающая BufferedImage действительно медленным. Есть ли способ ускорить его?:
(import
'(java.awt Color Graphics Graphics2D Dimension GradientPaint BorderLayout)
'(java.awt.image BufferedImage)
'(javax.swing JPanel JFrame))
(def L 1024)
(def image (BufferedImage. (* L 1) (* L 1) (. BufferedImage TYPE_INT_RGB)))
(def g2 (. image createGraphics))
(defn get-color-map []
(let [STEPS 100
colormap (BufferedImage. STEPS 1 (BufferedImage/TYPE_INT_RGB))
g (.createGraphics colormap)
paint (GradientPaint. 0 0 (Color/RED) STEPS 0 (Color/GREEN))
]
(doto g
(.setPaint paint)
(.fillRect 0 0 STEPS 1))
colormap))
(defn get-color [x start finish colormap]
(let [y (/ (- x start) (- finish start))
STEPS 100]
(Color. (.getRGB colormap (int (* y STEPS)) 0))))
(defn fill-image [^"[[D" arr ^Graphics2D g sideX sideY ^BufferedImage colormap]
(dotimes [i (alength arr)]
(dotimes [j (alength ^"[D" (aget arr 0))]
(doto g
(.setColor (get-color (aget ^"[[D" arr (int i) (int j)) -10.0 10.0 colormap))
(.fillRect (int (* i sideX)) (int (* j sideY)) sideX sideY)))))
(def panel
(doto (proxy [JPanel] []
(paintComponent [g] (.drawImage g image 0 0 nil)))))
(def frame
(doto (JFrame. "Heat Map")
(.add panel BorderLayout/CENTER)
(.pack)
(.setLocationRelativeTo nil)
(.setVisible true)))
А вот попытка использовать обработку от заклинателя. Это также довольно медленно:
(let [sktch (sketch
(setup []
(doto this
;no-loop
(size 1024 1024)
(framerate 15)
smooth))
;; define the draw function
(draw []
(def A (gaussian-matrix 1024 0 1))
(dotimes [i 1024]
(dotimes [j 1024]
(doto this
(stroke (int (abs (* (aget A i j) 255))))
(point i j))))))]
(view sktch :size [1024 1024]))