Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
hungbv

Tịnh tiến đường cong để tiếp xúc với đường thẳng

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

Đại ca nào giúp em với! Có cách nào để tịnh tiến một đường cong đến tiếp xúc với một đường thẳng không?

Gọi đường tròn là C, đường thẳng là L.

Bạn làm như sau:

- Bạn vẽ thêm một đường thẳng (tên là L1) có điểm bắt đầu là tâm (Center) hình tròn C, điểm kết thúc vuông góc (Perpendicular) với đường thẳng L.

- Dùng lệnh move, Chọn đối tượng C rồi chọn điểm bắt đầu move là giao (Intersection) của C và L1, điểm kết thúc move là giao (Intersection) của L1 và L.

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
Gọi đường tròn là C, đường thẳng là L.

Bạn làm như sau:

- Bạn vẽ thêm một đường thẳng (tên là L1) có điểm bắt đầu là tâm (Center) hình tròn C, điểm kết thúc vuông góc (Perpendicular) với đường thẳng L.

- Dùng lệnh move, Chọn đối tượng C rồi chọn điểm bắt đầu move là giao (Intersection) của C và L1, điểm kết thúc move là giao (Intersection) của L1 và L.

Nếu đường cong là một đường Spline thì làm thế nào? Bác giúp em với!

(em đang thiết kế cái đập cong Ô-phi-xê-rố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
Nếu đường cong là một đường Spline thì làm thế nào? Bác giúp em với!

(em đang thiết kế cái đập cong Ô-phi-xê-rốp)

Lệnh VTT (Vectơ Tịnh Tiến) trong lisp dưới đây sẽ giúp bạn.

 

Lệnh này sẽ tìm và vẽ một đoạn thẳng ngắn nhất nối đường thẳng với 1 đường cong (chính là vector tịnh tiến). Công việc còn lại của bạn là dùng lệnh move.

 

(setq cv_dvd 1000)
(defun c:vtt( / dmin)  
 (setq entl (car (entsel "\nPick vao line: ")))
 (redraw entl 3)
 (setq
entsp (car (entsel "\nPick vao spline: "))
p1 (cdr (assoc 10 (entget entl)))
p2 (cdr (assoc 11 (entget entl)))
i 0.0
 )
 (redraw entl 4)
 (repeat (1+ cv_dvd)
   (setq
     m (/ i cv_dvd)
     p (mapcar '(lambda (s1 s2) (+ (* m s1) (* (- 1.0 m) s2))) p1 p2)
     pn (vlax-curve-getClosestPointTo (vlax-ename->vla-object entsp) p)
     d (distance p pn)
     i (+ i 1.0)
   )
   (if (or (not dmin)(      (setq dmin d pluu pn pgoc p)
   )
 )
 (entmake (list (cons 0 "LINE") (cons 10 pluu)(cons 11 pgoc)))
 (princ)
)

 

Lisp trên tìm theo phương pháp dò, mặc định số điểm dò là 1000. Bạn có thể tăng độ chính xác bằng cách tăng số 1000 trong dòng lệnh (setq cv_dvd 1000) lên nhiều hơn nữa nhưng thời gian thực thi lệnh sẽ tăng lê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
Lệnh VTT (Vectơ Tịnh Tiến) trong lisp dưới đây sẽ giúp bạn.

 

Lệnh này sẽ tìm và vẽ một đoạn thẳng ngắn nhất nối đường thẳng với 1 đường cong (chính là vector tịnh tiến). Công việc còn lại của bạn là dùng lệnh move.

 

(setq cv_dvd 1000)
(defun c:vtt()  
 (setq entl (car (entsel "\nPick vao line: ")))
 (redraw entl 3)
 (setq
entsp (car (entsel "\nPick vao spline: "))
p1 (cdr (assoc 10 (entget entl)))
p2 (cdr (assoc 11 (entget entl)))
i 0.0
 )
 (redraw entl 4)
 (repeat (1+ cv_dvd)
   (setq
     m (/ i cv_dvd)
     p (mapcar '(lambda (s1 s2) (+ (* m s1) (* (- 1.0 m) s2))) p1 p2)
     pn (vlax-curve-getClosestPointTo (vlax-ename->vla-object entsp) p)
     d (distance p pn)
     i (+ i 1.0)
   )
   (if (or (not dmin)(< d dmin))
     (setq dmin d pluu pn pgoc p)
   )
 )
 (entmake (list (cons 0 "LINE") (cons 10 pluu)(cons 11 pgoc)))
 (princ)
)

 

Lisp trên tìm theo phương pháp dò, mặc định số điểm dò là 1000. Bạn có thể tăng độ chính xác bằng cách tăng số 1000 trong dòng lệnh (setq cv_dvd 1000) lên nhiều hơn nữa nhưng thời gian thực thi lệnh sẽ tăng lên.

Cảm ơn anh Hoành nhé! Em sẽ thử.

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
Lệnh VTT (Vectơ Tịnh Tiến) trong lisp dưới đây sẽ giúp bạn.

 

Lệnh này sẽ tìm và vẽ một đoạn thẳng ngắn nhất nối đường thẳng với 1 đường cong (chính là vector tịnh tiến). Công việc còn lại của bạn là dùng lệnh move.

 

(setq cv_dvd 1000)
(defun c:vtt( / dmin)  
 (setq entl (car (entsel "\nPick vao line: ")))
 (redraw entl 3)
 (setq
entsp (car (entsel "\nPick vao spline: "))
p1 (cdr (assoc 10 (entget entl)))
p2 (cdr (assoc 11 (entget entl)))
i 0.0
 )
 (redraw entl 4)
 (repeat (1+ cv_dvd)
   (setq
     m (/ i cv_dvd)
     p (mapcar '(lambda (s1 s2) (+ (* m s1) (* (- 1.0 m) s2))) p1 p2)
     pn (vlax-curve-getClosestPointTo (vlax-ename->vla-object entsp) p)
     d (distance p pn)
     i (+ i 1.0)
   )
   (if (or (not dmin)(< d dmin))
     (setq dmin d pluu pn pgoc p)
   )
 )
 (entmake (list (cons 0 "LINE") (cons 10 pluu)(cons 11 pgoc)))
 (princ)
)

 

Lisp trên tìm theo phương pháp dò, mặc định số điểm dò là 1000. Bạn có thể tăng độ chính xác bằng cách tăng số 1000 trong dòng lệnh (setq cv_dvd 1000) lên nhiều hơn nữa nhưng thời gian thực thi lệnh sẽ tăng lên.

Em vừa thử xong, vẫn không được.

Em Upload file: http://www.cadviet.com/upfiles/Ofixerop.dwg

Anh xem giúp em với!

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 vừa thử xong, vẫn không được.

Anh xem giúp em với!

Xin lỗi, lisp trên của tôi có một lỗi khiến từ lần chạy thứ 2 trở đi kết quả không đúng. Tôi đã sửa lại, các bạn hãy cập nhật.

 

Bài toán của bạn không đúng như bạn yêu cầu. Bài toán của bạn là tịnh tiến đường cong để tiếp xúc với 2 đường thẳng chứ không phải 1 đường thẳng. Lisp trên của tôi không thực hiện được bài toán tịnh tiến để tiếp xúc 2 đường thẳng.

 

Nếu tịnh tiến để tiếp xúc 1 đường thẳng (đường thẳng phải không được giao nhau với đường cong) thì bạn hãy sử dụng lisp như tôi hướng dẫn ở trên là đượ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
Xin lỗi, lisp trên của tôi có một lỗi khiến từ lần chạy thứ 2 trở đi kết quả không đúng. Tôi đã sửa lại, các bạn hãy cập nhật.

 

Bài toán của bạn không đúng như bạn yêu cầu. Bài toán của bạn là tịnh tiến đường cong để tiếp xúc với 2 đường thẳng chứ không phải 1 đường thẳng. Lisp trên của tôi không thực hiện được bài toán tịnh tiến để tiếp xúc 2 đường thẳng.

 

Nếu tịnh tiến để tiếp xúc 1 đường thẳng (đường thẳng phải không được giao nhau với đường cong) thì bạn hãy sử dụng lisp như tôi hướng dẫn ở trên là được.

Vậy nếu như bài toán trên thì anh cỏ thể giúp em được không? Em đang rất cầ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
Vậy nếu như bài toán trên thì anh cỏ thể giúp em được không? Em đang rất cần!

Cảm ơn bạn đã tin tưởng,

 

Cái đó nằm ngoài khả năng của tôi.

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ảm ơn bạn đã tin tưởng,

 

Cái đó nằm ngoài khả năng của tôi.

Xin lỗi, tôi đã hơi máy móc trong suy nghĩ.

 

Với lisp trên, muốn cho đường cong tiếp xúc với đường thẳng bạn làm như sau:

 

1. Move đường cong đi 1 chút sao nó nằm trọn vẹn trong góc tạo bởi 2 đường thẳng (không giao với đường thẳng nào).

2. Vẽ 2 vector tịnh tiến bằng cách dùng 2 lần lệnh VTT với lần lượt 2 đường thẳng (sẽ tạo được 2 vector màu đỏ).

3. Tạo vector tịnh tiến bằng tổng 2 vector tịnh tiến vừa vẽ (vector màu vàng).

4. Move đường cong theo vector tịnh tiến tổng (vector màu vàng).

 

Đây là hình vẽ:

vectotinhtien.gif

  • 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
Xin lỗi, tôi đã hơi máy móc trong suy nghĩ.

 

Với lisp trên, muốn cho đường cong tiếp xúc với đường thẳng bạn làm như sau:

 

1. Move đường cong đi 1 chút sao nó nằm trọn vẹn trong góc tạo bởi 2 đường thẳng (không giao với đường thẳng nào).

2. Vẽ 2 vector tịnh tiến bằng cách dùng 2 lần lệnh VTT với lần lượt 2 đường thẳng (sẽ tạo được 2 vector màu đỏ).

3. Tạo vector tịnh tiến bằng tổng 2 vector tịnh tiến vừa vẽ (vector màu vàng).

4. Move đường cong theo vector tịnh tiến tổng (vector màu vàng).

 

Đây là hình vẽ:

vectotinhtien.gif

Cảm ơn anh Hoành đã tận tình giú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

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


×