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

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

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

Vì khi bác click nút Apply, thực chất là Quickcalc đã gửi 1 string bằng giá trị của phép tính ra ngoài commandline. Getreal chờ nhập kết quả, nó phát hiện ra string giá trị ở trên commandline rồi, nhưng không có ai enter để gán kết quả đấy cho nó -> vla-sendcommand để send key Enter. Ở chỗ này có tí ngược thứ tự thực hiện, nhưng nếu để getreal lên trước, nó sẽ đòi user phải nhập xong rồi mới thao tác tiếp theo ^^

  • 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ôi có 2 đường Spline phẳng nằm trong không gian 3D. Làm sao để:

1). Xác định khoảng cách min giữa chúng (bằng cách chỉ ra 2 điểm thuộc 2 đường)?

2). Xác định khoảng cách thẳng đứng giữa chúng nếu tồn tại (bằng cách chỉ ra 2 điểm thuộc 2 đường mà đường nối 2 điểm này vuông góc với xoy)?

Ai biết xin chỉ giùm giải thuật để thực hiện, thanks!

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ôi có 2 đường Spline phẳng nằm trong không gian 3D. Làm sao để: 1). Xác định khoảng cách min giữa chúng (bằng cách chỉ ra 2 điểm thuộc 2 đường)? 2). Xác định khoảng cách thẳng đứng giữa chúng nếu tồn tại (bằng cách chỉ ra 2 điểm thuộc 2 đường mà đường nối 2 điểm này vuông góc với xoy)? Ai biết xin chỉ giùm giải thuật để thực hiện, thanks!

Hề hề hề,

1/- Vấn dề của bác có nhẽ là phải định nghĩa cái khoảng cách min ấy đã bác ạ.

Với các line thì đã có nhưng với các spline thì chửa rõ nó ra sao. Nếu có cái định nghĩa này thì có thể sẽ không quá khó để làm đâu.

Bác có thể nói qua về cái định nghĩa này không ạ????

Hề hề hề,,,

2/- Chưa nghĩ ra thuật giải bá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

Hề hề hề,

1/- Vấn dề của bác có nhẽ là phải định nghĩa cái khoảng cách min ấy đã bác ạ.

Với các line thì đã có nhưng với các spline thì chửa rõ nó ra sao. Nếu có cái định nghĩa này thì có thể sẽ không quá khó để làm đâu.

Bác có thể nói qua về cái định nghĩa này không ạ????

Hề hề hề,,,

2/- Chưa nghĩ ra thuật giải bác ạ.

Tức là tìm 2 điểm thuộc 2 Spline sao cho khoảng cách của chúng là nhỏ nhấ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ức là tìm 2 điểm thuộc 2 Spline sao cho khoảng cách của chúng là nhỏ nhất.

Giả sử như 2 Spline có đoạn nào đó song song và giả sử rằng khoảng cách giữa đoạn // đó là MIN thì sẽ có vô số nghiệm rồi

Tỉ như 2 đoạn thẳng // trong không gian vậy.

 

Bài toán này có thể sẽ chẳng có thuật giải nào được đâu

Vì mỗi cặp đoạn thẳng trong không gian -> ta xác định được khoảng cách giữa chúng

mà Cặp Spline lại được cấu thành từ rất nhiều cặp Line 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

Giả sử như 2 Spline có đoạn nào đó song song và giả sử rằng khoảng cách giữa đoạn // đó là MIN thì sẽ có vô số nghiệm rồi

Tỉ như 2 đoạn thẳng // trong không gian vậy.

 

Bài toán này có thể sẽ chẳng có thuật giải nào được đâu

Vì mỗi cặp đoạn thẳng trong không gian -> ta xác định được khoảng cách giữa chúng

mà Cặp Spline lại được cấu thành từ rất nhiều cặp Line như vậy

1). Một bài toán thì có thể: vô nghiệm, có hữu hạn nghiệm, có vô số nghiệm. Nhiệm vụ của chúng ta là phải phân ra để biện luận cho từng trường hợp, ví dụ với bài toán 2 Spline, chúng ta phải phân ra:

- Có vô số nghiệm: khi đó tôi chỉ cần chỉ ra 1 nghiệm là được, hoặc bỏ qua.

