Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
7 replies to this topic

#1 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 14 April 2011 - 09:40 AM

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

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


#2 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 16 April 2011 - 10:43 AM

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

#3 elleHCSC

elleHCSC

    biết lệnh copy

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

Đã gửi 16 April 2011 - 05:19 PM

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

  • 1
Share for all, all will share !

--------------------
HTTP://WWW.HCSC.VN
HTTP://WWW.HCSC.COM.VN

#4 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 16 April 2011 - 07:00 PM

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

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


#5 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 17 April 2011 - 02:34 PM

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.
Hình đã gửi
  • 0

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


#6 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 18 April 2011 - 08:03 AM

Hình đã gửi

:) À 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)
)
)
  • 1

#7 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 20 April 2011 - 10:55 PM

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

  • 0

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


#8 Thaistreetz

Thaistreetz

    biết lệnh adcenter

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

Đã gửi 21 April 2011 - 01:10 AM

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

  • 1

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