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

[Hỏi] Truy tìm điểm giao cắt với Spline

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

Tôi có một spline, một điểm A bên ngoài spline, một hướng h (vui lòng xem hình vẽ).

 

<a href="http://s1189.photobucket.com/albums/z427/saunambon654/?action=view¤t=PointatSpline.png" target="_blank"><img src="http://i1189.photobucket.com/albums/z427/saunambon654/PointatSpline.png" border="0" alt="Photobucket"></a>

 

Từ điểm A, vẽ theo hướng h sẽ cắt spline tại điểm B. Làm thế nào để truy tìm điểm B (bằng Autolisp)?

(Hoan nghênh bạn nghiên cứu mở rộng cho các đối tượng dạng đường khác không phải là spline như arc, elip, pline...)

 

Nếu không xem được hình vẽ, vui lòng dùng một trong các link sau:

http://www.mediafire...irl72t1t05zqq2d

http://i1189.photobu...intatSpline.png

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

 

(Hoan nghênh bạn nghiên cứu mở rộng cho các đối tượng dạng đường khác không phải là spline như arc, elip, pline...)

 

Điều này cực dễ, có thể tìm giao với nhiều nhiều nhiều loại đối tượng với việc tạo Xline và method Intersectwith của VL.

Góp ý riêng : cách đặt câu hỏi của bạn k khác chi truy bà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

Nộp bài cho bạn đây!

;Doan Van Ha - CADViet.com - Ngay 23/6/2012
;Muc dich: Ve cac diem B tren Curve theo diem A va Line chi phuong.
(defun C:HA( / obj1 obj2 ent2 p1 p2 lst)
(vl-load-com)
(command "undo" "be")
(setq obj1 (vlax-ename->vla-object (car (entsel "\nChon Curve: "))))
(setq obj2 (vlax-ename->vla-object (setq ent2 (car (entsel "\nChon Line chi phuong: ")))))
(setq p2 (getpoint "\nPick diem A: "))
(setq osm (getvar "osmode") cmd (getvar "cmdecho"))
(mapcar 'setvar '("osmode" "cmdecho") '(0 0))
(setq p1 (cdr (assoc 10 (entget ent2))))
(command "move" ent2 "" p1 p2)
(setq lst (NHOM3 (vlax-invoke obj1 'IntersectWith obj2 acExtendOtherEntity)))
(command "move" ent2 "" p2 p1)
(foreach p lst
 (entmake (list (cons 0 "POINT") (cons 10 p))))
(mapcar 'setvar '("osmode" "cmdecho") (list osm cmd))
(command "undo" "end")
(princ))
(defun NHOM3 (lst / a B)
(while lst
 (repeat 3
  (setq a (cons (car lst) a) lst (cdr lst)))
 (setq b (cons (reverse a) B) a nil)) (reverse B))

  • 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

hihi.. mình đặt câu hỏi như vậy cho rõ ràng và rành mạch thôi, nhưng nhìn lại thì cũng đúng như là bạn nói thật!! :)

 

Bạn nói dùng Intersectwith thì nó là VB rồi, đâu còn là AutoLisp nữa, mình không biết dùng món đó bạ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

uizzzz... da...., trong vòng 20' sau khi viết bài thì đã nhận được code của bác Hà. Đúng là tốc độ viết lisp của bác thuộc loại ... siêu tưởng!! Cám ơn bác nhiều nhé, mình sẽ nghiên cứu và phản hồi lại ngay!

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

Thuần lisp bạn vẫn có thể dùng command extend để lấy giao, cũng vẫn không có gì khó ở đây 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

@ketxu, Doan Van Ha: Cám ơn hai bạn đã quan tâm. Dùng CAD thì mình biết, thật ra, mình đang viết một lisp để đánh taluy từ đỉnh xuống chân của 2 đối tượng chọn trước, nhưng viết đến đây thì "bí" về thuật toán. Với sự giải đáp của các bạn, mình sẽ make nó thành một hàm con rồi truyền thông số cho nó để lấy ra điểm B. Bây giờ chắc là bạn đã hiểu ý mình.

Rất cám ơn sự giúp đỡ của bạn! (chiều nay đang bận nên chưa biết tác dụng các code trên như thế nào, mình sẽ nghiên cứu và học hỏ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

À, bạn cho mình hỏi:

- Nếu 2 đối tượng cắt nhau nhiều hơn 1 lần thì nó sẽ lấy điểm giao như thế nào?

- Hàm (vlax-invoke obj1 'IntersecWith obj2 acExtendOtherEntity)

+ Tham số cuối cùng của nó là gì?

+ Nếu 2 đối tượng không cắt nhau, hoặc có 1 đối tượng phức (Dim, Hatch, Block...) thì nó sẽ trả về nil hay báo lỗi?

Cám ơn 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

1). Hai đối tượng cắt nhau tại bao nhiêu điểm thì nó trả về bấy nhiêu.

2). Kiểu tham số trả về là 1 list có 3*n số thực, và cứ 1 bộ 3 số kề nhau tạo thành 1 điểm. VD: (1.0 2.0 0.0 3.0 4.0 0.0)

3). Nếu không cắt nhau thì trả về nil.

4). Khi gặp đối tượng phức thì khá rắc rối, VD 2 hatch có thể giao tại rất nhiều điểm => có lẽ chỉ nên dùng để xét cho 2 curve (?).

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). Hai đối tượng cắt nhau tại bao nhiêu điểm thì nó trả về bấy nhiêu.

