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

[Đã xong] Lisp xác định vị trí tương đối giữa Line và Plane trong không gian

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

Nhằm hoàn thiện các lisp xác định vị trí tương đối giữa điểm, đường thẳng, mặt phẳng trong không gian, xin gởi forum lisp xác định vị trí tương đối giữa đường thẳng và mặt phẳng trong không gian.

Nếu Line và Plane giao nhau thì giao điểm sẽ được vẽ.

;Doan Van Ha - CADViet.com - Ngay 05/4/2012
;Muc dich: Kiem tra vi tri tuong doi cua duong thang va mat phang trong khong gian. Ve giao diem neu ton tai.
(defun C:HA( / q1 q2 p1 p2 p3 p4 l l1 l2)
(vl-load-com) (or cal (arxload "geomcal")) (command "ucs" "w")
(princ "\nChon Plane...") (CMP)
(princ "\nChon Line...") (CDT)
(HA q1 q2 p1 p2 p3)
(princ))
;----- Chon Plane.
(defun CMP( / kieu)
(initget "1 2 3") (setq kieu (getkword "\nKieu chon Plane la: [1=3points/2=1point+1line/3=2lines] <1>: "))
(cond
 ((or (= kieu nil) (= kieu "1"))
  (setq p1 (getpoint "\nChon Point thu 1: ")
        	p2 (getpoint "\nChon Point thu 2: ")
        	p3 (getpoint "\nChon Point thu 3: "))
  (if (LM:Collinear-p p1 p2 p3) (alert "3 diem thang hang khong tao thanh mat phang!")))			;Khong tao thanh Plane
 ((= kieu "2")
  (setq l (car (entsel "\nChon Line: "))
        	p1 (getpoint "\nChon Point: ")
        	p2 (cdr (assoc 10 (entget l)))
        	p3 (cdr (assoc 11 (entget l))))
  (if (LM:Collinear-p p1 p2 p3) (alert "3 diem thang hang khong tao thanh mat phang!")))			;Khong tao thanh Plane
 ((= kieu "3")
  (setq l1 (car (entsel "\nChon Line thu 1: "))
        	l2 (car (entsel "\nChon Line thu 2: "))
        	p1 (cdr (assoc 10 (entget l1)))
        	p2 (cdr (assoc 11 (entget l1)))
        	p3 (cdr (assoc 10 (entget l2)))
        	p4 (cdr (assoc 11 (entget l2))))
  (if (not (and (LM:Coplanar-p p1 p2 p3 p4) (or (not (LM:Collinear-p p1 p2 p3)) (not (LM:Collinear-p p1 p2 p4)))))
(alert "2 duong thang khong tao thanh mat phang!")   						;Khong tao thanh Plane
(if (not (LM:Collinear-p p1 p2 p4)) (setq p3 p4))))))
;----- Chon Line.
(defun CDT( / kieu)
(initget "1 2") (setq kieu (getkword "\nKieu chon Line la: [1=2points/2=1line] <1>: "))
(cond
 ((or (= kieu nil) (= kieu "1"))
  (setq q1 (getpoint "\nChon Point thu 1: ")
        	q2 (getpoint "\nChon Point thu 2: "))
  (if (equal p1 p2 1E-8) (alert "2 diem trung nhau khong tao thanh line!")))				;Khong tao thanh Line
 ((= kieu "2")
  (setq l (car (entsel "\nChon Line: "))
        	q1 (cdr (assoc 10 (entget l)))
        	q2 (cdr (assoc 11 (entget l)))))))
;----- Ve Point la giao diem cua dt(q1,q2) va mf(p1,p2,p3) neu ton tai.
(defun HA(q1 q2 p1 p2 p3)
(if (and (L//P  q1 q2 p1 p2 p3) (not (LM:Coplanar-p q1 p1 p2 p3)))
 (alert "Duong thang va mat phang song song nhau!")						;TH1: Line s.song Plane
 (if (and (LM:Coplanar-p q1 p1 p2 p3) (LM:Coplanar-p q2 p1 p2 p3))
  (alert "Duong thang trung voi mat phang!")							;TH2: Line trung Plane
  (progn
(alert "Duong thang va mat phang giao nhau. \nGiao diem se duoc ve!")				;TH3: Line giao Plane
(entmake (list (cons 0 "POINT") (cons 10 (INT_L_P q1 q2 p1 p2 p3 1))))))))
;----- 1. Collinear-p (3 ®iÓm th¼ng hµng) - Lee Mac, Returns T if p1,p2,p3 are collinear
(defun LM:Collinear-p (p1 p2 p3) ((lambda ( a b c ) (or (equal (+ a B) c 1e-8) (equal (+ b c) a 1e-8) (equal (+ c a) b 1e-8))) (distance p1 p2) (distance p2 p3) (distance p1 p3)))
;----- 2. Coplanar-p (4 ®iÓm ®ång ph¼ng) - Lee Mac, Returns T if points p1,p2,p3,p4 are coplanar
(defun LM:Coplanar-p (p1 p2 p3 p4) ((lambda (n) (equal (last (trans p3 0 n)) (last (trans p4 0 n)) 1e-8)) (v^v (mapcar '- p1 p2) (mapcar '- p1 p3))))
;----- 3. Vector Cross Product - Lee Mac, Args: u,v - vectors in R^3 (tÝch v« h­íng cña 2 verter)
(defun v^v (u v) (list (- (* (cadr u) (caddr v)) (* (cadr v) (caddr u))) (- (* (car v) (caddr u)) (* (car u) (caddr v))) (- (* (car u) (cadr v)) (* (car v) (cadr u)))))
;----- 4. Line (p1,p2) // Plane (q1,q2,q3): tr¶ vÒ T hoÆc nil. by HA
(defun L//P (p1 p2 q1 q2 q3) (equal 0.0 (apply '+ (mapcar '* (cal "nor(q1,q2,q3)") (mapcar '- p1 p2))) 1e-8))
;----- 5. Inter of Line (p1,p2) vµ Plane (q1,q2,q3), flag lµ cê x¸c ®Þnh cã kÐo dµi p1p2 hay kh«ng (1: kÐo dµi, 0: kh«ng kÐo dµi). by HA
(defun INT_L_P(p1 p2 q1 q2 q3 flag / pg) (if (not (L//P p1 p2 q1 q2 q3)) (progn (setq pg (cal "ilp(p1,p2,q1,q2,q3)")) (if (= flag 1) pg (if  (equal (+ (distance p1 pg) (distance pg p2)) (distance p1 p2) 1e-8) pg nil)))) pg)

  • Vote tăng 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

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  

×