Chuyển đến nội dung
Diễn đàn CADViet
Nguyen Hoanh

Hướng dẫn sử dụng mã Lisp

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

1 giờ} trướ}c, Doan Van Ha đã nói:

Nếu là index thì chưa đủ. VD khi test với p1 thì có 5 q, p2 có 3 q, p3 có 4 q. Mà tôi thì cần biết đ q của từng nhóm.

Dù sao cũng cám ơn bạn. Bạn là 1 trong số ít người luôn đưa ra những thuật toán hay, tôi rất thích.

à em k rõ mục đích của bác. chỉ đưa ra vậy thôi. trong lisp có vài điểm: dùng int thì nhanh hơn double, phép so sánh thì nhanh hơn tính toán, array thì nhanh hơn list, dùng sort quá nhiều sẽ gây chậm...

  • 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
Vào lúc 16/6/2023 tại 11:12, Doan Van Ha đã nói:

Đúng vậy. Hôm qua viết được rồi nhưng dài (nên dở), nay viết lại như vậy chắc ngắn hơn. Cám ơn mọi người đã quan tâm.


(defun Group(dsp dsq / x y z)
 (foreach p (reverse dsp) 
  (setq y nil)
  (foreach q dsq 
   (setq x (car (vl-sort (mapcar '(lambda(p) (list p q (distance q p))) dsp) '(lambda(ds1 ds2) (< (caddr ds1) (caddr ds2))))))
   (if (equal (car x) p 1e-5) (setq y (cons x y))))
   (setq z (cons y z))))

 

(defun group(dsp dsq / len)
  (mapcar '(lambda(p / y)
         (setq dsp (cdr dsp)
           dsq (vl-remove-if '(lambda(q)
                    (setq len (distance p q))
                    (if (vl-every '(lambda(x) (>= (distance x q) len)) dsp)
                      (setq y (cons q y))))
             dsq))
         y)
      dsp))

 

Viết lại theo kiểu của bác để bớt chút xíu số lượng tinh toán.

  • Like 1
  • 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

Lisp của bác ngokiet ra kết quả gọn hơn nhưng thiếu điểm p, không biết nhóm q nào thuộc p nào.

(((336.772 -7.8267 0.0) (338.109 20.063 0.0) (364.877 15.7599 0.0) (356.379 -0.0402154 0.0)) ; 4 điểm 
((310.629 60.9931 0.0) (299.425 35.0906 0.0) (321.144 41.0719 0.0)) ; 3 điểm
((216.235 53.6172 0.0) (209.065 32.4893 0.0) (221.222 14.2109 0.0) (246.062 51.0546 0.0) (243.672 24.8284 0.0))) ; 5 điểm

12  điểm trên đều là điểm q mà không có p

  • 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
57 phút trước, 7o7 đã nói:

Lisp của bác ngokiet ra kết quả gọn hơn nhưng thiếu điểm p, không biết nhóm q nào thuộc p nào.

(((336.772 -7.8267 0.0) (338.109 20.063 0.0) (364.877 15.7599 0.0) (356.379 -0.0402154 0.0)) ; 4 điểm 
((310.629 60.9931 0.0) (299.425 35.0906 0.0) (321.144 41.0719 0.0)) ; 3 điểm
((216.235 53.6172 0.0) (209.065 32.4893 0.0) (221.222 14.2109 0.0) (246.062 51.0546 0.0) (243.672 24.8284 0.0))) ; 5 điểm

12  điểm trên đều là điểm q mà không có p

Hi hi. Mình chi viết theo suy nghĩ thôi chứ không chạy test. Ý tưởng là điểm nào tính xong thì remove đi để khỏi tính lại thôi.

Còn kết quả thì ra các nhóm điểm Q theo thứ tự nhóm P. Chứ không thêm P vào nhóm.

Giống như bác Hà viết thôi.

Cách này tuy giảm tính toán so với bác Hà nhưng cũng hơi nhiều so với cách viết mỗi diêm Q tìm P gần nhất sau đó xắp xếp lại. Nhưng viết dài dòng hơn.

  • 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

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

×