Chuyển đến nội dung
Diễn đàn CADViet
Thaistreetz

Xác định vị trí tuơng đối của 1 điểm đối với 1 Curve

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

Mình cần các bác trợ giúp cho vấn đề này để tìm ra thuật toán nhanh nhất có thể: có 1 đường Pline hoặc 1 Curve hở và 1 điểm (điểm này được xác định khi người dùng pick chuột bên cạnh Curve nên nó sẽ không nằm quá xa về phía 2 đầu mút của Curve). Yêu cầu xác định điểm đó nằm bên trái hay bên phải so với chiều của Curve đó (tất nhiên là mình đang xét trong 2D)

PS: mình đã thử xét góc tạo bởi đường thẳng vuông góc từ điểm đó đến curve và phương của pháp tuyến tại điểm vuông góc. tuy nhiên cách này hơi chậm nên không được hiệu quả lắ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

Mình cần các bác trợ giúp cho vấn đề này để tìm ra thuật toán nhanh nhất có thể: có 1 đường Pline hoặc 1 Curve hở và 1 điểm (điểm này được xác định khi người dùng pick chuột bên cạnh Curve nên nó sẽ không nằm quá xa về phía 2 đầu mút của Curve). Yêu cầu xác định điểm đó nằm bên trái hay bên phải so với chiều của Curve đó (tất nhiên là mình đang xét trong 2D)

Câu hỏi Ban làm Mình ngại trả lời vì không biết như thế này có nhanh nhất như Bạn yêu cầu không?

Bạn thử xem 1 cung đi qua 3 điểm

1-điểm đầu mút

2-điểm gần nhất từ điểm bấm P đến đường cong (vlax-curve-getClosestPointTo ent P)

3- điểm bấm P

Rồi xem tham số bulge nếu âm hoặc dương gì đó thì bên phải hoặc trái!

Hy vọng thành công.

  • 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

Tớ chỉ có giải thuật chung nhất này (dùng cho Line) bạn xem có áp dụng được không :

 

(defun IsPointOnLeftSide (p00 p01 p02 / Px Py x1 y1 x2 y2 dx dy xx yy ss1 ss2 trai) ; p00 la diem can xac dinh
 (setq
    Px (car p00)
    Py (cadr p00)
    x1 (car p01)
    y1 (cadr p01)
    x2 (car p02)
    y2 (cadr p02)
    dx (- x2 x1)
    dy (- y2 y1)
    xx (- Px x1)
    yy (- Py y1)
    ss1 (* dx yy)
    ss2 (* dy xx)
 )  
 (if (> ss1 ss2)
   (setq Trai 1) ; =1 true
   (setq Trai 0)
 )  
);

  • 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âu hỏi Ban làm Mình ngại trả lời vì không biết như thế này có nhanh nhất như Bạn yêu cầu không?

Bạn thử xem 1 cung đi qua 3 điểm

1-điểm đầu mút

2-điểm gần nhất từ điểm bấm P đến đường cong (vlax-curve-getClosestPointTo ent P)

3- điểm bấm P

Rồi xem tham số bulge nếu âm hoặc dương gì đó thì bên phải hoặc trái!

Hy vọng thành công.

Bác có thể nói rõ hơn đuợc không? mình nghĩ mãi mà chưa thông đuợc ý của bác. nếu bác có thể code nó ra nữa thì tốt quá!

@bác elleHCSC: Em cần kiểm tra với cả các đuờng thẳng và đuờng cong nên không dùng đuợc cách của bác. nhưng thuật toán của bác thực sự là rất hay.

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 đã hiểu ý của bác DuongTrungHuy rồi. tuy nhiên trong trường hợp này thì hệ số cong bulge sẽ không phản ánh đúng vị trí của điểm cần xét nằm bên trái hay bên fải curve. nó chỉ đúng trong đa số trường hợp thôi. bác có thể xem bản vẽ minh họa này. giá trị bulge trong 2 truờng hợp này nguợc dấu nhau nhưng 2 điểm P1 và P2 vẫn nằm cùng 1 phía.

cvr.jpg

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

cvr.jpg