- Có hữu hạn nghiệm: chỉ ra tất cả các nghiệm đó, hoặc chỉ cần 1 nghiệm. Đây là điều tôi cần.

- Vô nghiệm: với bài toán này thì không xãy ra.

2). Không thể có giải thuật hay chưa thể tìm ra giải thuật là 1 vấn đề khó, vì chúng ta chưa chứng minh được điều "không 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

......

2). Không thể có giải thuật hay chưa thể tìm ra giải thuật là 1 vấn đề khó, vì chúng ta chưa chứng minh được điều "không thể" đó.

Chính xác là không có thuật giải.

Một đường Spline có vô số điểm cần xác định khoảng cách từ điểm đến SPLINE kia. Ứng với từng điểm đó -> xác định khoảng cách từ điểm đến SPLINE kia.

Không xác định được số bước lặp cho vòng lặp => Không có thuật giải.

Có thể là chia SPLINE thành nhiều LINE, nhưng nếu chia như vậy thì bài toán không còn chính xác nữa

 

=> KHÔNG CÓ THUẬT GIẢ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

Tạm thời bác có thể thực hiện theo phương pháp gần đúng (e mới nghĩ th, chưa chắc đúng) :sai số là S

1 - Tìm cặp điểm ngắn nhất gồm 1 control point của SPLine 1 và điểm gần nhất với điểm đó của SPline 2, gọi khoảng cách là D, 2 điểm lần lượt là p1, p2 thuộc control point thứ n

2 - Kiểm tra KC các điểm cách p1 1 khoảng delta1 (bước nhảy) từ control thứ n-1 đến n+1 đến P2 (gọi là list d1)

- Nếu không phát hiện điểm nào trong list d1 có khoảng cách nhỏ hơn D và sai số nhỏ hơn S thì chuyển sang bước 3

- Nếu phát hiện tồn tại khoảng cách min nhỏ hơn D thì gán khoảng cách này bằng D, tiếp tục lặp lại bước 2, với 2 điểm mút giới hạn là 2 điểm trước - sau của điểm gần hơn mới tìm thấy, delta = delta1 / hệ số giảm delta (hệ số > 1)

- Dừng lại khi sai số khoảng cách nhỏ hơn S

3 - Làm ngược lại từ phía p2 về Spl1, dừng lại khi sai số khoảng cách nhỏ hơn S

4 - So sánh giữa 2 khoảng cách min

 

P/S : vẫn mông lung lắm ^^

Có khi bác rã nó ra thành n đoạn thẳng nhỏ, rồi kiểm tra cũng được. Code nhanh hơn, chờ lâu 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

Giả sử như 2 Spline có đoạn nào đó song song và giả sử rằng khoảng cách giữa đoạn // đó là MIN thì sẽ có vô số nghiệm rồi

Tỉ như 2 đoạn thẳng // trong không gian vậy.

 

Bài toán này có thể sẽ chẳng có thuật giải nào được đâu

Vì mỗi cặp đoạn thẳng trong không gian -> ta xác định được khoảng cách giữa chúng

mà Cặp Spline lại được cấu thành từ rất nhiều cặp Line như vậy

Hề hề hề,

Có thể chính cái gợi ý này của bác Tue_NV là một thuật giải chăng????

Này nhé:

1/- Chia các Spline thành các đoạn thẳng đủ nhỏ sao cho nó có thể đại diện cho Spline đó.

2/- Lặp qua các đoạn thẳng của Spline thứ nhất với các đoạn thẳng của spline thứ hai để tìm khoảng cách giữa các cặp đoạn thẳng rồi cho vào một list gồm độ dài và tọa độ các đỉnh của đoạn thẳng ngắn nhất này..

3/- Sắp xếp lại cái list này để có khoảng cách nhỏ nhất, và từ đó có được các điểm cần tìm.

 

Hề hề hề,

Cách này tuy chả cho được chính xác cái bác cần nhưng cũng gần đạt với một sai số cho phép. Tuy nhiên có nhẽ sẽ khá mất thời gian nếu như các Spline đủ dài và phức tạp.

