Chuyển đến nội dung
Diễn đàn CADViet
doanduyhung

Hỏi cách tạo đường đồng mức

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

Bạn gởi Lisp xây dựng lưới tam giác đó cho mọi người tham khảo được không? Để tham khảo cách viết của bạn nhé!

Mình có lisp xây dựng lưới tam giác từ tập hợp text cao độ trong acad nhưng chưa chạy nhanh được, mình đang xem lại thuật toán.

Các bạn có thể load về tham khảo nhé!

http://www.cadviet.com/upfiles/3/3989_ve_luoi_tam_giac.lsp

  • 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

Vì các Text cao độ của bạn chỉ có giá trị cao độ nhưng thực tế cao độ trong bản vẽ của các text này bằng 0, chương trình vẽ lưới lấy giá trị cao độ các text từ mã DXF là 10 chứ không phải mã 1 nên bạn phải dùng lisp sau để số hóa cho các text của bạn trước khi dùng :

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(Defun Sohoatext ( / picset Idx Entt PLis)

(If (Setq picset (Ssget (List (Cons 0 "*TEXT"))))

(Progn

(Setq Idx 0)

(Repeat (SSlength picset)

(Setq Entt (Entget (SSname picset Idx)))

(If (And (Or (Equal (Cdr (Assoc 0 Entt)) "TEXT") ;;Doi tuong la TEXT

(Equal (Cdr (Assoc 0 Entt)) "MTEXT") ;;Hoac doi tuong la MTEXT

)

(Numberp (Read (Cdr (Assoc 1 Entt)))) ;;La TEXT dang chu so

)

(Progn

(Setq Pnt (List (Cadr (Assoc 10 Entt)) (Caddr (Assoc 10 Entt)) (AtoF (Cdr (Assoc 1 Entt)))))

(Setq Entt (Subst (Cons 10 Pnt) (Assoc 10 Entt) Entt))

(Entmod Entt)

)

)

(Setq Idx (+ Idx 1))

)

)

)

(Princ)

)

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 gởi Lisp xây dựng lưới tam giác đó cho mọi người tham khảo được không? Để tham khảo cách viết của bạn nhé! Mình có lisp xây dựng lưới tam giác từ tập hợp text cao độ trong acad nhưng chưa chạy nhanh được, mình đang xem lại thuật toán. Các bạn có thể load về tham khảo nhé! http://www.cadviet.com/upfiles/3/3989_ve_luoi_tam_giac.lsp

Đúng là lisp chạy lâu thật.

Mình thấy bạn nên thay đoạn

(setq vertexlist (reverse (append (reverse vertexlist) (list P))))

thành

(setq vertexlist (cons p vertexlist))

sẽ giúp việc tạo danh sách đc nhanh hơn chút ít.

Tuy nhiên, để cải tiến bạn cần xem lại code của mình như bạn lethaonguyen đã góp ý.

Bạn cũng có thể nói rõ hơn vị trí mà code ở đó theo bạn là chạy chậm để mọi người có thể giúp bạn.

Để rút ngắn thời gian thì có nhiều cách (phần cứng, phần mềm và giải thuật), trong đó giải thuật là rất quan trọng, (như bạn lethaonguyen đã làm đc, rất hay). Nếu bạn có thể kết hợp với ý tưởng của PP chia ô (như mình đã nêu trong một chủ đề) thì bạn sẽ giảm tốc độ đáng kể.

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

Các bác thử nghiên cứu lisp tạo tam giác này xem rồi chế nó thành của mình.

Đây là thuật toán tạo tam giác của người Nga

