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.
nataca

Thuật toán nội suy cao độ tự nhiên trong Nova

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

nataca    553

Tôi đang thử viết một Lisp để tra cao độ tự nhiên ( thay cho việc tra bằng Nova). Lúc đầu tôi nghĩ thuật toán sẽ là : tìm 3 điểm gần nhất so với điểm pick chuột rồi nội suy cao độ điểm đó thông qua phương trình mặt phẳng đi qua 3 điểm. Nhưng tôi đã nhầm. Thực tế đã chứng minh là nội suy như thế sai rất nhiều. Để đạt được chính xác thì 3 điểm đó phải tạo thành 1 tam giác chứa điểm pick bằng chuột ( Cái này giống như thằng Nova tạo lưới tam giác để nội suy đường đồng mức). Để kiểm tra điều kiện 3 điểm tạo thành 1 tam giác chứa điểm pick thì phải xử lý thuật toán như thế nào hả mọi người? Mong được chỉ giáo :cheers:

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
nataca    553
Để kiểm tra điều kiện 3 điểm tạo thành 1 tam giác chứa điểm pick thì phải xử lý thuật toán như thế nào

Đã xử lý được bài toán. Nối đường thẳng từ điểm pick chuột tới 3 đỉnh thì phải đảm bảo tổng 3 góc hợp bởi lần lượt 3 đường thẳng này là 360 độ.

  • Vote giảm 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
Nộ Thiên    133
Đã xử lý được bài toán. Nối đường thẳng từ điểm pick chuột tới 3 đỉnh thì phải đảm bảo tổng 3 góc hợp bởi lần lượt 3 đường thẳng này là 360 độ.

E rằng như vậy cũng chưa đúng. Vì nhỡ nó lấy cái tam giác lớn thì sao???

Như vậy phải kết hợp cả 2 điều kiện trê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
meohoang    342
Đã xử lý được bài toán. Nối đường thẳng từ điểm pick chuột tới 3 đỉnh thì phải đảm bảo tổng 3 góc hợp bởi lần lượt 3 đường thẳng này là 360 độ.

Tôi đọc help thấy như sau:

untitled_61.jpg

bạn xem rồi dùng líp xem sao

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
nataca    553
E rằng như vậy cũng chưa đúng. Vì nhỡ nó lấy cái tam giác lớn thì sao???

Như vậy phải kết hợp cả 2 điều kiện trên

Tất nhiên rồi. Xét từ 3 điểm có khoảng cách nhỏ nhất đếm điểm pick chuột. Nếu có 1 điểm nào không thoả mãn sẽ bỏ qua điểm đó và thay bằng điểm tiếp theo có khoảng cách " gần thứ 4" , cứ lần lượt như vậy. Thường chỉ khoảng đến điểm "gần thứ 5" là thoả mãn rồi. Cái này test thử thấy cũng ổn ổ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
nataca    553
Tôi đọc help thấy như sau:

untitled_61.jpg

bạn xem rồi dùng líp xem sao

Cám ơn bác nhưng hàm này hình như là tính khoảng cách từ 1 điểm đến 1 mặt phẳng (tạo bởi 3 điểm). Tức hướng vectơ là hướng vuông góc với mặt phẳng tạo bởi 3 điểm, còn bài toán pick chuột thì hướng vectơ là hướng trục Z. Bài toán này là tìm giao điểm của đường thẳng song song trục Z với mặt phẳng tạo bởi 3 điểm hay nói cách khác nó là bài toán nội suy cao độ của 1 điểm thuộc mặt phẳng ( tạo bởi 3 điểm) mà em nhớ bác Nguyen Hoanh đã từng viết 1 Lisp nội suy như 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
meohoang    342
Cám ơn bác nhưng hàm này hình như là tính khoảng cách từ 1 điểm đến 1 mặt phẳng (tạo bởi 3 điểm). Tức hướng vectơ là hướng vuông góc với mặt phẳng tạo bởi 3 điểm, còn bài toán pick chuột thì hướng vectơ là hướng trục Z. Bài toán này là tìm giao điểm của đường thẳng song song trục Z với mặt phẳng tạo bởi 3 điểm hay nói cách khác nó là bài toán nội suy cao độ của 1 điểm thuộc mặt phẳng ( tạo bởi 3 điểm) mà em nhớ bác Nugyen Hoanh đã từng viết 1 Lisp nội suy như thế