Việc chuyển Spline thành các polyline thì hình như trên diễn đà đã có lisp của bác SSG thì phải. Như vậy chỉ còn việc làm cái lisp xác định khoảng cách giữa hai đoạn thẳng bất kỳ nữa là Ok. Hy vọng nói đúng với ý muốn của bác ĐoanVanha.

 

Hề hề 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

Tạm thời bác có thể thực hiện theo phương pháp gần đúng (e mới nghĩ th, chưa chắc đúng) :sai số là S

1 - Tìm cặp điểm ngắn nhất gồm 1 control point của SPLine 1 và điểm gần nhất với điểm đó của SPline 2, gọi khoảng cách là D, 2 điểm lần lượt là p1, p2 thuộc control point thứ n

2 - Kiểm tra KC các điểm cách p1 1 khoảng delta1 (bước nhảy) từ control thứ n-1 đến n+1 đến P2 (gọi là list d1)

- Nếu không phát hiện điểm nào trong list d1 có khoảng cách nhỏ hơn D và sai số nhỏ hơn S thì chuyển sang bước 3

- Nếu phát hiện tồn tại khoảng cách min nhỏ hơn D thì gán khoảng cách này bằng D, tiếp tục lặp lại bước 2, với 2 điểm mút giới hạn là 2 điểm trước - sau của điểm gần hơn mới tìm thấy, delta = delta1 / hệ số giảm delta (hệ số > 1)

- Dừng lại khi sai số khoảng cách nhỏ hơn S

3 - Làm ngược lại từ phía p2 về Spl1, dừng lại khi sai số khoảng cách nhỏ hơn S

4 - So sánh giữa 2 khoảng cách min

 

P/S : vẫn mông lung lắm ^^

Có khi bác rã nó ra thành n đoạn thẳng nhỏ, rồi kiểm tra cũng được. Code nhanh hơn, chờ lâu hơn

Hề hề hề,

Cách này ngó bộ không ổn về lý thuyết bác Ketxu à.

Bởi chưng từ một điểm có thể tìm dược khoảng cách nhỏ nhất tới một curve, nhưng đó chưa chắc đã là khoảng cách giữa hai curve được.

Cho dù bác có thể dịch chuyển dần cái point trên curve theo hai phía để xác định khoảng cách nhỏ nhất nhưng có nhẽ nó vẫn chưa phải là khoảng cách giũa hai curve.

 

Nếu bác thay đổi lại thành tìm khoảng cách giữa véctơ tiếp tuyến tại một điểm trên curve1 tới curve2 thì có nhẽ sẽ cho kết quả hợp lý hơn về mặt lý thuyết. Tất nhiên sau đó sẽ phải loại các trường hợp mà chân đường vuông góc chung giữa hai tiếp tuyến nằm cách quá xa so với đường curve.

 

@ Bác Tue_NV: Việc tìm chính xác thì quả thật không đơn giản, nhưng trong kỹ thuật có thể cho phép các cách làm gần đúng với sai số được kiểm soát bác ạ. Nên chăng ta sẽ giải bài toán theo cái hướng này để có thể đáp ứng được phần nào cái nhu cầu trước mắt chứ chả nhẽ bó giò hay sao bác nhể?????

 

@Bác DoanVanHa: Nên chăng bác cho thêm cái giới hạn về sai số cho phép để người dùng dễ dàng lựa chọn giải pháp 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

Cám ơn các bác Tue_NV, PTB và Ketxu!

Chắc là không thể tìm chính xác được, nên phải đi theo con đường tính gần đúng với 1 sai số cho phép thôi. Điều này cũng chấp nhận được.

Cám ơn mọi người đã quan tâm!

Thân thươ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

Chắc là không thể tìm chính xác được, nên phải đi theo con đường tính gần đúng với 1 sai số cho phép thôi. Điều này cũng chấp nhận được.

Cám ơn mọi người đã quan tâm!

Thân thương!

Mình kg đủ sức để viết ra giải thuật nhưng có thể gợi ý một ý tưởng để các bạn tham khảo :

- căn cứ vào sp1, dựng hình trụ xoắn bán kính r đủ nhỏ có tim là đường sp1.