(defun c:taotamgiac (/ I L S)
(princ (strcat "\n select points"))
(if (setq i 0
      	s (ssget '((0 . "POINT")))
	) ;_  setq
 (progn (repeat (sslength s)
     	(setq l (cons (cdr (assoc 10 (entget (ssname s i)))) l)
           	i (1+ i)
     	) ;_  setq
    	) ;_  repeat
    	(eea-delone-triangulate i l)
 ) ;_  progn
) ;_  if
) ;_  defun
(defun eea-delone-triangulate
  	(i1 L / A A1 A2 A3 I I2 L1 L2 L3 LP MA MI P S TI TR X1 X2 Y1 Y2)
;;*********************************************************
;;
;; Written by  ElpanovEvgeniy
;; 17.10.2008
;; edit 20.05.2011
;; Program triangulate an irregular set of 3d points.    
;;
;;*********************************************************
(if l
 (progn
  (setq ti (car (_VL-TIMES))
    	i  1
    	i1 (/ i1 100.)
    	i2 0
    	l  (vl-sort (mapcar (function (lambda (p)
                                   	(list (/ (fix (* (car p) 1000)) 1000.)
                                         	(/ (fix (* (cadr p) 1000)) 1000.)
                                         	(caddr p)
                                   	) ;_  list
                                  	) ;_  lambda
                        	) ;_  function
                        	l
                	) ;_  mapcar
                	(function (lambda (a B) (>= (car a) (car B))))
       	) ;_  vl-sort
    	x2 (caar l)
    	y1 (cadar l)
    	y2 y1
  ) ;_  setq
  (while l
(setq a2 (car l))
(if (<= (cadr a2) y1)
	(setq y1 (cadr a2))
	(if (> (cadr a2) y2)
 	(setq y2 (cadr a2))
	)
)
(setq a  (fix (caar l))
     	a1 (list (car l))
     	l  (cdr l)
) ;_  setq
(while (and l (= (fix (caar l)) a))
	(setq a2 (car l))
	(if (<= (cadr a2) y1)
 	(setq y1 (cadr a2))
 	(if (> (cadr a2) y2)
  	(setq y2 (cadr a2))
 	) ;_  if
	) ;_  if
	(setq a1 (cons (car l) (vl-remove a2 a1))
      	l  (cdr l)
	) ;_  setq
) ;_  while
(foreach a a1 (setq lp (cons a lp)))
  ) ;_  while
  (setq x1 (caar lp)
    	a  (list (/ (+ x1 x2) 2) (/ (+ y1 y2) 2))
    	a1 (distance a (list x1 y1))
    	ma (+ (car a) a1 a1)
    	mi (- (car a) a1)
    	s  (list (list ma (cadr a) 0)
             	(list mi (+ (cadr a) a1 a1) 0)
             	(list (- (car a) a1) (- (cadr a) a1 a1) 0)
       	) ;_  list
    	l  (list (cons x2 (cons a (cons (+ a1 a1) s))))
    	ma (1- ma)
    	mi (1+ mi)
  ) ;_  setq
  (while lp
(setq p  (car lp)
     	lp (cdr lp)
     	l1 nil
) ;_  setq
(while l
	(setq tr (car l)
      	l  (cdr l)
	) ;_  setq
	(cond ((< (car tr) (car p)) (setq l2 (cons (cdddr tr) l2)))
      	((< (distance p (cadr tr)) (caddr tr))
       	(setq tr (cdddr tr)
             	a1 (car tr)
             	a2 (cadr tr)
             	a3 (caddr tr)
             	l1 (cons (list (+ (car a1) (car a2)) (+ (cadr a1) (cadr a2)) a1 a2)
                      	(cons (list (+ (car a2) (car a3)) (+ (cadr a2) (cadr a3)) a2 a3)
                            	(cons (list (+ (car a3) (car a1)) (+ (cadr a3) (cadr a1)) a3 a1) l1)
                      	) ;_  cons
                	) ;_  cons
       	) ;_  setq
      	)
      	(t (setq l3 (cons tr l3)))
	) ;_  cond
) ;_  while
(setq l  l3
     	l3 nil
     	l1 (vl-sort l1
                 	(function (lambda (a B)
                            	(if (= (car a) (car B))
                             	(<= (cadr a) (cadr B))
                             	(< (car a) (car B))
                            	) ;_  if
                           	) ;_  lambda
                 	) ;_  function
        	) ;_  vl-sort
) ;_  setq
(while l1
	(if (and (= (caar l1) (caadr l1)) (= (cadar l1) (cadadr l1)))
 	(setq l1 (cddr l1))
 	(setq l  (cons (eea-data-triangle p (cddar l1)) l)
       	l1 (cdr l1)
 	) ;_  setq
	) ;_  if
) ;_  while
(if (and (< (setq i (1- i)) 1) (< i2 100))
	(progn
 	(setvar
  	"MODEMACRO"
  	(strcat
   	" 	"
   	(itoa (setq i2 (1+ i2)))
   	" %	"
   	(substr
    	"||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"
    	1
    	i2
   	) ;_  substr
   	(substr "..." 1 (- 100 i2))
  	) ;_  strcat
 	) ;_  setvar
 	(setq i i1)
	) ;_  progn
) ;_  if
  ) ;_  while
  (foreach a l (setq l2 (cons (cdddr a) l2)))
  (setq l2 (vl-remove-if-not
        	(function (lambda (a) (and (< mi (caadr a) ma) (< mi (caaddr a) ma))))
        	l2
       	) ;_  vl-remove-if
  ) ;_  setq
  (foreach a l2
(entmake (list (cons 0 "3DFACE")
              	(cons 10 (car a))
              	(cons 11 (car a))
              	(cons 12 (cadr a))
              	(cons 13 (caddr a))
        	) ;_  list
) ;_  entmake
  ) ;_  foreach
 ) ;_  progn
) ;_  if
(setvar "MODEMACRO" "")
(princ (strcat "\n " (rtos (/ (- (car (_VL-TIMES)) ti) 1000.) 2 4) " secs."))
(princ)
) ;_  defun
(defun eea-data-triangle (P1 l / A A1 P2 P3 P4 S)
;;*********************************************************
;;
;; Written by  ElpanovEvgeniy
;; 17.10.2008
;; Calculation of the centre of a circle and circle radius
;; for program triangulate
;;
;; (eea-data-triangle (getpoint)(list(getpoint)(getpoint)))
;;*********************************************************
(setq p2 (car l)
  	p3 (cadr l)
  	p4 (list (car p3) (cadr p3))
) ;_  setq
(if (not (zerop (setq s (sin (setq a (- (angle p2 p4) (angle p2 p1)))))))
 (progn (setq a  (polar p4
                    	(+ -1.570796326794896 (angle p4 p1) a)
                    	(setq a1 (/ (distance p1 p4) s 2.))
             	) ;_  polar
          	a1 (abs a1)
    	) ;_  setq
    	(list (+ (car a) a1) a a1 p1 p2 p3)
 ) ;_  progn
) ;_  if
) ;_  defun

  • 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

Vì các Text cao độ của bạn chỉ có giá trị cao độ nhưng thực tế cao độ trong bản vẽ của các text này bằng 0, chương trình vẽ lưới lấy giá trị cao độ các text từ mã DXF là 10 chứ không phải mã 1 nên bạn phải dùng lisp sau để số hóa cho các text của bạn trước khi dùng :

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(Defun Sohoatext ( / picset Idx Entt PLis)

(If (Setq picset (Ssget (List (Cons 0 "*TEXT"))))

(Progn

(Setq Idx 0)

(Repeat (SSlength picset)

(Setq Entt (Entget (SSname picset Idx)))

(If (And (Or (Equal (Cdr (Assoc 0 Entt)) "TEXT") ;;Doi tuong la TEXT

(Equal (Cdr (Assoc 0 Entt)) "MTEXT") ;;Hoac doi tuong la MTEXT

)

(Numberp (Read (Cdr (Assoc 1 Entt)))) ;;La TEXT dang chu so

)

(Progn

(Setq Pnt (List (Cadr (Assoc 10 Entt)) (Caddr (Assoc 10 Entt)) (AtoF (Cdr (Assoc 1 Entt)))))

(Setq Entt (Subst (Cons 10 Pnt) (Assoc 10 Entt) Entt))

(Entmod Entt)

)

)

(Setq Idx (+ Idx 1))

)

)

)

(Princ)

)

Rất cảm ơn bạn.Mình đã làm được.Bạn có thể bổ sung them tính năng như sau trong lisp vẽ lưới tam giác cho mình được không:

1. Chọn text mẫu và quét, lisp sẽ lọc các đối tượng như text mẫu để vẽ lưới tam giác

2. Bổ sung tính năng đặt tên cho layer lưới tam giác khi tạo ra để quản lý ( ở đây bạn mặc định sẵn, mình có khi tạo 2 lưới tam giác trong cùng 1 bản vẽ nên càn tính năng nà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

Rất cảm ơn bạn.Mình đã làm được.Bạn có thể bổ sung them tính năng như sau trong lisp vẽ lưới tam giác cho mình được không:

1. Chọn text mẫu và quét, lisp sẽ lọc các đối tượng như text mẫu để vẽ lưới tam giác

2. Bổ sung tính năng đặt tên cho layer lưới tam giác khi tạo ra để quản lý ( ở đây bạn mặc định sẵn, mình có khi tạo 2 lưới tam giác trong cùng 1 bản vẽ nên càn tính năng này)

Hai vđ này bạn tự làm cũng đc.

1-Đầu tiên bạn chọn các đt mình muốn bằng cách nào đó. Sau đó gọi lệnh DH, khi đc hỏi select objects: hảy chọn "p" là đc

2- Sau khi layer đc tạo bạn hãy đổi tên nó thành tên bạn muốn

Bạn cũng có thể sd cái lisp của người Nga do bạn thanhduan2407 đưa lên, mình thấy nó chạy cũng tương tự nhau, kể cả thời gian

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

Hai vđ này bạn tự làm cũng đc.

1-Đầu tiên bạn chọn các đt mình muốn bằng cách nào đó. Sau đó gọi lệnh DH, khi đc hỏi select objects: hảy chọn "p" là đc

2- Sau khi layer đc tạo bạn hãy đổi tên nó thành tên bạn muốn

Bạn cũng có thể sd cái lisp của người Nga do bạn thanhduan2407 đưa lên, mình thấy nó chạy cũng tương tự nhau, kể cả thời gian

Tks bác, em sẽ chế lại lisp của bạn thanhduan theo hướng trên.Lúc trước em không đọc kỹ bài của bạn thanhduan nen không nghĩ là chế lại đượ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

Chế là 1 kiểu nhưng bạn đọc phải hiểu thuật toán của nó. Các tạo đường đồng mức chắc bạn cũng biết thuật toán chứ? Chỉ là Line nối 2 điểm có cùng độ cao trong tam giác thôi. Xác định điểm có độ cao cho trước trên 1 đoạn thẳng thì đơn giản rồi. Mình bận ko có thời gian nên ko chế nó thành của mình, với lại mình cũng ko làm kỹ thuật nên rảnh lúc nào thấy thích thì nghịch ngợm thôi. Chờ kết quả của các bác. Khi nào mà:

- Phun điểm (point, text,...) lên bản vẽ

- Lập mạng lưới tam giác Delaunay (Mô hình TIN)

- Vẽ đường đồng mức với các thông số trong bảng (bước nhảy độ cao, layer, màu sắc các đường đồng mức....)

- Vẽ mặt cắt, tính toán khối lượng đào đắp (lưới ô vuông, lưới tam giác....)

 

P/s: Nếu phum điểm vào bản vẽ (dạng text chẳng hạn), các bác nghĩ thêm cách là với độ cao bao nhiêu đến bao nhiêu (chẵn) thì cho nó vào 1 màu, sau này tạo đường đồng mức nhìn cũng dễ nhận biết. Hiiii. Tuy nhiên em thấy có rất nhiều phần mềm làm việc đó rồi. Em nghĩ đây chỉ là bài toán để cho sinh viên nghiên cứu và làm đề tài khoa học hay tốt nghiệp thôi. Làm lại cái đã có thì tốn thời gian lắm. Cuộc đời có mấy tí. :D

Chúc các bác sức khoẻ

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

Chém ké tí : Lisp tạo lưới tam giác của bác EEA quá nổi tiếng ^^ Theo e được biết thì LeeMac vẫn thua Elpanov vài bậc ^^. Bác nào rảnh rỗi vào đọc các lession hướng dẫn của Elpanove về đệ quy, khá chi tiết và hay, có khi lại áp dụng được trong các trường hợp của 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

Sao Ketxu ko đưa đường link nói về lession hướng dẫn của Elpanove về đệ quy. Hiii. Code đơn giản nhưng thuật toán thì quá hay. Mình biết có 4 cách tạo lưới tam giác nhưng phương pháp Plane-sweep là nhanh nhất. Phương pháp quét mặt phẳng. Tưởng tượng có 1 đường thẳng quét từ trên xuống dưới, nó di chuyển đến đến đâu thì tạo được tam giác Delaunay đến đó. Thuật toán rất hay và đã được bạn mình viết trên VB. Còn khủng hơn nữa là các thầy giáo trường Mỏ Địa Chất nhảy vào làm khiến tốc độ nó khủng khiếp luôn. Nhưng mình ko có code của các thầy.

Nhưng lisp của Elpanove mình cũng thấy tuyệt vời rồi. Hiii

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 hầu hết các chương trình san nền đều sử dụng phương pháp tạo lưới tam giác như mọi người đang làm, 1 trường hợp duy nhất mình thấy hình như sử dụng 1 phương pháp khác nguyên lý giống bạn thanhduan2407 nêu trên là Scape của Nataca (có post trong diễn đàn). Hắn sử dụng tia quét gì gì đó khá là hay và nhanh

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 tạo được lưới tam giác rồi

Bây giờ mình muốn tìm giao điểm của 1 xline đến lưới tam giác đó thì phải làm sao tiếp đây, nghĩ mãi vẫn không ra cách

Hoặc đơn giản là tìm cao độ Z của 1 điểm biết (x,y) cũng được

ai có ý tưởng gì giúp mình vớ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 tạo lưới tam giác bằng cách gì vậy (tay hay code), và giờ muốn tìm giao bằng cách gì (code hay tay).

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

Lưới tam giác thì mình tạo bằng vba lưới tam giác mình tạo được ở đây là 1 polymesh mình muốn tìm giao bằng lập trình

Ai có thể giúp mình vớ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

Lưới tam giác thì mình tạo bằng vba lưới tam giác mình tạo được ở đây là 1 polymesh mình muốn tìm giao bằng lập trình

Ai có thể giúp mình với

Khi có tam giác tức là có 3 điểm x,y,z tìm mặt phẳng Ax+By+Cz=0 chứa 3 điểm này sau khi có A B C và x y của điểm giao thay vào sẽ tìm được z cao độ của điểm đó:

(setq zns (- z2 (/ (+ (* (- (* (- y1 y2) (- z3 z2)) (* (- y3 y2) (- z1 z2)))

(- xns x2)) (* (- (* (- z1 z2) (- x3 x2)) (* (- z3 z2) (- x1 x2))) (- yns y2)))

(- (* (- x1 x2) (- y3 y2)) (* (- x3 x2) (- y1 y2))))))

Lưu ý phải xét điểm thuộc mặt phẳng trướ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

Lưới tam giác thì mình tạo bằng vba lưới tam giác mình tạo được ở đây là 1 polymesh mình muốn tìm giao bằng lập trình

Ai có thể giúp mình với

 

Ở đây bạn tìm giao theo phương trình mặt phẳng với phương trình đường thẳng:

 

Phương trình mặt phẳng qua 3 điểm p1, p2, p3 (x,y,z) là:

- Vector chỉ phương V1 (A1,B1,C1) = Vector(p1,p2) * Vector(p2,p3), ở đây phép nhân là tích có hướng của 2 vector

- Và đi qua 1 điểm M0, có thể chọn là 1 trong 3 điểm p1, p2 or p3

 

Phương trình đường thẳng qua 2 điểm m1,m2

- Vector chỉ phương V2 (A, B, C) = (m2.x-m1.x, m2.y - m1.y, m2.z - m1.z)

- Đi qua 1 điểm M1, chọn đầu hoặc cuối đều được

 

Tính tham số t của điểm giao thuộc đường thẳng:

t = -(A1 * M1.X + B1 * M1.Y + C1 * M1.Z) / Tích vô hướng của V1

--> điểm giao (M1.X + A * t, M1.Y + B * t, M1.Z + C * t)

 

+ Tích vô hướng của 2 vector V1 và V2 = V.A1 * V.A2 + V.B1 * V.B2 +V.C1 * V.C2

+ Tích có hướng của 2 vector V1 và V2 là 1 vector V (A,B,C) phần này lằng nhằng nên bạn tham khảo hình học 12 sẽ rõ (trang 77) hoặc đầy đủ hơn ở đây.

 

Ngoài ra có thể add thư viện của acad.net hoặc thư viện DirectX của microsoft đã có sẵn các hàm và cấu trúc dữ liệu về hình học giải tích, hoàn toàn yên tâm về độ chính xác.

 

Đứa bạn nó nhờ mình phần tạo tam giác Delauney nhưng mình chưa có thời gian để làm nữa ...

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ổ sung thêm một ý kiến nhỏ để chủ topic có nhiều lựa chọn.

Ở đây có 2 vấn đề:

1). Có rất nhiều tam giác >> phải xác định điểm pt thuộc tam giác nào, sau đó mới tìm giao điểm của đường thẳng đứng qua pt với mặt phẳng (p1,p2,p3).

- Dùng tổng 3 góc: Goc(p1,pt,p2)+Goc(p2,pt,p3)+Goc(p3,pt,p1)=2pi

- Dùng tổng 3 diện tích S(p1,pt,p2)+S(p2,pt,p3)+S(p3,pt,p1)=S(p1,p2,p3)

- v.v...

2). Xác định giao điểm của đt và mp.

