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

[Hỏi] Cách vẽ đường LwPolyline theo mặt phẳng bất kỳ ?

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

@gia_bach Tích có hướng 2 vecto là vậy, Nhưng mặt phẳng thì khác. Nếu đảo 2 vecto ab với nhau thì  tích có hướng nó ngược lại. Nhưng nó cũng là 1 mặt phẳng chung.

Trong cad thì khi 2 polyline có chung mp nhưng ngược assoc thì có thể join lại với nhau. Và nó tính lại tọa độ của 1 trong 2 đường đó.

Với lại khi tạo polyline theo 3 diểm như bạn thì có thể bị lỗi nếu dùng để vẽ 3d vì z direction có thể không theo ý muốn. 

Mình thấy viết lisp liên quan 3d khá khó vì có nhiều trường hợp xảy ra hơn 2D. Ví dụ như lisp bác xét 3 diểm thẵng hàng bắng lệnh angle thì lệnh angle chỉ tính được góc chiếu bằng thôi. Cho nên cần cẩn thận khi viết lisp 3d.

  • Like 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
2 giờ trước, ngokiet đã nói:

Vậy có điều kiện ABCD như thế nào không? Ví dụ như 0x+0y+1z -5=0 với 0x+0y-1z+5=0 là 1 mặt phẳng. Nhưng khi lấy ABC là 0 0 1 và 0 0 -1 là 2 vecto đối nhau.

vì vây khi tính tích có hướng thì làm sao xác định nó là pháp vecto hay là Vectơ đối?

Lập trình mình quên quy tắc toán nhiều nên đôi khi tự định quy tắc ko giống ai.

 

@ngokietXin nói lại: với mỗi 1 mặt phẳng có phương trình Ax + By + Cz + D = 0 thì chỉ có 1 vecto pháp tuyến '(A B C)

Theo ví dụ của @ngokiet tuy cùng 1 mặt phẳng Z=5 nhưng có 2 phương trình khác nhau thể hiện, nên sẽ có 2 vecto pháp tuyến khác nhau

Phương trình 0x+0y+1z -5=0 nhận '(0 0 1) làm vecto pháp tuyến; Phương trình 0x+0y-1z+5=0 nhận '(0 0 -1) làm vecto pháp tuyến

Điều này nó giống như mặt phẳng (Z=5) có phương trình 0x+0y+1z -5=0 được lật ngược lại 180 độ thì có phương trình 0x+0y-1z+5=0.

Đó là quy tắc chứ không phải tự định quy tắc ko giống ai.

@giabach xem ra quy tắc bàn tay phải áp dụng cho các trục hệ toạ độ vuông góc, đã hơn 35 năm rồi Thiệp vẫn còn nhớ. Hề hề.

 

image.png.821177185558359937fdd7040118c81f.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

@thiep Mình lần đầu tiên mình nghe nói 1 mặt phảng chỉ có duy nhất 1 vector pháp tuyến. Mình mới kt lại google thì đại đa số nói là 1 mở có vô số vector pháp tuyên và vector bác đua chỉ là 1 trong đó mà thôi.

Còn 1 mặt phẳng có thể có nhiều phương trình nhưng 1 phương trình thì chỉ có 1 mặt phẳng. Đôi khi A là B nhưng B không là A.

Còn mình viết tự định quy tắc ko giống ai. là trong lập trình riêng của mình thôi. Còn trả lời trên này mình vẫn rất quy củ đấy. Cho nên bác ko nên trích 1 phần câu ra để soi mói như vậy.

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

;; Collinearity check (Lee Mac)

(defun isCollinear ( p1 p2 p3 fz ) (equal (rem (angle p1 p2) pi) (rem (angle p2 p3) pi) fz) )

49 phút trước, ngokiet đã nói:

@gia_bach ....Ví dụ như lisp bác xét 3 diểm thẵng hàng bắng lệnh angle thì lệnh angle chỉ tính được góc chiếu bằng thôi. Cho nên cần cẩn thận khi viết lisp 3d.

Thông thường, để xét 3 điểm có thẳng hàng không, Thiệp dùng đoạn mã này:

(setq v  (mapcar '- P1 P2)
        w    (mapcar '- P3 P2)  

)

(if (equal (- (* (car v) (cadr w)) (* (cadr v) (car w)) 0 1e-6)

(princ "3 point p1 p2 p3 is collinear)

(princ "3 point p1 p2 p3 isn't collinear))

  • Like 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
2 phút trước, ngokiet đã nói:

@thiep Mình lần đầu tiên mình nghe nói 1 mặt phảng chỉ có duy nhất 1 vector pháp tuyến. Mình mới kt lại google thì đại đa số nói là 1 mở có vô số vector pháp tuyên và vector bác đua chỉ là 1 trong đó mà thôi.

Còn 1 mặt phẳng có thể có nhiều phương trình nhưng 1 phương trình thì chỉ có 1 mặt phẳng. Đôi khi A là B nhưng B không là A.

Còn mình viết tự định quy tắc ko giống ai. là trong lập trình riêng của mình thôi. Còn trả lời trên này mình vẫn rất quy củ đấy. Cho nên bác ko nên trích 1 phần câu ra để soi mói như vậy.

Nên hiểu là các vecto có cùng hướng cũng chỉ là 1 vecto thôi bạn. ví dụ vecto pháp tuyến '(1 1 2) và '(2 2 4) cũng chỉ là 1 thô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
1 phút trước, thiep đã nói:

Nên hiểu là các vecto có cùng hướng cũng chỉ là 1 vecto thôi bạn. ví dụ vecto pháp tuyến '(1 1 2) và '(2 2 4) cũng chỉ là 1 thôi.

Bác xem lại vector là gì đi. 2 vector đó là chiều dài khác nhau. Nếu xét về chỉ hướng mới giống nhau thô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
4 phút trước, ngokiet đã nói:

Bác xem lại vector là gì đi. 2 vector đó là chiều dài khác nhau. Nếu xét về chỉ hướng mới giống nhau thôi.

Ý tôi muốn nói 2 vecto pháp tuyến có cùng hướng, thì dù có dài ngắn khác nhau, điểm định vị trí đầu vecto không trùng nhau đi nữa, thì nó cũng chỉ là 1 vecto pháp tuyến thô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

Kiến thức toán học về vector:
1). Một MP có vô số vector pháp tuyến.

2). 2 vector pháp tuyến (a b c) và (x y z), và nói chung là 2 vector bất kỳ, bằng nhau khi và chỉ khi a=x, b=y, c=z. Còn không thì chúng là 2 vector (pháp tuyến) khác nhau.

3). Vector pháp tuyến chỉ dùng để định hướng, nên có thể dùng (1 2 3) hay (2 4 6) đều như nhau, chứ không phải 2 vector này là một (tức chúng không bằng nhau).

  • Like 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
(defun c:3pl (/ a b l n p _LWPoly)
    (defun _LWPoly (lst d z)
	(entmakex (append (list	(cons 0 "LWPOLYLINE")
				(cons 100 "AcDbEntity")
				(cons 100 "AcDbPolyline")
				(cons 38 d)
				(cons 90 (length lst))
				(cons 70 0)
				(cons 210 z)
			  )
			  (mapcar (function (lambda (p) (cons 10 p))) lst)
		  )
	)
    )
    (while (setq p (getpoint))
	(setq p (trans p 1 0))
	(cond (n (setq l (cons (LM:ProjectPointToPlane p a n) l)))
	      ((cadr l)
	       (setq l (cons p l)
		     a (caddr l)
		     n (gc:Normal3Pts (car l) (cadr l) (caddr l))
		     b (distance '(0 0 0) (LM:ProjectPointToLine a '(0 0 0) n))
	       )
	      )
	      ((setq l (cons p l)))
	)
	(redraw)
	(if (cadr l)
	    (mapcar '(lambda (a b) (grdraw a b 4)) l (cdr l))
	)
    )
    (if	(and n b l)
	(_LWPoly (mapcar '(lambda (x)(trans x 0 n)) l) b n)
    )
    (princ)
)
;; gc:Normal3Pts
;; Retourne le vecteur normal du plan défini par p1 p2 p3
;;
;; Arguments
;; p1, p2, p3 trois points 3d figurant un triangle dans l'espace
(defun gc:Normal3Pts (p1 p2 p3)
  (list
    (- (* (- (cadr p2) (cadr p1)) (- (caddr p3) (caddr p1)))
       (* (- (caddr p2) (caddr p1)) (- (cadr p3) (cadr p1)))
    )
    (- (* (- (caddr p2) (caddr p1)) (- (car p3) (car p1)))
       (* (- (car p2) (car p1)) (- (caddr p3) (caddr p1)))
    )
    (- (* (- (car p2) (car p1)) (- (cadr p3) (cadr p1)))
       (* (- (cadr p2) (cadr p1)) (- (car p3) (car p1)))
    )
  )
)
;; Project Point onto Line  -  Lee Mac
;; Projects pt onto the line defined by p1,p2

(defun LM:ProjectPointToLine ( pt p1 p2 / nm )
    (setq nm (mapcar '- p2 p1)
          p1 (trans p1 0 nm)
          pt (trans pt 0 nm)
    )
    (trans (list (car p1) (cadr p1) (caddr pt)) nm 0)
)

;; Project Point onto Plane  -  Lee Mac
;; Projects pt onto the plane defined by its origin and normal

(defun LM:ProjectPointToPlane ( pt org nm )
    (setq pt  (trans pt  0 nm)
          org (trans org 0 nm)
    )
    (trans (list (car pt) (cadr pt) (caddr org)) nm 0)
)

 

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ói có vô số vector pháp tuyến cũng như nói có vô số hướng Bắc, kẻ mấy cái hướng Bắc cạnh nhau là thấy. Dù có bao nhiêu đường thì nó vẫn là hướng Bắc mà, dài ngắn quan trọng gì. Trong tin học thông tin lấy được từ mặt phẳng gồm 1 điểm trên mặt phẳng và 1 vector pháp tuyến normal . 

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ác nhầm khi dùng từ rồi. Vector, phương và hướng.

1 mặt phẳng có thể xác định băng 1 điểm và phương pháp tuyến.

Nhưng 1 phương có 2 hướng ngược chiều nhau. Mà Cad khi muốn tính toán trong 3D thì nó cần có hướng extrusion direction để xác định chính xác các vật thể có chiều cao. Còn điểm thì nó lấy mặc định là tọa độ gốc. Và extrusion direction của Cad Là 1 vector có độ lớn là 1. Tuy nhiên AutoCAD có thể đã tụ tính lại. Nó chỉ cần phương và hướng thôi. Cad khác thì mình ko biết nên nhắc chủ thớt kt lại.
Do yêu cầu là vẽ pl trên 1 mặt phẳng bất kỳ thì nó chỉ ảnh hưởng phương. Nhưng nếu pl có thíckness thì có hướng mới chính xác.

Các lisp trên khi vẽ pl thì đều thực hiện đúng. Tuy nhiên ent tạo ra đôi khi ngược hướng z nhau. Ví dụ như vẽ qua 3 điểm ABC và ACB thì 2 pline nó có dxf 210 nó ngược nhau.

cái này nó sẽ ảnh hưởng các líp khác vì ít lisp đọc lại cái dxf 210 này. Mà lúc đó giá trị dxf 10,38 nó khác nhau.

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 10/7/2020 tại 14:49, ngokiet đã nói:

Thanks bác. Có điều lệnh cal này hơi khó chịu 1 chút là nếu sai thì dễ gây treo khi lập trình lisp khi chạy thử. Nhiều hàm cũng hay và có hàm lisp tương ứng. Nếu rảnh thì viết lại bằng lisp thì mình nghĩ hay hơn.

Hì cái này mình viết lâu rồi, hồi mới tìm hiểu về LISP-CAD, bây giờ thì đơn giản hơn. Duy chỉ có hàm cuối Cal (chuỗi) là thấy hay nhất đó, mình áp dụng nó để làm 1 máy tính trong Cad.

image.png.2627059f751965e1de87bbabfbdbd485.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
1 giờ} trướ}c, DuongTrungHuy đã nói:

Hì cái này mình viết lâu rồi, hồi mới tìm hiểu về LISP-CAD, bây giờ thì đơn giản hơn. Duy chỉ có hàm cuối Cal (chuỗi) là thấy hay nhất đó, mình áp dụng nó để làm 1 máy tính trong Cad.

image.png.2627059f751965e1de87bbabfbdbd485.png

Hình như giống lệnh quickcal mà bác mix lại cho hợp ý mình.

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

Hình như giống lệnh quickcal mà bác mix lại cho hợp ý mình.

Đúng vậy đó Bạn.

Nhưng tất nhiên cái máy tính của mình thân thiện và gần gũi với công việc những gì mình cần và nó cũng mở rộng hơn như bạn thấy.

Bạn hay làm việc với Cad nếu dùng hàm Cal(chuỗi) thì cũng sẽ viết thêm mở rộng cái QuickCalc cho riêng mình sử dụ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
Vào lúc 14/7/2020 tại 00:14, thiep đã nói:

;; Collinearity check (Lee Mac)

(defun isCollinear ( p1 p2 p3 fz ) (equal (rem (angle p1 p2) pi) (rem (angle p2 p3) pi) fz) )

Thông thường, để xét 3 điểm có thẳng hàng không, Thiệp dùng đoạn mã này:

(setq v  (mapcar '- P1 P2)
        w    (mapcar '- P3 P2)  

)

(if (equal (- (* (car v) (cadr w)) (* (cadr v) (car w)) 0 1e-6)

(princ "3 point p1 p2 p3 is collinear)

(princ "3 point p1 p2 p3 isn't collinear))

Collinear của leemac ở trên hình như cũ lắm rồi dễ lỗi khi góc là 0 và gần bằng pi.Mà cái này thường xảy ra vì cơ bản máy tính có sai số tuy rất nhỏ vì (rem x pi)= x nếu x<pi dù rất nhỏ. (Cái này mình bị rồi)

Còn lisp bác @thiep đưa ra tuy giải quyết được vấn đề này nhưng cả 2 líp đều chỉ ứng dụng cho 2d là hình chiếu bằng mà thôi.

Trong 3D thì 3 điểm ABC thẳng hàng thì ngoài cách tính tích có hướng 2 vector AB,ÁC bằng (0,0,0)  thì leemac dùng cách tính cạnh tâm giác có thể dùng cho cả 2d và 3d là có 1 cạnh bằng tổng 2 cạnh còn lại.

Viết líp thì chắc dễ nên mình ko viết. Lấy của leemac vậy

http://www.lee-mac.com/mathematicalfunctions.html#geometric

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

@ngokiet

Thiệp chỉ nói là "thông thường" thôi, chứ trong không gian, thì xét cả thành phần z của vecto nữa:

(setq v (mapcar '- Pt1 Pt2)
          w (mapcar '- Pt3 Pt2)
    )
    (setq bit (or (and (equal (- (* (car v) (cadr w)) (* (cadr v) (car w))) 0.0 1e-6)
             (equal (- (* (car v) (caddr w)) (* (caddr v) (car w))) 0.0 1e-6)
        	)
        	(and (equal (- (* (car v) (cadr w)) (* (cadr v) (car w))) 0.0 1e-6)
             	(equal (- (* (cadr v) (caddr w)) (* (caddr v) (cadr w))) 0.0 1e-6)
        	)
        	(and (equal (- (* (car v) (caddr w)) (* (caddr v) (car w))) 0.0 1e-6)
             	(equal (- (* (cadr v) (caddr w)) (* (caddr v) (cadr w))) 0.0 1e-6)
        	)
    		)
    )
(cond ((= bit t)(princ "\np1 p2 p3 collinear"))
      ((= bit nil)(princ "\np1 p2 p3 isn't collinear"))
)

 

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

Mình đâu nói lisp bác sai gì đâu. Do post này đang nói về 3d. Nên cái lisp nó hơi sai chủ đề 1 chút.
- còn cái lisp bác mới viết thì sai rồi đấy.

Tích vô hướng dùng để tính diện tích tam giác bất kỳ qua 3 điểm. Khi S =0 là 3 điểm mới thẳng hàng.
Lisp bác hơi rối. Mình góp ý 1 chút là : (equal (- a b) 0 fz) <=> (equal a b fz) dễ nhìn và hiệu quả hơ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
14 giờ trước, ngokiet đã nói:

Mình đâu nói lisp bác sai gì đâu. Do post này đang nói về 3d. Nên cái lisp nó hơi sai chủ đề 1 chút.
- còn cái lisp bác mới viết thì sai rồi đấy.

Tích vô hướng dùng để tính diện tích tam giác bất kỳ qua 3 điểm. Khi S =0 là 3 điểm mới thẳng hàng.
Lisp bác hơi rối. Mình góp ý 1 chút là : (equal (- a b) 0 fz) <=> (equal a b fz) dễ nhìn và hiệu quả hơn.

 

Sai như thế nào 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
1 giờ} trướ}c, thiep đã nói:

Sai như thế nào bạn?

Bác viết có test lại chưa vậy? Mình nhìn đoạn lisp là biết bất kỳ 3 diễm nào thuộc các mp vuông góc với 3 trục nó đều cho kết quả là collinear.

Lisp bác cũng gần như tính pháp vector. Nhưng bác cho ràng 2 giá trị = 0 là thẳng hàng là sai. Vì nếu giá trị còn lại #0 là bằng 2x diện tích tam giác có 3 đỉnh pt đó #0 nên nó không thẳng hàng dc.

 Dùng cách của leeMac

;; Collinear-p  -  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)
    )
)

Theo cách pháp vector mình viết lại  (Cách này mình chưa kiểm tra điểm 2d (caddr a/b/c) = nil)

(defun iscollinear(a b c)
    (setq b (mapcar '- b a)
	  c (mapcar '- c a))
    (and (equal (* (cadr b) (caddr c)) (* (caddr b)(cadr c)) 1e-6)
	 (equal (* (caddr b) (car c)) (* (car b)(caddr c)) 1e-6)
	 (equal (* (car b) (cadr c)) (* (cadr b)(car c)) 1e-6)))

Còn 1 cách nữa là chứng minh 2 vector AB AC cùng phương. Thì 3 điểm ABC thẳng hàng. Nhưng viết khá rắc rối một chút.

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  

×