- tìm giao của hình trụ xoắn vừa dựng với sp2. Nếu chưa có giao thì tăng r lên, ngược lại nếu có nhiều giao thì giảm r xuống

- nghiệm chính là số giao tìm ra là nhỏ nhất. Chính xác khi sp2 tiếp xúc với hình trụ xoắ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

Mình kg đủ sức để viết ra giải thuật nhưng có thể gợi ý một ý tưởng để các bạn tham khảo :

- căn cứ vào sp1, dựng hình trụ xoắn bán kính r đủ nhỏ có tim là đường sp1.

- tìm giao của hình trụ xoắn vừa dựng với sp2. Nếu chưa có giao thì tăng r lên, ngược lại nếu có nhiều giao thì giảm r xuống

- nghiệm chính là số giao tìm ra là nhỏ nhất. Chính xác khi sp2 tiếp xúc với hình trụ xoắn

Hề hề hề,

Bác trungngamy ơi, thế nhưng liệu khi bác tạo một cái hình trụ xoán khác quanh SP2 với bán kính mà bác vừa tìm được thì nó có tiếp xúc hay cắt cái thằng SP1 không nhể????

Ấy mới là cái khoản khó chịu bác ạ....

Hề hề 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

@ bác Bình : tiaij vì theo e hiểu ý bác ĐVH k yêu cầu tìm khoảng cách 2 curve, mà là tìm 2 điểm giữa 2 curve sao cho khoảng cách giữa chúng là ngắn nhất ^^ Mà e ngờ rằng spline bị chi phối bởi các control point + bugle. Vậy ta làm cái j đó gắn với control point là hay hơn ^^

Tức là tìm 2 điểm thuộc 2 Spline sao cho khoảng cách của chúng là nhỏ nhất.

  • 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

Hề hề hề,

Bác trungngamy ơi, thế nhưng liệu khi bác tạo một cái hình trụ xoán khác quanh SP2 với bán kính mà bác vừa tìm được thì nó có tiếp xúc hay cắt cái thằng SP1 không nhể????

Ấy mới là cái khoản khó chịu bác ạ....

Hề hề hề,....

Mình nghĩ làm ngược lại cũng đúng nhưng mình kg đủ kiến thức và thời gian để chứng minh cho bạn thấy.

Hay bạn có thể giúp chứng minh hay ví dụ cụ thể làm ngược lại nó kg tiếp xúc hay kg cắt nhau.

 

Nhân vđ này mình nghĩ đó là những bài toán rất hay trong mặt phẳng cũng như trong kg gian. Kg hiểu TH của bạn này có gặp nhiều đối tượng hay kg. Nếu gặp nhiều đối tượng như vậy trong dữ liệu thì bài toán khá phức tạp.

 

Theo mình nghĩ, để giải quyết TH có nhiều đối tượng thì phải có một giải thuật để loại trừ những phần trên đg cong có khoảng cách khá lớn trước. Chỉ xét một đoạn nhỏ trên đó chắc chắn có khoảng cách min 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

Có thể tìm được giao điểm của một mặt và 1 Spline phẳng nằm trong 3D không nhỉ?

Tôi đang gặp bài toán thực tế này mà chưa tìm ra hướng giải quyết. Các bô lão lisp nếu biết thì chỉ hướng đi giùm, còn nếu khẳng định được là "không thể được" thì cũng xin cho ý kiến để tôi tìm hướng đi khác.

Thanks!

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ó thể tìm được giao điểm của một mặt và 1 Spline phẳng nằm trong 3D không nhỉ?

Tôi đang gặp bài toán thực tế này mà chưa tìm ra hướng giải quyết. Các bô lão lisp nếu biết thì chỉ hướng đi giùm, còn nếu khẳng định được là "không thể được" thì cũng xin cho ý kiến để tôi tìm hướng đi khác.

Thanks!

 

Biển học rộng lớn, kiến thức có hạn. Câu hỏi của bạn hơi làm khó mọi người, kg biết có cao thủ nào có thể trả lời chắc "như đinh đóng cột" cho bạn kg.

Riêng mình có thể đóng góp cho bạn như vậy :

