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

Tim chân đường vuông góc từ 1 điểm đến đường pline

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

Nhờ bác nào viết giúp hàm con mà đầu vào cho 1 điểm P nằm ngoài đường pline pl, tìm điểm N là chân đoạn thẳng vuông góc từ P đến pl, nếu có nhiều điểm N thì chọn điểm mà chiều dài đoạn PN là nhỏ nhất.

Xin cảm ơn!.

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
16 giờ trước, Doan Van Ha đã nói:

(setq q (vlax-curve-getClosestPointTo pl p))

Hic. Đơn giản và hiệu quả. Cảm ơn bác nhiều.

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

Hàm này chỉ khoảng cách ngắn nhất từ 1 điểm đến pline, không có nghĩa là vuông góc. Nghĩa là hạ vuông góc thành điểm N trên pline, nếu nó nằm trong pline thì lấy N, ngoài thì lấy endpoint hoặc startpoint gần N

  • 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
Vào lúc 25/3/2023 tại 21:35, VoHoan đã nói:

Nhờ bác nào viết giúp hàm con mà đầu vào cho 1 điểm P nằm ngoài đường pline pl, tìm điểm N là chân đoạn thẳng vuông góc từ P đến pl, nếu có nhiều điểm N thì chọn điểm mà chiều dài đoạn PN là nhỏ nhất.

Xin cảm ơn!.

Bạn tham khảo nhé

ppl.lsp

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
13 phút trước, Doan Van Ha đã nói:

Hahaha. Mọi người cứ làm quá. Đủ y/c của người ta rồi.

Đừng hiểu sai về nghĩa của hàm

image.thumb.png.fdeb26843ce69f30a893a99f82edcc4c.png

  • 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

 

19 phút trước, Doan Van Ha đã nói:

Hahaha. Mọi người cứ làm quá. Đủ y/c của người ta rồi.

Em định thêm cú (inters pt1 pt2 pt3 pt4 [onseg]) nữa. 

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
16 phút trước, cuongtk2 đã nói:

Đừng hiểu sai về nghĩa của hàm

image.thumb.png.fdeb26843ce69f30a893a99f82edcc4c.png

Vậy em muốn hàm Perpendicular point thì phương thức như thế nào anh? Thanks!

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ại vì mình cũng dính đòn này nhiều lần dẫn đến sai kết quả.

Hàm đúng đối với Arc và Line. (vlax-curve-GetClosedPoint obj pt t) "t" = true.

nên nếu ClosedPoint = EndPoint hoặc Startpoint thì mình lấy segment ở đó. Nếu bulge = 0 thì tạo 1 Line, khác 0 thì tạo Arc từ segment đó.

Em xem mô phỏng lại theo link 

https://forums.autodesk.com/t5/net/finding-the-two-intersection-points-between-two-endpoints-of-a/m-p/11825422#M76307

  • 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

Trách gì thấy sai sai mà bận quá chưa kt lại. Giờ muốn cả trường hợp điểm N nằm ngoài pl thì ntn nào các bác?

  • Vote giảm 2

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

Điểm N nằm ở phân đoạn nào thì xây dựng Line, hoặc Arc phân đoạn đó theo giá trị bulge. Chạy lại hàm vlax-getclosedpointto với đối tượng vừa tạo ra là nó đúng.

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
1 giờ trước, tannguyen291 đã nói:

Nếu EndPoint của Pline là Arc Bulge thì sảy ra 2 trường hợp. 

image.thumb.png.7019f54d0f778a0204259fe0a03c4018.png

tùy vào từng trường hợp chứ đơn nhất arc bulge chưa chắc đã tối ưu ạ

Ừ, cái đó là do user quyết định. Tuy nhiên phải tính đến pline có thể extend đến N hay không? Nếu không thuộc pline kéo dài thì với chiều dài của cung ngắn hơn chút xíu sẽ ra điểm khác.

 

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

test thử:

(setq obj (vlax-ename->vla-object (car (entsel "\nChon Arc (not Pline):")))
    p1 (getpoint "\nPick point")
    p2 (vlax-curve-getclosestpointto obj p1 t)
      )
(entmake (list (cons 0 "LINE") (cons 10 p1) (cons 11 p2)))

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

Thực ra nó không khó. Lấy toàn bộ segment rồi tìm điểm vuông góc trên (in) segment đó. Nếu tồn tại nhiều điểm thì lấy điểm gần nhất . Nếu không thì lấy getclosedpointto để làm tiếp

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

Chào chủ topic.

 

Bài này đơn giản mà. 
Cứ viết bài tìm chân đường cao từ 1 điểm xuống đoạn thẳng là OK.

 

Thân chào!

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
3 giờ trước, Doan Van Ha đã nói:

Có cảm giác chủ topic đặt câu hỏi mà không nghĩ hết các trường hợp xãy ra?
Và không biết là lấy những điểm vuông góc đặc biệt ấy để làm gì, hay chỉ đặt ra vậy thôi (vì câu hỏi quá ngắn gọn)?