Cũng có nhiều cách. Nếu dùng lisp thì có thể sử dụng chỉ 1 hàm là có kết quả:

(cal "ilp(p1,p2,q1,q2,q3)") ;Giao cua dt(p1,p2) va mp(q1,q2,q3).

  • 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

@vstran: Nếu đã có dữ liệu polymesh rồi thì cứ duyệt qua từng tam giác 1 mà tìm giao thôi.

Bổ sung thêm: Nếu tích vô hướng của V1 và V2 = 0 thì không có giao.

 

Bạn có thể duyệt tam giác từ trên xuống hay ngược lại đều được. Trong trường hợp số lượng quá nhiều thì phải dùng thuật toán khác.

 

@Doan Van Ha:Lisp được bố Cad hỗ trợ tối đa nhỉ, chỉ một dòng là ra. Sẵn đây cho mình hỏi thêm cái đoạn này:

Lisp có hàm nào tính tọa độ mới khi xoay 1 điểm quanh 1 đường thẳng khô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

@vstran: Nếu đã có dữ liệu polymesh rồi thì cứ duyệt qua từng tam giác 1 mà tìm giao thôi.

Bổ sung thêm: Nếu tích vô hướng của V1 và V2 = 0 thì không có giao.

 

Bạn có thể duyệt tam giác từ trên xuống hay ngược lại đều được. Trong trường hợp số lượng quá nhiều thì phải dùng thuật toán khác.

 