- Do kiến thức lisp của mình cũng có hạn, kiến thức hình học cũng đã quên hết rồi và lĩnh vực của mình cũng ít liên quan nên có nhiều vđ mình kg nắm chắc

+ Khái niệm spline phẳng của bạn kg hiểu có phải các điểm trên spline đồng phẳng kg. Nếu đúng vậy thì phải tìm giao 2 mp trước, mặt phẳng chứa spline và mp cần xét sẽ đc 1 đg thẳng, sau đó tìm giao của spline và đt đó. Lisp có tìm đc giao của 2 mặt phẳng kg và giao của spline và dt kg thì để các bạn khác trả lời giúp.

+ TH spline kg đồng phẳng, thì phải tìm cách xđ khoảng spline ngắn nhất khi cái spline chui qua mp, có nghĩa là đoạn ngắn nhất trên spline giao mp (lúc này xem như nó đồng phẳng). Sau đó làm tương tự như trên.

Đó là suy nghĩ của riêng mình, một người kém lisp và cả HH kg gian. Còn với các cao thủ khác, có thể sẽ có câu trả lời cụ thể và hữu dụng hơn.

Chúc bạn thành cô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

Cám ơn bạn đã quan tâm! Thực ra đôi lúc có những bài toán thực tế nó liên quan tới những vấn đề rắc rối về hình học và về lisp, trường hợp của tôi cũng như thế. Nhắc lại 2 khái niệm để các bạn rõ:

Mặt: là mặt bất kỳ trong không gian chứ không hẳn là mặt phẳng, mà có thể là mặt cầu, mặt nón... Trong bài toán của tôi thì mặt được tạo thành do 1 hình đa giác có 1 đỉnh trượt trên 1 parabol, mà Parabol này nằm trong 3D.

Spline phẳng: là Spline đồng phẳng. Trong bài toán của tôi thì nó là 1 Parabol nằm trong 3D.

Bài toán của tôi có thể tóm tắt lại đơn giản hơn là: tìm giao của Parabol1 (nằm trong 3D) và mặt được tạo thành bởi 1 đa giác có 1 đỉnh trượt theo Parabol2.

Thân thươ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

Cám ơn bạn đã quan tâm! Thực ra đôi lúc có những bài toán thực tế nó liên quan tới những vấn đề rắc rối về hình học và về lisp, trường hợp của tôi cũng như thế. Nhắc lại 2 khái niệm để các bạn rõ:

Mặt: là mặt bất kỳ trong không gian chứ không hẳn là mặt phẳng, mà có thể là mặt cầu, mặt nón... Trong bài toán của tôi thì mặt được tạo thành do 1 hình đa giác có 1 đỉnh trượt trên 1 parabol, mà Parabol này nằm trong 3D.

Spline phẳng: là Spline đồng phẳng. Trong bài toán của tôi thì nó là 1 Parabol nằm trong 3D.

Bài toán của tôi có thể tóm tắt lại đơn giản hơn là: tìm giao của Parabol1 (nằm trong 3D) và mặt được tạo thành bởi 1 đa giác có 1 đỉnh trượt theo Parabol2.

Thân thương!

Hề hề hề,

Chào bác ĐoanVanHa,

bài toán của bác nghe ra có vẻ phức tạp nhưng theo mình bác có thể gỡ được nó tuy hơi vất vả.

Trước hết hãy giải bài toán đơn giản hơn là tìm giao điểm của parabol phẳng cho trước với các mặt của một đa diện cho trước (chứ không phải đa giác vì theo mình hiểu thì nói đa giác nghĩa là nói đến hình học phẳng) .

Như vậy thực chất bài toán sẽ trở về là tìm giao tuyến của hai mặt phẳng và tìm giao điểm của 1 đường thẳng và một parabol trong mặt phẳng.

Với bài toán tìm giao tuyến của hai mặt phẳng thì bằng phương pháp sử dụng hình học giải tich trong không gian bác sẽ dễ dàng có được giao tuyến của hai mặt phẳng khi bác có được phưoing trình của hai mặt phẳng này.

Từ phương trình của đường thẳng và phương trình của parabol bác sẽ có được kết quả cần tìm.

