Đến nội dung


Hình ảnh

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


  • Please log in to reply
10 replies to this topic

#1 hungbv

hungbv

    biết vẽ circle

  • Members
  • PipPip
  • 33 Bài viết
Điểm đánh giá: 9 (bình thường)

Đã gửi 14 March 2008 - 09:40 PM

Đạ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?
  • 0

#2 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 15 March 2008 - 12:07 PM

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

#3 hungbv

hungbv

    biết vẽ circle

  • Members
  • PipPip
  • 33 Bài viết
Điểm đánh giá: 9 (bình thường)

Đã gửi 15 March 2008 - 02:41 PM

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

#4 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 15 March 2008 - 08:20 PM

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

#5 hungbv

hungbv

    biết vẽ circle

  • Members
  • PipPip
  • 33 Bài viết
Điểm đánh giá: 9 (bình thường)

Đã gửi 15 March 2008 - 08:40 PM

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

#6 hungbv

hungbv

    biết vẽ circle

  • Members
  • PipPip
  • 33 Bài viết
Điểm đánh giá: 9 (bình thường)

Đã gửi 15 March 2008 - 08:56 PM

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

#7 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 15 March 2008 - 09:17 PM

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

#8 hungbv

hungbv

    biết vẽ circle

  • Members
  • PipPip
  • 33 Bài viết
Điểm đánh giá: 9 (bình thường)

Đã gửi 15 March 2008 - 10:17 PM

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

#9 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 15 March 2008 - 11:23 PM

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

#10 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 16 March 2008 - 09:06 AM

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ẽ:
Hình đã gửi
  • 1

#11 hungbv

hungbv

    biết vẽ circle

  • Members
  • PipPip
  • 33 Bài viết
Điểm đánh giá: 9 (bình thường)

Đã gửi 16 March 2008 - 06:46 PM

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ẽ:
Hình đã gửi

Cảm ơn anh Hoành đã tận tình giúp đỡ!
  • 0