2). Kiểu tham số trả về là 1 list có 3*n số thực, và cứ 1 bộ 3 số kề nhau tạo thành 1 điểm. VD: (1.0 2.0 0.0 3.0 4.0 0.0)

3). Nếu không cắt nhau thì trả về nil.

4). Khi gặp đối tượng phức thì khá rắc rối, VD 2 hatch có thể giao tại rất nhiều điểm => có lẽ chỉ nên dùng để xét cho 2 curve (?).

Hề hề hề,

Mình xin hỏi thêm chút về sự khác nhau giữa (vlax-invoke obj1 'IntersecWith obj2 acExtendOtherEntity) và (acet-geom-intersectwith en1 en2 flag)??.

1/- Nếu theo như bác nói thì hàm (acet-geom-intersectwith en1 en2 flag) có vẻ tốt hơn vì nó sẽ trả về một list của các point giao cắt chứ không phải một list của các số như hàm (vlax-invoke obj1 'IntersecWith obj2 acExtendOtherEntity). Do vậy khi sử dụng list này sẽ dễ dàng hơn vì không phải làm thêm bước tách list số thành list point nữa.

2/- Với các đối tượng phức như block, hatch thì hàm (acet-geom-intersectwith en1 en2 flag) cũng như hàm (vlax-invoke obj1 'IntersecWith obj2 acExtendOtherEntity) liệu có sử dụng được không???

3/- Biến acExtendOtherEntity theo mình hiểu là biến để tìm điểm giao cắt khi cho phép kéo dài đối tượng thứ hai, vậy còn các trường hợp khác thì biến đó ra sao??? Tỷ như không cho phép kéo dài các đối tượng chẳng hạn (Nó tương tự khi xét các trường hợp của biến flag trong hàm (acet-geom-intersectwith en1 en2 flag) khi biến này lấy các giá trị 0, 1,3)

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). Tất nhiên là acet nó trả về list points nên thuận tiện khi sử dụng các points của chúng. Còn vlax thì phải cần biến tấu nữa mới có list points. Tôi không dám khẳng định cái nào tốt hơn, vì nó còn phụ thuộc nhu cầu người dùng: tốc độ, thông số cần lấy khi trả về (chẳng hạn để lấy các hoành độ...), và cả phụ thuộc sở thích là có thích dùng acet hay không nữa.

2). Tôi có test thử trên block và hatch thì thấy nó vẫn cho kết quả nhưng chưa hiểu hết bản chất list trả về. Và liệu có dùng để làm gì được không. Cái này tôi chỉ biết tới đó. Nhờ các cao thủ giải thích thêm.

3). Có 4 tuỳ chọn của vlax là:

acExtendNone : Does not extend either object.

acExtendThisEntity : Extends the Fst object.

acExtendOtherEntity : Extends the Nxt object.

acExtendBoth : Extends both objects.

  • 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

Đúng là mình không mấy khi sử dụng các hàm acet, vì đôi khi thao tác trên máy chưa được cài express thì ... nó không hiểu mình ra lệnh gì cho nó!! Rất bất tiện khi làm việc di động, làm việc trên một máy tính 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

Ketxu nhớ không nhầm thì intersectwith với một đối tượng phức = intersectwith với tất cả nested entity

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  

×