Sau đó với một phép lặp qua từng điểm trên parabol thứ hai bác sẽ lần lượt có các đa diện và ứng dụng bái toán trên bác sẽ giải được các kết quả mà bác cần.

Chúc bác thành công.

 

Nhân đây xin gửi bác một đoạn lisp dùng để xác định khoảng cách giữa hai điểm trên hai spline bất kỳ với định nghĩa rằng khoảng cách giữa hai điểm bất kỳ trên hai spline là khoảng cách giữa hai tiếp tuyến tại hai diểm đó của mỗi một spline.

Mình viết lisp này dựa trên ý tưởng của bác Ketxu khi tìm khoảng cách giữa một điểm trên spline1 với các điểm trên Spline2.

Nếu bài toán lần trước của bác giải theo hướng này thì có thể sử dụng lisp này. Còn nếu giải theo hướng chia spline thành các phân đoạn thẳng đủ nhỏ thì cần chỉnh sửa lại lisp này một chút là dùng được. Hy vọng nó sẽ giúp được cho bác để giải quyết trọn vẹn bài toán đã đặt ra.


(defun c:kcol (/ p1 p11 p2 p21 obj1 obj2 v1 v2 x1 y1 z1 x2 y2 z2 a1 a2 a3 b1 b2 b3 t1 t2 ps pe d lsp)
(vl-load-com)
(command "undo" "be")
(setq p1 (cadr (setq ent1 (entsel "\n Chon diem tren spline thu nhat")))
       obj1 (vlax-ename->vla-object (car ent1))
       v1 (vlax-curve-getfirstderiv obj1 (vlax-curve-getparamatpoint obj1 (setq p1 (vlax-curve-getclosestpointto obj1 p1))))
       p2 (cadr (setq ent2 (entsel "\n Chon diem tren spline thu hai")))
       obj2 (vlax-ename->vla-object (car ent2))
       v2 (vlax-curve-getfirstderiv obj2 (vlax-curve-getparamatpoint obj2 (setq p2 (vlax-curve-getclosestpointto obj2 p2))))
  	x1 (car p1)
  	y1 (cadr p1)
  	z1 (caddr p1)
  	x2 (car p2)
  	y2 (cadr p2)
  	z2 (caddr p2)
  	a1 (car v1)
  	a2 (cadr v1)
  	a3 (caddr v1)
  	b1 (car v2)
  	b2 (cadr v2)
  	b3 (caddr v2)
  	t2 (/ (- (* (+ (* a1 b1) (* a2 b2) (* a3 b3)) (+ (* a1 (- x2 x1)) (* a2 (- y2 y1)) (* a3 (- z2 z1))))
                 (* (+ (* a1 a1) (* a2 a2) (* a3 a3)) (+ (* b1 (- x2 x1)) (* b2 (- y2 y1)) (* b3 (- z2 z1)))))
          	(- (* (+ (* a1 a1) (* a2 a2) (* a3 a3)) (+ (* b1 b1) (* b2 b2) (* b3 b3)))
                 (expt (+ (* a1 b1) (* a2 b2) (* a3 b3)) 2)))
  	t1 (/ (+ (* t2 (+ (* a1 b1) (* a2 b2) (* a3 b3))) (+ (* a1 (- x2 x1)) (* a2 (- y2 y1)) (* a3 (- z2 z1))))
          	(+ (expt a1 2) (expt a2 2) (expt a3 2)))
  	ps (list (+ x1 (* a1 t1)) (+ y1 (* a2 t1)) (+ z1 (* a3 t1)))
  	p11 (list (+ x1 (* a1 100)) (+ y1 (* a2 100)) (+ z1 (* a3 100)))
  	pe (list (+ x2 (* b1 t2)) (+ y2 (* b2 t2)) (+ z2 (* b3 t2)))
  	p21 (list (+ x2 (* b1 100)) (+ y2 (* b2 100)) (+ z2 (* b3 100)))
  	d (distance ps pe)
  	lsp (list d ps pe)
)
lsp
(command "line" p1 p11 "" )
(command "line" p2 p21 "" )
(command "line" ps pe "" )
(command "undo" "e")
(princ)
)

Chúc bác khỏe và vui.

  • Vote tăng 2

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

