Đến nội dung


Hình ảnh
- - - - -

Kiểm tra hướng các đỉnh của đối tượng polyline


  • Please log in to reply
4 replies to this topic

#1 redsea_tq

redsea_tq

    biết lệnh erase

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

Đã gửi 19 March 2011 - 11:22 PM

Em chào các bác, em có một polyline kín, em dùng vòng lặp để duyệt từ đỉnh 1 đến đỉnh n của đường bao đó. vấn đề em muốn biết ở đây là thuật toán tự động kiểm tra xem các đỉnh đó xắp xếp thuận chiều kim đồng hồ hay ngược chiều kim đồng hồ. bác nào có ý tưởng giải quyết vấn đền thì giúp em với, em xin chân thành cám ơn!(đường bao là bất kỳ nên có nhiều trường hợp xảy ra, viền đường bao đó không chồng chéo lên nhau)
đây là file cad minh hoạ cho nhu cầu của em, mời các bác xem qua:
http://www.cadviet.c...thua_nghich.dwg
Cám ơn các bác đã quan tâm
  • 0

#2 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 20 March 2011 - 01:56 AM

Em chào các bác, em có một polyline kín, em dùng vòng lặp để duyệt từ đỉnh 1 đến đỉnh n của đường bao đó. vấn đề em muốn biết ở đây là thuật toán tự động kiểm tra xem các đỉnh đó xắp xếp thuận chiều kim đồng hồ hay ngược chiều kim đồng hồ. bác nào có ý tưởng giải quyết vấn đền thì giúp em với, em xin chân thành cám ơn!(đường bao là bất kỳ nên có nhiều trường hợp xảy ra, viền đường bao đó không chồng chéo lên nhau)
đây là file cad minh hoạ cho nhu cầu của em, mời các bác xem qua:
http://www.cadviet.c...thua_nghich.dwg
Cám ơn các bác đã quan tâm

Cách đơn giản thì mình kg rõ, nhưng cách phức tạp thì dùng công thức tính diện tích theo tọa độ. Nó sẽ cho dấu - hay + tùy theo tọa độ được sắp xếp thuận hay nghịch kim đồng hồ. giải thuật đại khái như sau :
(defun tinhdientich( lis / dt i)
(setq dt 0.0)
(setq i 0)
(setq lis (append lis (list (car lis))))
(repeat (- (length lis) 1)
(setq dt (+ dt (- (* (car (nth i lis)) (cadr (nth (1+ i) lis)))
(* (cadr (nth i lis)) (car (nth (1+ i) lis))))))
(setq i (1+ i))
)
(/ dt 2.0)
)
trong đó lis là danh sách tọa độ đỉnh polyline
  • 0

#3 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 20 March 2011 - 08:28 AM

Bạn cũng có thể xem qua các link sau :
http://debian.fmi.un...s/clockwise.htm
http://forums.autode.../highlight/true
http://forums.autode...se/m-p/2653719

Và tất cả các link GG liên quan đến counterclockwise ^^
Dù ở nhiều ngôn ngữ nhưng mình tin từ thuật toán bạn sẽ chuyển sang VBA được. GL

