2011-07-06 26 views
5

Tôi có một danh sách các điểm x, y được lưu trữ dưới dạng vectơ của vectơ và tôi muốn tìm các giới hạn.nhận được giới hạn của một danh sách các điểm x, y

Ví dụ, đưa ra này:

[[0 0] [20 30] [-50 -70] [200 300]] 

Kết quả sẽ là:

{:x -50, :y -70, :x2 200, :y2 300} 

Dưới đây là những gì tôi có cho đến nay. Nó mang lại kết quả mong muốn, nhưng có vẻ dài dòng và không phải là rất khó hiểu với tôi.

(defn get-stroke-bounds [vector-of-points] 
    (reduce (fn [m [x y]] 
     {:x (min (:x m Integer/MAX_VALUE) x) 
     :y (min (:y m Integer/MAX_VALUE) y) 
     :x2 (max (:x2 m Integer/MIN_VALUE) x) 
     :y2 (max (:y2 m Integer/MIN_VALUE) y)}) 
     {} 
     (vector-of-points))) 

Bất kỳ ý tưởng nào về cách cải thiện? Cảm ơn!

Trả lời

3

Nếu tôi đã sử dụng vectơ cho điểm đầu vào, tôi muốn giá trị trả về ở cùng một định dạng. Với ý nghĩ đó, tôi nghĩ đây là giải pháp thành ngữ tốt:

(defn bounds 
    [points] 
    (let [xs (sort (map first points)) 
     ys (sort (map second points))] 
    (list [(first xs) (first ys)] 
      [(last xs) (last ys)]))) 
+0

Lập bản đồ 'first' và' second' vào danh sách để có thứ gì đó có thể sắp xếp! Tất nhiên! Cảm ơn! – jhickner

4

Giải pháp của bạn đã khá tốt! Nó khá thành ngữ và cũng là O (n) trong số điểm tối ưu hóa về mặt thuật toán (tốt hơn trong thực tế hơn là một phương thức thực hiện sắp xếp).

Nhưng đây là một cách khác để làm việc đó bạn có thể tìm thấy thú vị .... tạo ra chủ yếu bởi vì tôi là một fan hâm mộ lớn của các chức năng bậc cao :-)

(defn get-stroke-bounds [stroke] 
    (zipmap 
     [:x :y :x2 :y2] 
     (map 
     (fn [[getter reducer]] 
      (reduce 
      reducer 
      (map getter stroke))) 
     [ 
      [first min] 
      [second min] 
      [first max] 
      [second max]]))) 
+0

Chắc chắn thú vị! Đã cho tôi một thời gian để làm theo cách nó hoạt động. Rất tuyệt! – jhickner

1

Tôi không nghĩ rằng giải pháp của bạn không phải clojure-ey nữa. Nhưng nếu bạn thích ít mã hơn, bạn có thể thử một bộ được sắp xếp.

(let [v [[0 0] [20 30] [-50 -70] [200 300]] 
     v-sorted (apply sorted-set v)] 
    [(first v-sorted) (last v-sorted)]) 

Cập nhật: Tôi xin lỗi mã trên không chính xác. Đó là cần thiết để sắp xếp tách x và y để tìm một điểm ràng buộc không phải tối đa hoặc min. John's solution là tốt hơn trừ khi bộ được ưa thích.

Các vấn đề liên quan