Vậy bạn thử hàm ilp(p1,p2,p3,p4,p5) xem sao, p1->p2 là đường thẳng p2 bạn chỉ cần cho tọa độ z tăng 1 đơn vị, p3,p4,p5 là 3 điểm của 1 plan. Hàm này sẽ cho giao điểm cái rột hà

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
nataca    553
Bác natâc đã có được lisp nọi suy cao độ giữa 3 điểm như đã nói chưa nhỉ, có thể share cho mình dùng với được ko?

Thân

Xong lâu rồi. Mình áp dụng nó với trường hợp tổng quát để làm 1 phần mềm có ích cho mọi người. Nếu chỉ nội suy giữa 3 điểm thôi thì bác NguyenHoanh đã viết 1 cái lisp như thế rồi. Bạn thử tìm xem.

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
nataca    553
Mình cũng đã tìm rồi nhưung ko thấy đâu. Giờ đang rất cần nếu bác ko có gì ngại thì share cho mình một cái được ko?

Email: nguyentau84@yahoo.com.vn

Thanks!

Nói thật mình không thích gửi riêng qua email lắm. Mình post lại lisp của bác Nguyen Hoanh lên đây cho mọi người. (@ bác Nguyen Hoanh ơi không hiểu sao chức năng tìm kiếm trên diễn đàn không hiệu quả lắm. Có cái biết chắc chắn có mà tim mãi không ra)

