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

[Đã xong] Lisp so sánh 2 Polygons xem chúng bằng nhau hoặc đồng dạng hay không

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

Lisp này để so sánh 2 polygons xem chúng bằng nhau hoặc đồng dạng hay không?

Cơ sở toán học để so sánh 2 polygons đồng dạng là khi chúng có các góc tương ứng bằng nhau và tỉ lệ các cạnh tương ứng bằng nhau.

Nếu thêm điều kiện tỉ lệ các cạnh bằng 1 thì chúng bằng nhau.

Các polygons có thể biến đổi qua các phép dời hình (đối xứng tâm/trục, tịnh tiến, quay) và phép vị tự (scale) bất kỳ, hoặc chiều vẽ bất kỳ.

Kết quả trả về: "BN" nếu bằng nhau, "DD" nếu đồng dạng, "NO" nếu không bà con gì.

Hàm kiểm tra là: (Sosanh_2Polygon ent1 ent2)

Lệnh test là: HA

File *.fas. Ai cần dòm code cho vui mắt thì inbox nhé.

 

Equal Polygons.dwg

 

Equal polygons.zip

  • 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
10 giờ trước, Doan Van Ha đã nói:

Lisp này để so sánh 2 polygons xem chúng bằng nhau hoặc đồng dạng hay không?

Cơ sở toán học để so sánh 2 polygons đồng dạng là khi chúng có các góc tương ứng bằng nhau và tỉ lệ các cạnh tương ứng bằng nhau.

Nếu thêm điều kiện tỉ lệ các cạnh bằng 1 thì chúng bằng nhau.

Các polygons có thể biến đổi qua các phép dời hình (đối xứng tâm/trục, tịnh tiến, quay) và phép vị tự (scale) bất kỳ, hoặc chiều vẽ bất kỳ.

Kết quả trả về: "BN" nếu bằng nhau, "DD" nếu đồng dạng, "NO" nếu không bà con gì.

Hàm kiểm tra là: (Sosanh_2Polygon ent1 ent2)

Lệnh test là: HA

File *.fas. Ai cần dòm code cho vui mắt thì inbox nhé.

 

Equal Polygons.dwg

Equal polygons.zip

Cái này của bác không biết đã xét góc chưa, cháu test 2 hình không đồng dạng nhưng các cặp cạnh tương ứng bằng nhau thì không phân loại được.

Và hình như lisp lấy đỉnh line để lấy chiều dài, nên cháu có test Pline có ARC thì vẫn nhận là bằng nhau 

hinh5.thumb.png.9008e883150994cae61c96ae3132207f.png

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
6 phút trước, Doan Nguyen Van đã nói:

Ý số 2 cháu nói thêm thôi, cái đấy có thể loại bỏ khi kiểm tra chiều dài cạnh, chủ yếu là ý thứ nhất, hình bên trái, 2 đa giác không đồng dạng 

Hình bên trái cháu đưa file test xem coi (Hình bên phải không phải polygon nên không nó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

Mình có viết thử 1 chút.

(defun c:sspline(/ en1 en2 infopl sspl)
  (defun infopl(en / d a b p tm)
    (mapcar '(lambda(x)
	       (Cond ((eq (car x) 10) (setq p (append p (list (cdr x)))))
		     ((eq (car x) 42) (setq b (append b (list (cdr x)))))))
	    en)
    (setq d (mapcar 'distance p (append (cdr p) (list (car p))))
	  a (mapcar 'angle (cons (last p) p) p)
	  a (mapcar '- a (cons (last a) a))
	  a (mapcar '(lambda(x) (if (< x 0) (+ x pi pi) x)) a))
    (list (cdr (assoc 70 en)) d a b))
  (defun sspl(s1 s2 / n ss1 ss2 rex s3 k)
    (defun rex(x) (append (cdr x) (list (car x))))
    (defun ss1(s1 s2 eqn) (vl-every '(lambda(a b) (equal a b eqn)) s1 s2))
    (defun ss2(s1 s2 / sc)
      (setq sc (/ (caar s1) (caar s2)))
      (if (and (vl-every '(lambda(a b) (equal sc (/ a b) 1e-12)) (car s1) (car s2)) ; So saanh canh
	       (ss1 (cadr s1) (cadr s2) 1e-8) ; So sanh goc
	       (ss1 (caddr s1) (caddr s2) 1e-8)); So sanh bul
	sc))
    (if (and
	  (eq (car s1) (car s2))
	  (eq (setq n (length (cadr s1))) (length (cadr s2))))
      (progn
	(if (eq (car s1) 0) (setq n 1))
	(setq s1 (cdr s1) s2 (cdr s2)
	      s3 (mapcar 'reverse (list (car s1) (mapcar '(lambda(x) (- (+ pi pi) x)) (cadr s1)) (mapcar '- (caddr s1))))
	      s3 (list (car s3) (rex (cadr s3)) (caddr s3)))
	(while (and (not (or (setq k (ss2 s1 s2))
			     (setq k (ss2 s3 s2))))
		    (/= (setq n (1- n)) 0))
	  (setq s1 (mapcar 'rex s1)
		s3 (mapcar 'rex s3)))
	k)))
  (if (and (setq en1 (car (nentsel "Select pline 1:")))
	   (eq (cdr(assoc 0 (setq en1 (entget en1)))) "LWPOLYLINE")
	   (setq en2 (car (nentsel "Select pline 2:")))
	   (eq (cdr(assoc 0 (setq en2 (entget en2)))) "LWPOLYLINE"))
    (if (setq en1 (sspl (infopl en1) (infopl en2)))
      (alert (strcat "2 Polyline dong dang ti le canh " (rtos en1)))
      (alert (strcat "2 Polyline khong dong dang " )))))

- Chỉ xét đồng dạng. chưa xét đối xứng.

- Viết theo kiểu xét các cạnh và góc bằng nhau.

- Có so sánh luôn polyline cả line và arc.

Có sai 1 chút nhưng chưa rảnh đề sửa là nếu open PL thì lỡ so sánh luôn bulge cuối không có cạnh. Và chưa so sánh luôn phần đối xúng.

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, Doan Nguyen Van đã nói:

Đây bác

Pline1.dwg

Đã xét góc và cạnh như nói từ đầu rồi. Kiểm tra lại thì phát hiện ghi nhầm 1 chữ cái thành 2 biến đổi nhau. Đã edit và post lại ở trên. Doan test lại xem.

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  

×