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

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

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

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.com/upfiles/3/thua_nghich.dwg

Cám ơn các bác đã quan tâ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

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.com/upfiles/3/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

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ạn cũng có thể xem qua các link sau :

http://debian.fmi.uni-sofia.bg/~sergei/cgsr/docs/clockwise.htm

http://forums.autodesk.com/t5/NET/Check-the-drawing-direction-of-a-polyline/m-p/2562006/highlight/true

http://forums.autodesk.com/t5/Visual-LISP-AutoLISP-and-General/polyline-clockwise-or-counter-clockwise/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

  • 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

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.com/upfiles/3/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ề...

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  

×