2017-04-22 61 views
1

我想用球拍做類似matplotlib.pyplot.matshow的事情。我知道這是一個微不足道的問題,也許我只是很愚蠢,但是在閱讀Racket繪圖文檔後我沒有成功。如何繪製矩陣作爲球拍中的圖像?

一個例子矩陣將被翻譯成一個圓圈的圖像:

#lang typed/racket 

(require math/array) 
(require plot) 

(: sq (-> Integer Integer)) 
(define (sq [v : Integer]) 
    (* v v)) 

(: make-2d-matrix (-> Integer Integer (Array Boolean))) 
(define (make-2d-matrix [s : Integer] [r : Integer]) 
    (let ([center : Integer (exact-round (/ s 2))]) 
    (let ([a (indexes-array ((inst vector Integer) s s))]) 
     (let ([b (inline-array-map (λ ([i : (Vectorof Index)]) 
          (+ 
          (sq (- (vector-ref i 0) center)) 
          (sq (- (vector-ref i 1) center)))) 
          a)]) 
     (array<= b (array (sq r))) 
     )))) 


(array-map (λ ([i : Boolean]) (if (eq? i #f) 0 1)) (make-2d-matrix 20 6)) 

有人可以給我一個提示?

回答

2

完全不是一個愚蠢的問題。這是很難與一大批Python圖書館程序員競爭的領域之一。以下是我在球拍中的表現:

#lang racket 


(require 2htdp/image 
     math/array) 

;; a 10x10 array 
(define a 
    (build-array #(10 10) 
       (λ (e) 
       (match e 
        [(vector x y) 
        (cond [(= x y) x] 
          [else 0])])))) 

;; map a value to a color 
(define (cmap v) 
    (color (floor (* 255 (/ v 10))) 
     0 
     (floor (* 255 (- 1 (/ v 10)))))) 

(apply 
above 
(for/list ([y (in-range 10)]) 
    (apply 
    beside 
    (for/list ([x (in-range 10)]) 
    (rectangle 10 10 'solid (cmap (array-ref a (vector x y)))))))) 
+0

事實上,比蟒蛇沒有價值的!謝謝! – Raoul

+0

有沒有理由不在這裏使用'plot'庫? –

+0

@ SamTobin-Hochstadt我會很樂意看到你的'plot'庫的解決方案,因爲我無法這樣做。你能否用一個例子來添加你的答案? – Raoul

1

我不確定你想要的情節。庫的設計圍繞功能,但我不知道你想表達什麼功能。

這裏是繪製矩陣的方法有兩種:

(plot (points (cast (array->vector* m) (Vectorof (Vectorof Real)))

(plot3d (points3d (cast (array->vector* m) (Vectorof (Vectorof Real)))

cast是必要的,因爲array->vector*類型是不夠具體。

+0

嗯,上面的函數只在繪圖空間的中心繪製一個點,當'm'被替換爲由我的示例代碼產生的矩陣(一個用'零'填充的方形矩陣,圓形由' '在中心)。我想要的是一種**熱圖**,其中在(x; y)處繪製的顏色取決於這些座標處的矩陣值。 – Raoul