Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
Danh Cong

[Hỏi] Vl-Sort điểm từ Trên--> Dưới, Trái -->Phải

Các bài được khuyến nghị

Chào các bác. Em đang có cái code này làm em lúng túng.

Em đang có 1 list danh sách tọa độ điểm:

List point: 

(x1 y1 z1)    (x2 y2 z2)   (x3 y3 z3). .... ( xn yn zn).

Giờ em muốn sắp xếp lại list tọa độ này theo điều kiện: Từ trên --> dưới, từ trái --> phải.

Thì code em tự viết như sau:

(vl-sort list-point (function (lambda (x1 x2)

     (or       (> (nth 1 x1) (nth 1 x2))

                 (and (= (nth 1 x1) (nth 1 x2)) (< (nth 0 x1) (nth 0 x2)))      ))))

 

Nhưng khi sử dụng nó ra kết quả tùm lum, tùm bậy:))))) Em không biết là giờ thuật toán sai ở đâu. Các bác kiểm tra giùm em với :))

Em dự đoán lỗi sai là do cụm : (and (= (nth 1 x1) (nth 1 x2)) (< (nth 0 x1) (nth 0 x2)))  , nó hoạt động không như em mong muốn.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Nghiên cứu:

Sort list points tăng dần theo X. Nếu X bằng nhau thì tăng dần theo Y.

(defun HA:SortXY(lst) (vl-sort lst '(lambda(p q) (if (equal (car p) (car q) 1E-8) (< (cadr p) (cadr q)) (< (car p) (car q))))))

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Đọc thì thấy code bạn viết có vẻ đúng, bạn thử đổi lại như này xem ( không nên để tên biến là list-point vì đôi khi gây lỗi, nên để thành list_point )

(vl-sort list_point 
     (function
       (lambda (x1 x2)
         (or(> (cadr x1) (cadr x2))
        (and
          (not(> (cadr x1) (cadr x2)))
          (< (car x1) (car x2)))     
        )
         )))

hoặc

(vl-sort list_point 
     (function
       (lambda (x1 x2)
         (if(> (cadr x1) (cadr x2))
           (> (cadr x1) (cadr x2))
        (< (car x1) (car x2))     
        )
         )))

 

  • Like 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

(vl-sort(vl-sort lst ‘(lambda(x y) (< (car x) (car y))))‘(lambda(x y) (< (cadr x) (cadr y)))))

Đại loại vậy vì mình ko trên máy tính.

Còn sort giá trị gần đúng thì khó chịu vì khi có giá trị liên hoàn nhau. Nhất là sort điểm. dễ xảy ra lỗi.

số do máy tính tính thường có sai số. 

thử lệnh sau (= (- 3.3333 3.333) 0.0003)

 

  • Like 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
1 giờ trước, Botot đã nói:

Không thể sort tập điểm bât kỳ mà chỉ có thể sort các điểm tương đối thẳng hàng mà thôi.

Vẫn làm được đấy bác. Bác test thử code đi. :)))

 

1 giờ trước, Doan Nguyen Van đã nói:
  • cadvietlisp.lsp
    lisp help
  •  

(vl-sort lst_point '(lambda (x y) (cond ((= (car x)  (car y))(> (cadr x) (cadr y)))
					    				((< (car x) (car y))))
							))))

Gửi bác, mình vẫn hay sort bằng cách này

Cám ơn bạn, nhiều code quá, mình sắp ngộ độc code rồi . :))

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tưởng chủ thớt muốn sort theo 2 phương X (từ trái --> phải) và Y (từ trên --> dưới) nên mới cần tập điểm thẳng hàng, chứ chỉ cần sort 1 phương thì code trên là đủ:

Test:

(vl-sort '((1 2) (3 4) (7 1) (2 9) (6 8))   '(lambda (x y) (cond ((= (car x)  (car y))(> (cadr x) (cadr y)))    ((< (car x) (car y))))))

 

Kết quả :

((1 2) (2 9) (3 4) (6 8) (7 1)) 

X sort, Y "tùm bậy:)))))"

 

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Vào lúc 28/5/2019 tại 16:39, ngokiet đã nói:

(vl-sort(vl-sort lst ‘(lambda(x y) (< (car x) (car y))))‘(lambda(x y) (< (cadr x) (cadr y)))))

Đại loại vậy vì mình ko trên máy tính.

Còn sort giá trị gần đúng thì khó chịu vì khi có giá trị liên hoàn nhau. Nhất là sort điểm. dễ xảy ra lỗi.

số do máy tính tính thường có sai số. 

thử lệnh sau (= (- 3.3333 3.333) 0.0003)

 

The best!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay
Đăng nhập để thực hiện theo  

×