Vì áp dụng vào công việc nên pl chủ yếu là đường Pline chứ ko nghĩ là mình đưa ra trường hợp tổng quát vậy. Các bác giải quyết bài toán là đường Pline là được ạ, còn các trường hợp đặc biệt khi dùng lisp thì mình sửa thủ công thôi.

  • Vote giảm 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
13 giờ trước, cuongtk2 đã nói:

Giờ mới thấy nó là GetClosedPointTo chứ không phải là GetPerpendicularTo.

mình đang cố gắng viết hàm này nhưng kết quả chưa đúng với pline có cung tròn.

  

vuonggocpline.lsp

hàm của bác gặp vấn đề rồi

Select object: ; error: bad argument type: 2D/3D point: nil

 

image.png.55b66a0096494dfe300e1a1d859ed02a.png

 

(defun point-perpen-to-circle (pt seg / BULGE CENT D PE PS R X X1 X2 Y Y1 Y2)
  (setq ps (nth 0  seg)
        pe (nth 1 seg)
        bulge (nth 2 seg))
  (setq cent (calcCenPt ps pe bulge)
        r (DISTANCE ps cent)
        d (DISTANCE pt cent)
        ang (angle p1 cent)  ;; <<<<<======= p1 này không biết ở đâu ra
        pv (polar p1 ang (if (> d r)
                           (- d r)
                           (- r d)
                           )
                  )
        )
  
  pv
  )

 

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 cũng gửi 1 hàm mình viết

;bul = t : bulge extend
;bul = nil : tanget extend
(defun PointPerpendicular (ent point bul / para startpt endpt pt0 lstex lst lstpt obj cen )
  (setq
    ent (vlax-ename->vla-object ent)
    pt0 (vlax-curve-getclosestpointto ent point)
    para (vlax-curve-getparamatpoint ent pt0)
    startpt (vlax-curve-getstartpoint ent)
    endpt (vlax-curve-getendpoint ent)
  )
  (setq lstex (vlax-safearray->list (vlax-variant-value (vla-Explode ent))))
  (cond
    ( (equal pt0 startpt 1e-8)
      (setq lst (list (car lstex)))
    )
    ( (equal pt0 endpt 1e-8)
      (setq lst (list (last lstex)))
    )
    ((= para (fix para))
      (setq 
        para (fix para)
        lst (list (nth (1- para) lstex) (nth para lstex))
      )
    )
  )
  (foreach item lst
    (if (eq (vla-get-Objectname item) "AcDbLine")
      (setq 
        obj (vlax-ename->vla-object (makeXline (vlax-curve-getstartpoint item) (vlax-curve-getendpoint item))) 
        lstpt (cons (vlax-curve-getclosestpointto obj point) lstpt)
        obj (vla-delete obj)
      )
      (if bul
        (setq
          obj (entget (vlax-vla-object->ename item))
          obj (vlax-ename->vla-object (entmakex (list '(0 . "CIRCLE") (assoc 10 obj) (assoc 40 obj))))
          lstpt (cons (vlax-curve-getclosestpointto obj point) lstpt)
          obj (vla-delete obj)
        )
        (setq 
          cen (vlax-safearray->list (variant-value (vla-get-Center item)))
          obj (polar pt0 (+ (/ pi 2) (angle cen pt0)) 1)
          obj (vlax-ename->vla-object (makeXline pt0 obj))
          lstpt (cons (vlax-curve-getclosestpointto obj point) lstpt)
          obj (vla-delete obj)
        )
      )
    )
  )
  (if lstpt
    (setq 
      lstpt (vl-sort lstpt '(lambda (a b) (< (distance a point) (distance b point))))
      pt0 (car lstpt)
      lst nil
    )
  )
  (mapcar 'vla-delete lstex)
  pt0
)

(defun makeXline (p1 p2 / p3 )
  (entmakex
    (list '(0 . "XLINE") '(100 . "AcDbEntity") '(100 . "AcDbXline") 
      (cons 10 p1) (cons 11 (mapcar '(lambda (a b) (/ (- a b) (distance p1 p2))) p1 p2)))
  )
)

và một hàm test 

(defun c:test (/ cur pt px)
  (setq
    cur (car (entsel "\nSelect Pline"))
    pt (getpoint "\nPick point")
    px (PointPerpendicular cur pt nil) ;extend tanget nil ;extend bulge t
  )
  (entmake (list '(0 . "LINE") (cons 10 pt) (cons 11 px)) )
  (princ)
)

tuy nhiên sảy ra vấn đề khi dùng phương thức bulge 

1854123961_Screenshot2023-03-31093256.png.7b64a820fd52ee83f0513e28ebfdb500.png

 

không sai nhưng nhìn cứ lạ lắm :))

Nên em cho rằng dùng phương thức tanget extend là tốt nhất.

471732059_Screenshot2023-03-31093521.png.e65856f05a3ded0a47ca781d5961c48e.png

 

 

  • Like 2

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
3 giờ trước, tannguyen291 đã nói:

Theo đoạn lisp trên của bác tannguyen291 là cơ bản xử lý gọn công việc của mình rồi. Rất cảm ơn các bác nhiệt tình trao đổi. Chúc các bác cuối tuần vui vẻ!

 

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  

×