I'm looking for a way to visualize a 2d java array that's being updated in a simulation written in clojure the same way I would use imshow in matplotlib to visualize a numpy array.
What's the best way to do this? Alternatively I could save the arrays to disk and visualize it in matplotlib. What would be the best way to go about that?
Here's my attempt based on the Java code here, but making the BufferedImage really slow. Is there any way to speed it up?:
(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)))
And here's an attempt using processing from incanter. It's also pretty slow:
(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]))