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

kiểm tra một điểm có nằm trong đa giác hay không?

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

chào các bác!

Em mới học autolisp.Em đang vướng mắc trong bài toán:xác định 1 điểm xem có nằm trong đa giác kin hay không?nếu có thì xuất toạ độ điểm đó sang file txt.Mong các bác giúp đỡ

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

chào các bác!

Em mới học autolisp.Em đang vướng mắc trong bài toán:xác định 1 điểm xem có nằm trong đa giác kin hay không?nếu có thì xuất toạ độ điểm đó sang file txt.Mong các bác giúp đỡ

Trưóc hết diểm ở đây bạn nói là điểm ảo hay là 1 point trên bản vẽ. Nếu là point trên bản vẽ thì có thể xác định như sau

(setq ss (car (entsel "chon da giac kin"))) 'cái này dùng để chọn đa giác

(setq listdinh (acet-geom-vertex-list ss)) ' cái này lấy toạ độ đỉnh của đa giác

(setq listpoint (ssget "wp" listdinh '((0 . "POINT")))) ' cái này lấy tập đối tượng point trong đa giác kín đó

(if (= listpoint nil) 'đây là hàm kiểm tra xem tập chọn listpoint có rỗng không. Nếu không rỗng thì bạn lấy các đối tượng đó xuất ra txt.

Hi vọng đây là cái bạn cầ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

theo ngu ý của mình thì bạn có thể làm như thế này:

- tìm 1 điểm chắc chắn nằm trong đa giác. (cái này tùy vào dữ liệu của bạn, nếu có 1 điểm xác định trước rồi thì OK, nếu chưa thì bạn có thể lấy trọng tâm của đa giác đó)

- tìm giao điểm thực của đa giác đó với đuờng nối giữa 2 điểm (điểm nằm trong đa giác và điểm cần xác định)

- nếu tồn tại giao điểm thì điểm cần xác định nằm ngoài đa giác và nguợc lại.

PS: cách này không áp dụng đuợc với miền kín chứa lỗ thủng nhé

  • 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

theo ngu ý của mình thì bạn có thể làm như thế này:

- tìm 1 điểm chắc chắn nằm trong đa giác. (cái này tùy vào dữ liệu của bạn, nếu có 1 điểm xác định trước rồi thì OK, nếu chưa thì bạn có thể lấy trọng tâm của đa giác đó)

- tìm giao điểm thực của đa giác đó với đuờng nối giữa 2 điểm (điểm nằm trong đa giác và điểm cần xác định)

- nếu tồn tại giao điểm thì điểm cần xác định nằm ngoài đa giác và nguợc lại.

PS: cách này không áp dụng đuợc với miền kín chứa lỗ thủng nhé

Chào Bạn Thaistreet!

Thuật toán của bạn rất hay nhưng bạn quên là trọng tâm đa giác có thể nằm ngoài đa giac à.

  • 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

chào các bác!

Em mới học autolisp.Em đang vướng mắc trong bài toán:xác định 1 điểm xem có nằm trong đa giác kin hay không?nếu có thì xuất toạ độ điểm đó sang file txt.Mong các bác giúp đỡ

Có hàm này, Bạn thử xem

(defun acet-geom-point-inside ( pt ptlist dist) / ;;Check Point inside Band along Ptlist

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

Chào Bạn Thaistreet!

Thuật toán của bạn rất hay nhưng bạn quên là trọng tâm đa giác có thể nằm ngoài đa giac à.

Ngoài ra, nếu đa giác lõm thì chưa chắc đú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

chào các bác!

Em mới học autolisp.Em đang vướng mắc trong bài toán:xác định 1 điểm xem có nằm trong đa giác kin hay không?nếu có thì xuất toạ độ điểm đó sang file txt.Mong các bác giúp đỡ

 

Bác cứ nghiên cứu đoạn Autolisp này thử nhé

 

;;======================================================================;;
;;	DETERMINING IF A POINT LIES ON THE INTERIOR OF A POLYGON	;;
;;======================================================================;;

(defun insidep (pt ent / big flag obj1 obj2 obj3 p1 p2 small)
 (vl-load-com)
 (if (and pt ent)
   (progn
     (setq obj1 (vlax-ename->vla-object (car ent)))
     (setq obj2 (car (vlax-invoke obj1 'Offset 0.001))
    obj3 (car (vlax-invoke obj1 'Offset -0.001)))
     (if (> (vla-get-area obj2)(vla-get-area obj3))
(progn
  (set 'big obj2)
  (set 'small obj3))
(progn
  (set 'big obj3)
  (set 'small obj2)))
     (setq p1 (vlax-curve-getClosestPointTo big pt)
    p2 (vlax-curve-getClosestPointTo small pt))
     (if (> (distance pt p1)(distance pt p2))
(setq flag T)
(setq flag nil))
     (mapcar (function (lambda (x)
		  (progn
		    (vla-delete x)
		    (vlax-release-object x))))
      (list big small))
     )
   )
 flag
  )


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun @Inside (PIQ	 Object	  /	   ClosestPoint
	ClosestParam	  Sample   Start    End	     P1
	P2	 P	  a1	   a2	    Defl
       )

 (setq Sample 0.2)

 (vl-load-com)
 (or (= (type @delta) 'SUBR)
     (defun @delta (a1 a2)
(cond
  ((> a1 (+ a2 pi))
   (+ a2 pi pi (- a1))
  )
  ((> a2 (+ a1 pi))
   (- a2 a1 pi pi)
  )
  (1 (- a2 a1))
)
     )
 )
 (and
   (cond
     ((not Object)
      (prompt "  No object provided.")
     )
     ((= (type Object) 'VLA-Object))
     ((= (type Object) 'Ename)
      (setq Object (vlax-ename->vla-object Object))
     )
     (1 (prompt "  Improper object type."))
   )
   (or
     (and
(< 1 (vl-list-length PIQ) 4)
(vl-every 'numberp PIQ)
     )
     (prompt " Improper point value.")
   )
   (or
     (not
(vl-catch-all-error-p
  (setq	Start
	 (vl-catch-all-apply
	   'vlax-curve-getStartPoint
	   (list Object)
	 )
  )
)
     )
     (prompt "  Object is not a curve.")
   )
   (or
     (equal Start (vlax-curve-getendpoint Object) 1e-10)
     (prompt "  Curve is not closed.")
   )
   (setq P (trans PIQ 1 0))		; PIQ in WCS
   (setq ClosestPoint
   (vlax-curve-getclosestpointto Object P) ; In WCS
   )
   (not (equal P ClosestPoint 1e-10))	; in WCS
   (setq ClosestParam (vlax-curve-getparamatpoint Object ClosestPoint))
   (setq ClosestPoint (trans ClosestPoint 0 1)) ; convert to UCS
   (setq End (vlax-curve-getEndparam Object))
   (setq P1   0.0
  P2   Sample
  Defl 0.0
   )
   (setq a1 (angle PIQ (trans Start 0 1))) ; in UCS
   (while (<= P2 End)
     (setq P2 (min P2 End))
       (if (< P1 ClosestParam P2)
(setq a2   (angle PIQ ClosestPoint)
      Defl (+ Defl (@delta a1 a2))
      a1   a2
)
     )

     (while (not (setq P (vlax-curve-getPointAtParam Object P2)))
(setq P2 (+ P2 Sample))
     )
     (setq a2	 (angle PIQ (trans P 0 1)) ; in UCS
    Defl (+ Defl (@delta a1 a2))
    a1	 a2
    P1	 P2
    P2	 (+ P2 Sample)
     )
   )

   (> (abs Defl) 4)
 )
)
;;;;;;*************
(defun C:ITest (/ Object P)
 (if (setq Object (car (entsel "\nSelect curve: ")))
   (while (setq P (getpoint "\nPoint: "))
     (prin1 (@Inside P Object))
   )
 )
 (princ)
)

  • 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ái này tổng quát hơn:

 

- Nối điểm đó với 1 đỉnh, sau đó kiểm tra sự đồng phẳng, có thể bỏ qua nếu đang dùng 2D.

 

- [Nếu đồng phẳng], tìm giao giữa đường đa giac với nửa đường thẳng bất kỳ bắt đầu từ điểm đó [đường thẳng này phải đồng phẳng với mặt phẳng đa giác]

 

Nếu số giao điểm là LẺ--> điểm nằm trong đa giác và ngược lại.

 

poly1.png

  • 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

Bác có xét đến trường hợp điểm nằm trên đa giác, và/hoặc đường thẳng bất kỳ đó là đường pháp tuyến khô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

Cái này tổng quát hơn:

 

- Nối điểm đó với 1 đỉnh, sau đó kiểm tra sự đồng phẳng, có thể bỏ qua nếu đang dùng 2D.

 

- [Nếu đồng phẳng], tìm giao giữa đường đa giac với nửa đường thẳng bất kỳ bắt đầu từ điểm đó [đường thẳng này phải đồng phẳng với mặt phẳng đa giác]

 

Nếu số giao điểm là LẺ--> điểm nằm trong đa giác và ngược lại.

 

poly1.png

 

Bạn này trả lời theo tôi là gần chính xác nhưng tôi góp ý thêm như sau:

Thứ nhất: Bạn xây dựng phương trình mặt chứa đa giác đó

Thứ hai: bạn kiểm tra sự đồng phẳng của điểm và mặt phẳng

Thứ ba: bạn tìm toạ độ đỉnh của đa giác có toạ độ X là lớn nhất

thứ tư: Bạn tạo thêm điểm phụ nằm ngoài đa giác bằng cách lấy toạ độ X = Xmax +10 , còn toạ độ y lấy bằng toạ độ y của điểm cần kiểm tra

thứ năm: bạn tìm giao điểm của đoạn thẳng nối điểm cần kiểm tra và điểm phụ với các đoạn thẳng của đa giác neu số điểm lẻ thì điểm nằm trong đa giác, nếu số điểm là chẵn thì điểm nằm ngoài đa giá

Neu co gi khong hieu ban co the goi cho toi de cung trao doi: so dien thoai cua toi 0975.35.35.35

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ảm ơn các bác rất nhiều!

Các bác nhiệt tình quá.Em tìm hiểu theo gợi ý của các bác.Có gì không hiểu mong các bác giúp đỡ thêm.

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ái này tổng quát hơn:

 

- Nối điểm đó với 1 đỉnh, sau đó kiểm tra sự đồng phẳng, có thể bỏ qua nếu đang dùng 2D.

 

- [Nếu đồng phẳng], tìm giao giữa đường đa giac với nửa đường thẳng bất kỳ bắt đầu từ điểm đó [đường thẳng này phải đồng phẳng với mặt phẳng đa giác]

 

Nếu số giao điểm là LẺ--> điểm nằm trong đa giác và ngược lại.

 

poly1.png

 

 

 

 

 

Bạn này trả lời theo tôi là gần chính xác nhưng tôi góp ý thêm như sau:

Thứ nhất: Bạn xây dựng phương trình mặt chứa đa giác đó

Thứ hai: bạn kiểm tra sự đồng phẳng của điểm và mặt phẳng

Thứ ba: bạn tìm toạ độ đỉnh của đa giác có toạ độ X là lớn nhất

thứ tư: Bạn tạo thêm điểm phụ nằm ngoài đa giác bằng cách lấy toạ độ X = Xmax +10 , còn toạ độ y lấy bằng toạ độ y của điểm cần kiểm tra

thứ năm: bạn tìm giao điểm của đoạn thẳng nối điểm cần kiểm tra và điểm phụ với các đoạn thẳng của đa giác neu số điểm lẻ thì điểm nằm trong đa giác, nếu số điểm là chẵn thì điểm nằm ngoài đa giá

Neu co gi khong hieu ban co the goi cho toi de cung trao doi: so dien thoai cua toi 0975.35.35.35

 

Bác có xét đến trường hợp điểm nằm trên đa giác, và/hoặc đường thẳng bất kỳ đó là đường pháp tuyến không ạ ?

2 bác trên có onl thì trả lời hộ e câu này nhé, vì e vẫn chưa thông, đặc biệt là trường hợp dù điểm nằm ngoài đa giác, nhưng vô tình cái đường nối nó với điểm thứ 2 lại trùng với pháp tuyến của đa giác thì sao ?

P/S : các phương án dường như chưa tính đến curve của đa giác, lisp của bạn Vuvu thì tạm thời e chưa test đc

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ảm ơn các bác rất nhiều!

Các bác nhiệt tình quá.Em tìm hiểu theo gợi ý của các bác.Có gì không hiểu mong các bác giúp đỡ thêm.

Hình như phương pháp của bạn phamngoctukts là quá hay rồi. Bàn về thủ thuật thì có thể có nhiều cách, nhưng cách của bạn phamngoctukts thì có lý do gì để chê nhỉ?

Với lại, cách xác định số giao điểm là chẳn/lẻ cũng gặp một trở ngại: đó là khi nửa đường thẳng đó trùng với 1 cạnh của đa giác thì sao?

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

chào các bác!

Em mới học autolisp.Em đang vướng mắc trong bài toán:xác định 1 điểm xem có nằm trong đa giác kin hay không?

............

Một vài thuật toán xác định điểm p có nằm trong 1 đa giác có toạ độ các điểm (A[1], A[2],...A[n]) hay không ?

 

1) Tính tổng đại số các góc con: (A,p,A[i+1])

Nếu tổng A là +360 độ hay -360 độ => điểm p nằm trong đa giác; nếu tổng A là 0 => điểm p nằm ngoài đa giác.

 

2) Tính tổng đại số của các tam giác con A,p, A[i+1] :

Nếu tổng S là khác 0 => điểm p nằm trong đa giác; nếu tổng S là 0 => điểm p nằm ngoài đa giác.

 

3) tìm 1 điểm p1 mà mình biết chắc là nằm ngoài đa giác: kẻ đoạn thẳng (p0,p1).

Nếu đoạn thẳng này cắt đa giác tại 1 số chẵn điểm => p0 nằm ngoài đa giác

Nếu đoạn thẳng này cắt đa giác tại 1 số lẻ điểm => p0 nằm trong đa giác

 

4) hoặc tìm 1 điểm p2 mà mình biết chắc là nằm trong đa giác: kẻ đoạn thẳng (p0,p2).

Nếu đoạn thẳng này cắt đa giác tại 1 số chẵn điểm => p0 nằm trong đa giác

Nếu đoạn thẳng này cắt đa giác tại 1 số lẻ điểm => p0 nằm ngoài đa giác

 

Tham khảo : Determining If A Point Lies On The Interior Of A Polygon

  • 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

Hình như phương pháp của bạn phamngoctukts là quá hay rồi. Bàn về thủ thuật thì có thể có nhiều cách, nhưng cách của bạn phamngoctukts thì có lý do gì để chê nhỉ?

Để giải quyết vấn đề thì làm theo cách của phamngoctu hoàn toàn có thể sử dụng đuợc. tuy nhiên nó chỉ có thể gọi là "thủ thuật" chứ không fải là thuật toán, cách làm này yêu cầu fải tạo 1 point rồi lại xoá nó đi chỉ để fục vụ cho 1 buớc kiểm tra. nhiều lập trình viên không thích điều này vì nó ảnh huởng đến cơ sở dữ liệu bản vẽ và làm chậm tốc độ xử lý. dù chẳng để lại hậu quả gì đáng tiếc xong đã không thích thì chắc chắn là không muốn làm trừ khi không còn cách nào khác tốt hơ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

Bác cứ nghiên cứu đoạn Autolisp này thử nhé

 

;;======================================================================;;
;;	DETERMINING IF A POINT LIES ON THE INTERIOR OF A POLYGON	;;
;;======================================================================;;

(defun insidep (pt ent / big flag obj1 obj2 obj3 p1 p2 small)
 (vl-load-com)
 (if (and pt ent)
   (progn
     (setq obj1 (vlax-ename->vla-object (car ent)))
     (setq obj2 (car (vlax-invoke obj1 'Offset 0.001))
    obj3 (car (vlax-invoke obj1 'Offset -0.001)))
     (if (> (vla-get-area obj2)(vla-get-area obj3))
(progn
  (set 'big obj2)
  (set 'small obj3))
(progn
  (set 'big obj3)
  (set 'small obj2)))
     (setq p1 (vlax-curve-getClosestPointTo big pt)
    p2 (vlax-curve-getClosestPointTo small pt))
     (if (> (distance pt p1)(distance pt p2))
(setq flag T)
(setq flag nil))
     (mapcar (function (lambda (x)
		  (progn
		    (vla-delete x)
		    (vlax-release-object x))))
      (list big small))
     )
   )
 flag
  )


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun @Inside (PIQ	 Object	  /	   ClosestPoint
	ClosestParam	  Sample   Start    End	     P1
	P2	 P	  a1	   a2	    Defl
       )

 (setq Sample 0.2)

 (vl-load-com)
 (or (= (type @delta) 'SUBR)
     (defun @delta (a1 a2)
(cond
  ((> a1 (+ a2 pi))
   (+ a2 pi pi (- a1))
  )
  ((> a2 (+ a1 pi))
   (- a2 a1 pi pi)
  )
  (1 (- a2 a1))
)
     )
 )
 (and
   (cond
     ((not Object)
      (prompt "  No object provided.")
     )
     ((= (type Object) 'VLA-Object))
     ((= (type Object) 'Ename)
      (setq Object (vlax-ename->vla-object Object))
     )
     (1 (prompt "  Improper object type."))
   )
   (or
     (and
(< 1 (vl-list-length PIQ) 4)
(vl-every 'numberp PIQ)
     )
     (prompt " Improper point value.")
   )
   (or
     (not
(vl-catch-all-error-p
  (setq	Start
	 (vl-catch-all-apply
	   'vlax-curve-getStartPoint
	   (list Object)
	 )
  )
)
     )
     (prompt "  Object is not a curve.")
   )
   (or
     (equal Start (vlax-curve-getendpoint Object) 1e-10)
     (prompt "  Curve is not closed.")
   )
   (setq P (trans PIQ 1 0))		; PIQ in WCS
   (setq ClosestPoint
   (vlax-curve-getclosestpointto Object P) ; In WCS
   )
   (not (equal P ClosestPoint 1e-10))	; in WCS
   (setq ClosestParam (vlax-curve-getparamatpoint Object ClosestPoint))
   (setq ClosestPoint (trans ClosestPoint 0 1)) ; convert to UCS
   (setq End (vlax-curve-getEndparam Object))
   (setq P1   0.0
  P2   Sample
  Defl 0.0
   )
   (setq a1 (angle PIQ (trans Start 0 1))) ; in UCS
   (while (<= P2 End)
     (setq P2 (min P2 End))
       (if (< P1 ClosestParam P2)
(setq a2   (angle PIQ ClosestPoint)
      Defl (+ Defl (@delta a1 a2))
      a1   a2
)
     )

     (while (not (setq P (vlax-curve-getPointAtParam Object P2)))
(setq P2 (+ P2 Sample))
     )
     (setq a2	 (angle PIQ (trans P 0 1)) ; in UCS
    Defl (+ Defl (@delta a1 a2))
    a1	 a2
    P1	 P2
    P2	 (+ P2 Sample)
     )
   )

   (> (abs Defl) 4)
 )
)
;;;;;;*************
(defun C:ITest (/ Object P)
 (if (setq Object (car (entsel "\nSelect curve: ")))
   (while (setq P (getpoint "\nPoint: "))
     (prin1 (@Inside P Object))
   )
 )
 (princ)
)

Có bác nào onl không cho em hỏi chút.Cái hàm insidep ở đầu chương trình em thấy trong chương trình chính không thấy lệnh gọi.nó chạy trong chương trình này như thế nào ah.

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ó bác nào onl không cho em hỏi chút.Cái hàm insidep ở đầu chương trình em thấy trong chương trình chính không thấy lệnh gọi.nó chạy trong chương trình này như thế nào ah.

Hàm đó không dùng đến. Có lẽ tác giả viết vì 1 mục đích gì đó nhưng rốt cuộc không sử dụng đến rồi quên xóa mà thô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
(Defun C:THN (/ Ct Pt Lspt Sum Fuzz)

 Ý tưởng của Gia_bach (tổng các góc = 360° hoặc -360°), 1 phần code của VUVUZELA. Có anh em nào xem thì đóng góp cho!

(Defun C:THN (/ Ct Pt Lspt Sum Fuzz)
;
(Defun Goc (A1 A2)
(Cond ((> A1 (+ A2 Pi))
       (+ A2 Pi Pi (- A1))
      )
      ((> A2 (+ A1 Pi))
       (- A2 A1 Pi Pi)
      )
      (T
       (- A2 A1)
      )
);Cond
;
);Defun
(Defun Dinh (/ Pt Lstp)
(Setq Lspt (List (Getpoint "\nChän ®iÓm ®Çu tiªn:")))
(While (Setq Pt (Getpoint "\nChän ®Ønh kÕ tiÕp:"))
       (Setq Lspt (Append Lspt (List Pt)))
)
Lspt
)
;
(Defun Ptfromobj ()
(Acet-geom-vertex-List (Car (Entsel "\nChän ®a gi¸c:")))
)
;
(Initget 1 "C N")
(Setq Choose (Getkword "\nChän ®a gi¸c <C>, nhËp ®iÓm <N>:"))
(If (Equal Choose "C") 
    (Setq Lspt (Ptfromobj))
    (Setq Lspt (Dinh))
)
(Setq Lspt (Append Lspt (List (Car Lspt)))
      Pt   (Getpoint "\nChän ®iÓm cÇn kiÓm tra:")
      Sum  0
      Ct   0
      Fuzz 0.0000000001
)
(Repeat (1- (Length Lspt))
  (Setq Sum (+ Sum (Goc (Angle (Nth Ct Lspt) Pt) (Angle (Nth (1+ Ct) Lspt) Pt))))
  (Setq Ct  (1+ Ct))
)
(Cond ((Equal Sum (* -2 Pi) Fuzz)
       (Princ "\n§iÓm bªn trong vµ ®a gi¸c theo chiÒu kim ®ång hå!")
      )
      ((Equal Sum (*  2 Pi) Fuzz)
       (Princ "\n§iÓm bªn trong vµ ®a gi¸c ng­îc chiÒu kim ®ång hå!")
      )
      ((Equal Sum 0 Fuzz)
       (Princ "\nBªn ngoµi!")
      )
)
(Princ)
 
;
(Defun Goc (A1 A2)
(Cond ((> A1 (+ A2 Pi))
       (+ A2 Pi Pi (- A1))
      )
      ((> A2 (+ A1 Pi))
       (- A2 A1 Pi Pi)
      )
      (T
       (- A2 A1)
      )
);Cond
;
);Defun
(Defun Dinh (/ Pt Lstp)
(Setq Lspt (List (Getpoint "\nChän ®iÓm ®Çu tiªn:")))
(While (Setq Pt (Getpoint "\nChän ®Ønh kÕ tiÕp:"))
       (Setq Lspt (Append Lspt (List Pt)))
)
Lspt
)
;
(Defun Ptfromobj ()
(Acet-geom-vertex-List (Car (Entsel "\nChän ®a gi¸c:")))
)
;
(Initget 1 "C N")
(Setq Choose (Getkword "\nChän ®a gi¸c <C>, nhËp ®iÓm <N>:"))
(If (Equal Choose "C") 
    (Setq Lspt (Ptfromobj))
    (Setq Lspt (Dinh))
)
(Setq Lspt (Append Lspt (List (Car Lspt)))
      Pt   (Getpoint "\nChän ®iÓm cÇn kiÓm tra:")
      Sum  0
      Ct   0
      Fuzz 0.0000000001
)
(Repeat (1- (Length Lspt))
  (Setq Sum (+ Sum (Goc (Angle (Nth Ct Lspt) Pt) (Angle (Nth (1+ Ct) Lspt) Pt))))
  (Setq Ct  (1+ Ct))
)
(Cond ((Equal Sum (* -2 Pi) Fuzz)
       (Princ "\n§iÓm bªn trong vµ ®a gi¸c theo chiÒu kim ®ång hå!")
      )
      ((Equal Sum (*  2 Pi) Fuzz)
       (Princ "\n§iÓm bªn trong vµ ®a gi¸c ng­îc chiÒu kim ®ång hå!")
      )
      ((Equal Sum 0 Fuzz)
       (Princ "\nBªn ngoµi!")
      )
)
(Princ)
);Defun

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 của Gia_bach (tổng các góc = 360° hoặc -360°), 1 phần code của VUVUZELA. Có anh em nào xem thì đóng góp cho!

(Defun C:THN (/ Ct Pt Lspt Sum Fuzz)

;                                                                                                                                  

(Defun Goc (A1 A2)

(Cond ((> A1 (+ A2 Pi))

       (+ A2 Pi Pi (- A1))

      )

      ((> A2 (+ A1 Pi))

       (- A2 A1 Pi Pi)

      )

      (T

       (- A2 A1)

      )

);Cond

;                                                                                                                                  

);Defun

(Defun Dinh (/ Pt Lstp)

(Setq Lspt (List (Getpoint "\nChän ®iÓm ®Çu tiªn:")))

(While (Setq Pt (Getpoint "\nChän ®Ønh kÕ tiÕp:"))

       (Setq Lspt (Append Lspt (List Pt)))

)

Lspt

)

;                                                                                                                                  

(Defun Ptfromobj ()

(Acet-geom-vertex-List (Car (Entsel "\nChän ®a gi¸c:")))

)

;                                                                                                                                  

(Initget 1 "C N")

(Setq Choose (Getkword "\nChän ®a gi¸c <C>, nhËp ®iÓm <N>:"))

(If (Equal Choose "C")

    (Setq Lspt (Ptfromobj))

    (Setq Lspt (Dinh))

)

(Setq Lspt (Append Lspt (List (Car Lspt)))

      Pt   (Getpoint "\nChän ®iÓm cÇn kiÓm tra:")

      Sum  0

      Ct   0

      Fuzz 0.0000000001

)

(Repeat (1- (Length Lspt))

  (Setq Sum (+ Sum (Goc (Angle (Nth Ct Lspt) Pt) (Angle (Nth (1+ Ct) Lspt) Pt))))

  (Setq Ct  (1+ Ct))

)

(Cond ((Equal Sum (* -2 Pi) Fuzz)

       (Princ "\n§iÓm bªn trong vµ ®a gi¸c theo chiÒu kim ®ång hå!")

      )

      ((Equal Sum (*  2 Pi) Fuzz)

       (Princ "\n§iÓm bªn trong vµ ®a gi¸c ng­îc chiÒu kim ®ång hå!")

      )

      ((Equal Sum 0 Fuzz)

       (Princ "\nBªn ngoµi!")

      )

)

(Princ)

);Defun

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  

×