Đến nội dung


Hình ảnh

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


  • Please log in to reply
52 replies to this topic

#41 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 26 July 2012 - 11:51 AM

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

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#42 vstran

vstran

    biết zoom

  • Members
  • Pip
  • 16 Bài viết
Điểm đánh giá: 9 (bình thường)

Đã gửi 06 September 2013 - 03:52 PM

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.


  • 0

#43 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 06 September 2013 - 10:52 PM

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


  • 0
Clear sky!

MF Rock collection.

#44 vstran

vstran

    biết zoom

  • Members
  • Pip
  • 16 Bài viết
Điểm đánh giá: 9 (bình thường)

Đã gửi 08 September 2013 - 05:07 PM

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


  • 0

#45 doanduyhung

doanduyhung

    biết vẽ spline

  • Members
  • PipPip
  • 90 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 08 September 2013 - 10:30 PM

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.
  • 0

#46 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 09 September 2013 - 02:27 PM

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


  • 0
Clear sky!

MF Rock collection.

#47 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 09 September 2013 - 02:58 PM

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


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#48 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 09 September 2013 - 11:08 PM

@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?


  • 0
Clear sky!

MF Rock collection.

#49 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 10 September 2013 - 06:58 AM

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


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#50 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 10 September 2013 - 08:43 AM

Để 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.


  • 1
Clear sky!

MF Rock collection.

#51 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 10 September 2013 - 09:19 AM

Để 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.

Bạn có thể giải thích rõ hơn không? Khái niệm "tìm kiếm nhị phân" mình đã từng đọc đâu đó nhưng chưa hiểu. Trong phương pháp tìm 1/2 rồi 1/4... xong lại tìm tiếp 1/2 rồi 1/4... thì cơ sở nào để chứng minh sự tìm kiếm này là ít hơn tìm trong cả tập?

Quá trình viết lisp mình gặp rất nhiều bài toán kiểu này nhưng hầu như chưa có phương án tốt nhất để tăng tốc nên rất cần giải thuật này hoặc một giải thuật nào đó khác cũng ưu việt.


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#52 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 10 September 2013 - 09:29 AM

Thuật toán này mình đã học qua và áp dụng nhiều, phần chứng minh lý thuyết thì lâu quá rồi, chả biết sách vứt chỗ nào. Bạn xem thử ở wiki thôi.

 

Lisp không dùng threading được thì không thể nhanh trong trường hợp này được rồi. Threading là các tiểu trình, chia thành nhiều tiểu trình nhỏ, và tất cả các tiểu trình này cùng chạy song song với nhau với một tập dữ liệu nhỏ hơn nên tổng thể sẽ chạy hơn rất nhiều. Công đoạn cuối là đan các kết quả lại với nhau.


  • 1
Clear sky!

MF Rock collection.

#53 Đoàn Yến

Đoàn Yến

    Chưa sử dụng CAD

  • Members
  • Pip
  • 1 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 29 March 2016 - 04:22 PM

mọi người ơi có thể cho mình hỏi.. thông tin về mạng lưới delaunay bao gồm tác giả nghiên cứu vào thời gian nào và mục đích là gì? và ưu điểm, khuyết điểm của mạng lưới delaunay là gì... mọi ng giúp mình đc k ạ?


  • 0