@Doan Van Ha:Lisp được bố Cad hỗ trợ tối đa nhỉ, chỉ một dòng là ra. Sẵn đây cho mình hỏi thêm cái đoạn này:

Lisp có hàm nào tính tọa độ mới khi xoay 1 điểm quanh 1 đường thẳng không?

Đỏ: bạn có thuật toán gì hay để đẩy nhanh tốc độ không, chứ cứ kiểm tra pt với từng bộ 3 p1,p2,p3 thì chậm lắm? Tôi chưa nghĩ ra.

Xanh: có. Hàm lấy tọa độ điểm q bằng cách quay điểm p quanh trục p1p2 một góc ang.

(setq q (cal "rot(p,q1,q2,ang)"))

Bạn nghiên cứu các hàm của lệnh CAL sẽ thấy còn nhiều hàm hình học khá hay nữa. Tầm đâu cỡ 20 hàm. Nếu bạn chưa có thì tôi sẽ tặng.

  • 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

Để tăng tốc mình sử dụng phương pháp tìm kiếm nhị phân, trong đó mình chỉ tìm theo 1/2 số tập điểm, nếu không có thì tìm tiếp 1/2 * 1/2, --> 1/2 * 1/2 * 1/2 .... 2^(-n). Đến một giới hạn nào đó thì tiếp tục cho 1/2 còn lại. Triển khai code thì còn tùy vào ngôn ngữ.

 

Ngoài ra mình sử dụng threading để chia nhỏ tập điểm và xử lý song song, nhưng cái nay chỉ có trên các ngôn gữ cấp cao thôi.

  • 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

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

×