:) À thì ra là vậy! Mình tường là điểm bấm P1, P2 gần Gốc curve như Bạn vừa vẽ (là điểm thứ 2 trong (entsel) và Bạn bấm chọn điểm gần đầu Curve).

Trong tường hợp này có lẽ chỉ có cách mà bạn nói là dùng vecto pháp thôi...Bạn có thể đưa lên cách Bạn đã giải quyết để Mình xem có cách khác tốt hơn k?

Bạn thử cái này xem có được k? Mình tận dụng ý của Bạn "elleHCSC"

 

(Defun c:left()

(defun LeftSide (p0 p1 p2 / x1 y1 x2 y2 dx dy)

(setq x1 (car p1) y1 (cadr p1)

x2 (car p2) y2 (cadr p2)

dx (- x2 x1) dy (- y2 y1)

)

(if (> (* dx (- (cadr p0) y1)) (* dy (- (car p0) x1))) (setq Left 1) (setq Left 0))

)

(setq e1 (car (entsel)))

(while (setq d1 (getpoint "\nCho diem")

d2 (vlax-curve-getClosestPointTo e1 d1)

Ldai (vlax-curve-getdistatpoint e1 d2)

d3 (vlax-curve-getPointAtDist e1 (+ ldai 1))

Left (LeftSide d1 d2 d3)

)

(If (= Left 0)(Princ "\nBen Phai")(Princ "\nBen Trai"))

(grdraw d1 d2 100)(grdraw d1 d3 100)

)

)

  • 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

Sorry bác DuongTrungHuy. hôm nay mình để ý đến topic này mới biết bài bác gửi.

Đoạn code của bác tuyệt quá. Cảm ơn bác.

Còn đây là đoạn code của mình. nó chạy không ổn định, thỉnh thoảng nó cho kết quả sai. có thể do là do thuật toán.

(defun c:test nil
(setq EN1 (car(entsel "Chon Curve"))
     ptx1 (trans (getpoint "\nchon diem xet") 1 0)
     Ptx2 (vlax-curve-getClosestPointTo EN1 Ptx1)
     Vec (Vlax-curve-getfirstderiv EN1 (vlax-curve-getParamAtPoint EN1 Ptx2)))
(if (equal (- (angle '(0 0) (cal "vec(Ptx2,Ptx1)")) (angle '(0 0) Vec)) 1.5708  0.01)
 (prompt "\nTrai") (prompt "\nPhai")) (princ))

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

Dựa theo thuật toán của bác elleHCSC và code do bác DuongTrungHuy triển khai. Mình viết lại 1 hàm con cho bác nào có nhu cầu. Hàm này dùng để kiểm tra xem 1 điểm bất kỳ (kể cả điểm đó nằm xa về 2 phía đầu mút của Curve) có nằm bên trái 1 Curve hay không. Nếu thỏa mãn hàm trả về T, nếu điểm nằm bên fải hoặc nằm trên Curve hàm trả về nil. cảm ơn các bác elleHCSC và DuongTrungHuy đã giúp mình xây dựng hàm này.

(defun Check-point-left-curve (ename point / ptx1 ptx2 x1 y1 Ldai Lent)
 (setq ptx1 (vlax-curve-getClosestPointTo ename point)
       Ldai (vlax-curve-getdistatpoint ename ptx1)
       Lent (vlax-curve-getdistatpoint ename (vlax-curve-getEndPoint ename)))
 (if (< Ldai Lent)
   (progn
     (setq ptx2 (vlax-curve-getPointAtDist ename (+ Ldai 0.1)) x1 (car ptx1) y1 (cadr ptx1))
     (if (> (* (- (car ptx2) x1) (- (cadr point) y1)) (* (- (cadr ptx2) y1) (- (car point) x1))) T Nil))
   (progn
     (setq ptx2 (vlax-curve-getPointAtDist ename (- Ldai 0.1)) x1 (car ptx2) y1 (cadr ptx2))
     (if (> (* (- (car ptx1) x1) (- (cadr point) y1)) (* (- (cadr ptx1) y1) (- (car point) x1))) T Nil))))

  • 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

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

×