Thật hết sức cám ơn bác Hề hề hề!

1). Bác quá công phu với bài toán tìm 2 điểm thuộc 2 spline. Có điều, lisp này tính khoảng cách giữa 2 tiếp tuyến tại 2 điểm của 2 spline, còn tôi muốn tìm 2 điểm thuộc 2 spline sao cho khoảng cách 2 điểm này là nhỏ nhất. Và tôi đã tìm được theo hướng gần đúng với sai số tuỳ chọn (Bác có thể nghé qua mục đố vui mà tôi vừa post lên thì sẽ thấy có ý tưởng trong đó). Tất nhiên, sửa từ lisp của bác cũng đi đến đích vậy.

2). Bài toán tìm giao của Parabol và Mặt mà tôi đưa ra hơi khác với ý tưởng của bác. Nếu mặt là 1 đa diện thì cũng không quá khó, đằng này mặt ở đây là 1 mặt cong bác ạ. Mặt này do 1 đa giác có 1 đỉnh trượt trên 1 parabol tạo nên, tỉ như ta kéo 1 cái móc áo đang treo trên dây phơi dọc theo dây thì tạo ra mặt này vậy. Tôi cũng đang nghĩ đến hướng chia Parabol thành từng đoạn thẳng, lúc đó mặt này sẽ là các mặt phẳng ghép thành, nhưng chưa thích phương án này lắm.

Không biết bác có ý tưởng nào hay hơn để cùng nhau thảo luận?

Một lần nữa, cám ơn bác Hề hề hề!

Thân thươ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

Thật hết sức cám ơn bác Hề hề hề!

1). Bác quá công phu với bài toán tìm 2 điểm thuộc 2 spline. Có điều, lisp này tính khoảng cách giữa 2 tiếp tuyến tại 2 điểm của 2 spline, còn tôi muốn tìm 2 điểm thuộc 2 spline sao cho khoảng cách 2 điểm này là nhỏ nhất. Và tôi đã tìm được theo hướng gần đúng với sai số tuỳ chọn (Bác có thể nghé qua mục đố vui mà tôi vừa post lên thì sẽ thấy có ý tưởng trong đó). Tất nhiên, sửa từ lisp của bác cũng đi đến đích vậy.

2). Bài toán tìm giao của Parabol và Mặt mà tôi đưa ra hơi khác với ý tưởng của bác. Nếu mặt là 1 đa diện thì cũng không quá khó, đằng này mặt ở đây là 1 mặt cong bác ạ. Mặt này do 1 đa giác có 1 đỉnh trượt trên 1 parabol tạo nên, tỉ như ta kéo 1 cái móc áo đang treo trên dây phơi dọc theo dây thì tạo ra mặt này vậy. Tôi cũng đang nghĩ đến hướng chia Parabol thành từng đoạn thẳng, lúc đó mặt này sẽ là các mặt phẳng ghép thành, nhưng chưa thích phương án này lắm.

Không biết bác có ý tưởng nào hay hơn để cùng nhau thảo luận?

Một lần nữa, cám ơn bác Hề hề hề!

Thân thương!

Chào bác ĐoanvanHa,

1/ Chúc mừng bác đã hoàn thành được cái đề bài lần trước. Mình tin rằng bác có thể hoàn thành tốt cái bài toán lần này bác ạ.

2/- Vê bài toán mới này mình có vài suy nghĩ như sau:

Thứ nhất, theo như bác mô tả thì cái mặt mà bác cần được tạo thành từ việc Sweep một profile đa giác theo một part là parabol. Do vậy nếu có giao điểm của một parabol thứ hai (curve) khác với cái mặt này thì ắt hẳn cái giao điểm đó phải nằm trên một cạnh của đa giác profile khi đa giác này nằm ở vị trí sweep tương ứng.

