2010-09-28 21 views
4

Je cherche un moyen de visualiser un tableau java 2d qui est mis à jour dans une simulation écrite en clojure de la même façon que j'utiliserais imshow dans matplotlib pour visualiser un tableau numpy.Équivalent à imshow à Clojure?

Quelle est la meilleure façon de faire cela? Sinon, je pourrais sauvegarder les tableaux sur le disque et les visualiser dans matplotlib. Quel serait le meilleur moyen d'y parvenir?


Voilà ma tentative basée sur le code Java here, mais en faisant le BufferedImage vraiment lent. Est-il possible d'accélérer ?:

(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))) 

Et voici une tentative en utilisant le traitement de incantateur. Il est également assez lent:

(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])) 
+0

J'ai essayé votre 1er code, et il fait un rectangle noir * vraiment rapide *. –

+0

aussi le lien est cassé –

Répondre

0

ne est pas un équivalent complet si vous peut-être le Pretty Printer Library vous initieront:

 
(pprint (for [x (range 10)] (range x)))   
(() 
(0) 
(0 1) 
(0 1 2) 
(0 1 2 3) 
(0 1 2 3 4) 
(0 1 2 3 4 5) 
(0 1 2 3 4 5 6) 
(0 1 2 3 4 5 6 7) 
(0 1 2 3 4 5 6 7 8)) 
nil 

Ce n'est pas sur hte même échelle que imshow (texte étant seulement) si i Je suggère vraiment que c'est quelque chose que vous voudrez peut-être utiliser jusqu'à ce que vous trouviez quelque chose de plus joli.

+0

Je cherche vraiment à visualiser un tableau carré avec ~ 1 million de pixels qui change dans le temps. Mais cela me sera utile pour vérifier la sortie de mes fonctions au fur et à mesure que je construis la simulation. Merci. – 2daaa

2

Utilisez Octave java package pour obtenir l'objet Java dans Octave, puis appelez imbow d'Octave.