Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
19 replies to this topic

#1 akita13

akita13

    biết pan

  • Members
  • Pip
  • 8 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 26 February 2011 - 01:00 AM

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 đỡ
  • 0

#2 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 26 February 2011 - 01:21 AM

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!!!
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#3 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 26 February 2011 - 01:28 AM

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

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#4 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 26 February 2011 - 02:11 AM

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 à.
  • 1
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#5 DuongTrungHuy

DuongTrungHuy

    biết lệnh copy

  • Members
  • PipPipPip
  • 116 Bài viết
Điểm đánh giá: 41 (tàm tạm)

Đã gửi 26 February 2011 - 07:43 AM

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
  • 0

#6 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 26 February 2011 - 08:37 AM

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.
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#7 VUVUZELA

VUVUZELA

    biết lệnh chamfer

  • Members
  • PipPipPipPip
  • 210 Bài viết
Điểm đánh giá: 97 (tàm tạm)

Đã gửi 26 February 2011 - 11:06 AM

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)
)


  • 1

Hệ thống Liên Kết, Thiết Kế Tự Động

ttps://www.facebook...etThietKeTuDong


#8 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 26 February 2011 - 01:28 PM

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.

Hình đã gửi
  • 1
Clear sky!

MF Rock collection.

#9 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5678 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 26 February 2011 - 01:40 PM

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 ạ ?
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#10 ductm2000

ductm2000

    biết pan

  • Members
  • Pip
  • 5 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 26 February 2011 - 02:41 PM

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.

Hình đã gửi



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
  • 0
0975353535

#11 akita13

akita13

    biết pan

  • Members
  • Pip
  • 8 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 26 February 2011 - 04:56 PM

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.
  • 0

#12 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5678 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 26 February 2011 - 10:50 PM

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.

Hình đã gửi






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
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#13 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 26 February 2011 - 10:58 PM

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?
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#14 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1432 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 27 February 2011 - 10:24 AM

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[i],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[i],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
  • 1

#15 hoan2182

hoan2182

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 2646 Bài viết
Điểm đánh giá: 832 (rất tốt)

Đã gửi 27 February 2011 - 02:08 PM

Bài tham khảo:

http://www.cadviet.c...pic=22781&st=40
  • 0

Gió đưa cây cải về trời

Rau răm ở lại chịu lời đắng cay...


#16 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 28 February 2011 - 02:45 AM

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
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#17 akita13

akita13

    biết pan

  • Members
  • Pip
  • 8 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 09 March 2011 - 04:38 PM

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.
  • 0

#18 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 09 March 2011 - 08:26 PM

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.
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#19 Happyspringla2007

Happyspringla2007

    biết pan

  • Members
  • Pip
  • 9 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 17 October 2013 - 03:51 PM

(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

  • 0

#20 Happyspringla2007

Happyspringla2007

    biết pan

  • Members
  • Pip
  • 9 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 17 October 2013 - 03:53 PM

Ý 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


  • 0