(defun C:Test( / @delta @cv_parse_list @polydir 2pi e ans)
;;-----------------------------------------------------------------------
;; This function returns the deflection angle (in radians) of two angles:
;;
(defun @delta (a1 a2)
(cond
((> a1 (+ a2 pi))
(setq a2 (+ a2 2pi))
)
((> a2 (+ a1 pi))
(setq a1 (+ a1 2pi))
)
)
(- a2 a1)
)
;;-------------------------------------------------------------
;; Function returns a list of 3D points from a continuous list
;; as returned by (vlax-safearray->list (vlax-variant-value X))
;;
(defun @cv_parse_list (data n / item new)
(foreach element (reverse data)
(setq item (cons element item))
(if (= (length item) n)
(setq new (cons item new) item nil)
)
)
new
)
(defun @polydir (e / ent etype object coords flag i p1 p2 p3 sum)
(cond
((/= (type e) 'ENAME) nil)
((not (vl-position (setq etype (cdr (assoc 0 (setq ent (entget e))))) '("AECC_CONTOUR" "LWPOLYLINE" "POLYLINE")))
(prompt (strcat " Object selected is a(n) " etype))
)
((and (setq flag (cdr (assoc 70 ent)))(> (boole 1 16 flag) 0))
(prompt " Object selected is a 3DMESH")
)
(1 (setq object (vlax-ename->vla-object e)
coords (vlax-get object "Coordinates")
coords (@cv_parse_list coords (if (= etype "LWPOLYLINE") 2 3))
i 1
sum 0.0
)
(and
flag
(= (logand 1 flag) 1) ; closed
(setq coords (reverse (cons (car coords)(reverse coords))))
)
(repeat (- (length coords) 2)
(setq p1 (nth (1- i) coords)
p2 (nth i coords)
i (1+ i)
p3 (nth i coords)
sum (+ sum (@delta (angle p1 p2)(angle p2 p3)))
)
)
(if (minusp sum) (princ "\nTheo chieu Kim dong Ho") (princ "\nNguoc chieu Kim dong ho"))
)
)
)
(setvar "errno" 0)
(setq 2pi (* pi 2))
(while (/= (getvar "errno") 52)
(if (setq ans (@polydir (setq e (car (entsel "\nSelect a polyline: ")))))
(princ ans)
)
)
(princ)
)

P/S : đó là nói về thuật toán. Còn về thủ thuật, bạn có thể mượn method offset của cad để kiểm tra.
Với offset khoảng cách dương, nếu diện tích đối tượng offset nhỏ hơn Pline gốc : thuận, ngược lại thì là ngược. Như vậy, hàm kiểm tra thuận hay nghịch chiều kim đồng hồ của bạn sẽ là :

Public Function isThuan(oLWP As AcadLWPolyline) As Boolean
Dim oLWPOff As AcadLWPolyline
On Error Resume Next
oLWP.Offset 1
Set oLWPOff = ThisDrawing.ModelSpace.Item(ThisDrawing.ModelSpace.Count - 1)
isThuan = (oLWP.Area > oLWPOff.Area)
oLWPOff.Delete
Set oLWPOff = Nothing
End Function

  • 1

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


#4 redsea_tq

redsea_tq

    biết lệnh erase

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

Đã gửi 20 March 2011 - 12:02 PM

Cám ơn các bạn đã quan tâm trả lời giúp mình, mình sẽ áp dụng cả 2 phương pháp. một lần nữa xin cám ơn các bạn!
  • 0

#5 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 20 March 2011 - 12:10 PM

Em chào các bác, em có một polyline kín, em dùng vòng lặp để duyệt từ đỉnh 1 đến đỉnh n của đường bao đó. vấn đề em muốn biết ở đây là thuật toán tự động kiểm tra xem các đỉnh đó xắp xếp thuận chiều kim đồng hồ hay ngược chiều kim đồng hồ. bác nào có ý tưởng giải quyết vấn đền thì giúp em với, em xin chân thành cám ơn!(đường bao là bất kỳ nên có nhiều trường hợp xảy ra, viền đường bao đó không chồng chéo lên nhau)
đây là file cad minh hoạ cho nhu cầu của em, mời các bác xem qua:
http://www.cadviet.c...thua_nghich.dwg
Cám ơn các bác đã quan tâm

Hề hề hề,
Không biết mình có hiểu đúng ý bạn hay không, nhưng mình thấy bạn có thể dùng hàm (vlax-curve-getfirstderiv curveobj param) để xác định véc tơ tiếp tuyến của polyline tại các điểm trên polyline và từ đó rút ra được polyline này sắp xếp theo chiều nào.
Hề hề hề, nếu không đúng xin chớ cừoi chê nghen.
Hề hề hề...
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.