Thứ hai: Do parabol thứ hai là phẳng nên bác hoàn toàn có khả năng xác định được phương trình của cái mặt phẳng này. Ứng với mỗi vị trí trên parabol đường dẫn của bề mặt đã cho, bác đêu có thể xác định được phương trình của mặt phẳng chứa đa giác profile của nó bởi vì bác có vecto tiếp tuyến của parabol đường dẫn sẽ chính là vectơ pháp tuyến của mặt phẳng chứa profile. (Ấy là nếu bác sweep vuông góc với đường dẫn, còn trong trường hợp bác sweep không vuông góc thì bác cũng phải xác định được góc sweep này mới có thể tạo hình bề mặt chứ bác nhể. và như thế thì việc xác định mặt phẳng chứ profile cũng chả khó lắm....)

Từ hai phương trình mặt phẳng này, bác dễ dàng tìm được phương trình của giao tuyến của chúng Và thế là tìm được giao điểm của giao tuyến này với Parabol thứ hai. Cuối cùng là bác phải check cái giao điểm này có nẳm trên cạnh đa giác profile hay không.mà thôi.

Thứ ba: Có thể sử dụng thuật toán của bác Ketxu để nhích dần cái điểm trên parabol đường dẫn theo một phía cho tới khi khoảng cách từ giao điểm tìm được tới cạnh của đa giác proflie đạt tới giá trị đủ nhỏ và đó chính là điểm cần tìm bác ạ.

Hề hề hề,

Nghĩ thì là như vậy nhưng các bước thực hiện nó có nhẽ cũng hơi nhiêu khê vì việc bác phải xác định lại các polyline tạo thành đa giác profile trong mỗi mặt phẳng chứa nó. Việc này có nhẽ phải dùng tới các hàm trans và hệ tọa độ người dùng mà mình thì chưa thạo về cái hàm này.

 

Vài điều thiển nghĩ, đúng sai mong bác không chấp.

Hề hề hề,'

Chúc bác luôn vui vẻ.

  • 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

Chà! Cách này có lẽ hay đây! Tôi đang tìm cách làm việc với mặt sweep, bác thì theo profile. Hoá ra có nhiều phương án quá. Tôi sẽ cố thử cả 2 để so sánh cái nào nhanh hơn sẽ chọn, chứ mấy bài toán này mà chọn sai số quá nhỏ thì ngồi uống trà mệt nghỉ bác nhỉ.

(Nhưng tôi sẽ không lấy control point, vì như thế thì khó chính xác, bởi 1 spline dài nhưng đôi lúc chỉ có 3 control point mà thôi).

Bác đã cho tôi cần câu mà không cho cá! Tôi cũng thích vậy. Nhưng khi vực sâu quá thì nhớ cho cá chứ đừng cho câu, bác nhé!

Cám ơn bác Hề hề hề thêm lần nữa!

Thân thươ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

Có thể tìm được giao điểm của một mặt và 1 Spline phẳng nằm trong 3D không nhỉ?

Tôi đang gặp bài toán thực tế này mà chưa tìm ra hướng giải quyết. Các bô lão lisp nếu biết thì chỉ hướng đi giùm, còn nếu khẳng định được là "không thể được" thì cũng xin cho ý kiến để tôi tìm hướng đi khác.

Thanks!

 

Đầu tiên tìm đường thẳng giao giữa 2 mặt phẳng, sau đó tìm giao giữa đường thẳng đó với SPline (cái này nhờ CAD tính)

 

Tôi đã xây dựng một thư viện dll về hình học trong không gian gần như đầy đủ với các đối tượng như điểm, đường thẳng, mặt phẳng, đường tròn là ellipse. Tuy nhiên thư viện chỉ hỗ trợ lập trình ngoài, lisp thì tôi không rõ.

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

Đầu tiên tìm đường thẳng giao giữa 2 mặt phẳng, sau đó tìm giao giữa đường thẳng đó với SPline (cái này nhờ CAD tính)

Tôi đã xây dựng một thư viện dll về hình học trong không gian gần như đầy đủ với các đối tượng như điểm, đường thẳng, mặt phẳng, đường tròn là ellipse. Tuy nhiên thư viện chỉ hỗ trợ lập trình ngoài, lisp thì tôi không rõ.

Cám ơn bạn đã quan tâm! Tiếc là tôi không có kiến thức về dll. Với lại, MẶT mà tôi muốn nói là mặt bất kỳ (phẳng, cầu, trụ...) chứ không chỉ là mặt phẳng.

Thân thươ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

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


×