(defun c:ns	(/ ss3 pgoc lste tt)
  (princ "\nChon 3 text dau tien: ")
  (setq ss3 (ssget '((0 . "TEXT"))))
  (if (/= (sslength ss3) 3)
  (alert (strcat "\nBan vua chon "
				 (itoa (sslength ss3))
				 " text\nban can phai chon 3 text"
		 )
  )
  (progn
	 (setq
		pgoc (trans (getpoint "\nVao diem noi suy: ") 1 0)
		lste (mapcar 'ssname (list ss3 ss3 ss3) '(0 1 2))
		tt	 (entget (car lste))
		lste (mapcar '(lambda (e)
						 (setq tt (entget e)
							   p  (cdr (assoc 10 tt))
							   gt (atof (cdr (assoc 1 tt)))
						 )
						 (reverse (cons gt (cdr (reverse p))))
					  )
					 lste
			 )
	 )
	 (mapcar 'set '(p0 p1 p2) lste)
	 (setq tt (subst (cons 10 pgoc) (assoc 10 tt) tt)
		   tt (subst (cons 1 (rtos (getz p0 p1 p2 pgoc))) (assoc 1 tt) tt)
	 )
	 (entmake tt)
  )
  )
)

; CHHUONG TRINH CON
(defun getZ	(p0 p1 p2 p / vta vtb x0 y0 z0 x1 y1 z1 x2 y2 z2 x y A B C)
  (setq
  p	  (list (car p) (cadr p))
  vta (mapcar '- p1 p0)
  vtb (mapcar '- p2 p0)
  )
  (mapcar 'set
	   '(x0 y0 z0 x1 y1 z1 x2 y2 z2 x y)
	   (append p0 vta vtb p)
  )
  (setq
  A	(- (* y1 z2) (* y2 z1))
  B	(- (* z1 x2) (* z2 x1))
  C	(- (* x1 y2) (* x2 y1))
  )
  (/ (- (+ (* A x0) (* B y0) (* C z0)) (+ (* A x) (* B 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
tuvn254    3

các bác cho iem hỏi, thế giờ e muốn nội suy cao độ một điểm bất kỳ giữa 2 đường đồng mức đã biết cao độ thì có lisp đó không vậy các bác. E mới dùng nova đang ngồi nội suy cao độ mệt quá....

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
Phiphi-    175
các bác cho iem hỏi, thế giờ e muốn nội suy cao độ một điểm bất kỳ giữa 2 đường đồng mức đã biết cao độ thì có lisp đó không vậy các bác. E mới dùng nova đang ngồi nội suy cao độ mệt quá....

Bác tdvn có viết Lisp dưới đây, bác xem có xài được không nhé.

http://www.cadviet.com/forum/index.php?sho...205&st=1600

 

(defun C:NOISUY( / n1 n2 p p1 p2 pt h h1 h2 ht)
(defun dxf( name n)
(cdr (assoc n (entget name)))
)
(defun gocam( goc)
(if (< goc 0.0) (+ 360.0 goc) goc)
)
(defun pvi( p1 p2)
(/ (* 180 (angle p1 p2)) pi)
)
(defun ra( g)
(/ (* g pi) 180)
)
(defun deg( so)
(/ (* 180 so) pi)
)
(defun diemvuonggoc( p1 p2 p / p0)
(setq p0 (polar p (ra (+ 90.0 (gocam (pvi p1 p2)))) 10.0))
(inters p1 p2 p p0 nil)
)
(while (and (setq n1 (entsel "text 1")) (setq n2 (entsel "text 2")))
(setq n1 (car n1) n2 (car n2))
(while (setq p (getpoint "\nDiem"))
(setq p1 (dxf n1 10) p2 (dxf n2 10) st1 (dxf n1 1) st2 (dxf n2 1))
(setq h1 (atof st1) h2 (atof st2))
(if (> h1 h2) (setq pt p2 p2 p1 p1 pt ht h2 h2 h1 h1 ht))
(setq p (diemvuonggoc p1 p2 p))
(if (and (> (distance p p2) (distance p p1)) (> (distance p p2) (distance p2 p1)))
(setq h (- h1 (/ (* (- h2 h1) (distance p p1)) (distance p1 p2))))
(setq h (+ h1 (/ (* (- h2 h1) (distance p p1)) (distance p1 p2))))
)
(command "_.text" "s" (dxf n1 7) p (dxf n1 40) (deg (dxf n1 50)) (rtos h 2 3))
(entmake (list (cons 0 "POINT") (cons 8 "points") (cons 10 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
lelenlau2    0

lisp nội suy cao độ của Bác Hoành có thể nội suy được cao độ text, em có một vấn đề đặt ra là bây giờ mình nội suy cao độ mà mình không cần kích nữa mà lisp sẽ tự động kích điểm cho mình ví dụ tại tâm đường tròn, còn các đường tròn này mình sẽ tạo vào bản vẽ.

các Bác xem thử có thể làm như vậy được không chứ mình ngồi kích như vậy thì vào nova14 nội suy vẫn hay hơn.

Các bác xem thử nha có cách nào mà lisp tự động nội suy cho mình được không?

:cheers:

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
lelenlau2    0

vậy có lisp nào tự động nội suy cao độ trong nova không?

nội suy tại tâm đường tròn dó?

sau đây là phai cad của nó, chư nội suy thủ công lâu quá.

Anh Em nào giỏi thì hãy nghiên cứu giúp tôi cái này. cám ơn nhiều.

Chứ lên diễn đàn toàn nói gì không a?

http://www.cadviet.com/upfiles/BAN_VE_NOVA...4_2009bak_3.rar

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
dangngocloi    0

may bac oi, sao lam nhu vay lisp phai click nhieu qua?? Vay thuat toan nay co nhanh hon gi so voi noi suy cao do tu nhien bang tay?? Sao khong tim theo huong tu duy khac cac pac nhi? :angry2:

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


×