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

Hỏi: Cách nội suy tâm đường tròn 3D

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

Trước tiên mình xin gửi lời chào tới các thành viên 4rum. Mình là thành viên mới và mình có một vướng mắc trong công việc mong mọi người giúp mỉnh.

 

Vấn đề của mình là cần phải nội suy tâm trường tròn từ n điểm cho trước (trong mặt phẳng và trong không gian) một cách nhanh nhất (như là dùng autolisp)

 

Bình thường mình phải vẽ đường tròn qua lần lượt qua 3 điểm một rồi lại vẽ tiếp đường tròn qua 3 tâm của các đường tròn đã vẽ. Sau cùng lấy được tâm nội suy tương đối của n điểm đó. Nhưng cách này rất mất thời gian.

 

Mong các bro giú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
Trước tiên mình xin gửi lời chào tới các thành viên 4rum. Mình là thành viên mới và mình có một vướng mắc trong công việc mong mọi người giúp mỉnh.

 

Vấn đề của mình là cần phải nội suy tâm trường tròn từ n điểm cho trước (trong mặt phẳng và trong không gian) một cách nhanh nhất (như là dùng autolisp)

 

Bình thường mình phải vẽ đường tròn qua lần lượt qua 3 điểm một rồi lại vẽ tiếp đường tròn qua 3 tâm của các đường tròn đã vẽ. Sau cùng lấy được tâm nội suy tương đối của n điểm đó. Nhưng cách này rất mất thời gian.

 

Mong các bro giúp đỡ

Chào cả nhà!

Có thể không tồn tại đường tròn từ n điểm cho trước, nhưng chắc chắn tồn tại 1 đường tròn qua 3 điểm cho truớc.

Đây là bài toán hình học lớp 7 : tâm của đường tròn ngoại tiếp tam giác (giao của 2 đuờng trung trực).

 

Nội suy từ n điểm :

- chia n điểm thành các tập ba điểm

- tìm tâm của các tập ba điểm này.

- nội suy tương đối của n/3 các tâm này (quy luật ?!) :undecided:

Bác nào có thời gian viết LISP giùm bạn duyminh86 nào !

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
Trước tiên mình xin gửi lời chào tới các thành viên 4rum. Mình là thành viên mới và mình có một vướng mắc trong công việc mong mọi người giúp mỉnh.

 

Vấn đề của mình là cần phải nội suy tâm trường tròn từ n điểm cho trước (trong mặt phẳng và trong không gian) một cách nhanh nhất (như là dùng autolisp)

 

Bình thường mình phải vẽ đường tròn qua lần lượt qua 3 điểm một rồi lại vẽ tiếp đường tròn qua 3 tâm của các đường tròn đã vẽ. Sau cùng lấy được tâm nội suy tương đối của n điểm đó. Nhưng cách này rất mất thời gian.

 

Mong các bro giúp đỡ

Hề hề hề,

Không hiểu ý bác này ra sao cả. Nếu có n điểm sẽ có Tổ hợp chập 3 các nhóm 3 điểm trong n điểm đó. Vậy phải vẽ cả chừng đó vòng tròn hay sao???

Sau đó lại tổ hợp chập 3 của các tâm này ư??? Và cứ thề đến khi nào hỉ???

Tốt nhất là bác phải post một cái hình cụ thể về cái phương pháp mà bác đã làm lên để mọi người ngâm cứu mới đượ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
Hề hề hề,

Không hiểu ý bác này ra sao cả. Nếu có n điểm sẽ có Tổ hợp chập 3 các nhóm 3 điểm trong n điểm đó. Vậy phải vẽ cả chừng đó vòng tròn hay sao???

Sau đó lại tổ hợp chập 3 của các tâm này ư??? Và cứ thề đến khi nào hỉ???

Tốt nhất là bác phải post một cái hình cụ thể về cái phương pháp mà bác đã làm lên để mọi người ngâm cứu mới được.

Hề hề hề....

Xin nói thêm : số đường tròn đi qua 3 điểm trong 30 điểm cho trước đã là : C(3,30)=(30! / 3! x 27!)=4060

Nếu cho trước chừng 100 điểm thì nhiều lắm. Đề nghị chủ 2pic nói lại cho 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
Hề hề hề,

Không hiểu ý bác này ra sao cả. Nếu có n điểm sẽ có Tổ hợp chập 3 các nhóm 3 điểm trong n điểm đó. Vậy phải vẽ cả chừng đó vòng tròn hay sao???

Sau đó lại tổ hợp chập 3 của các tâm này ư??? Và cứ thề đến khi nào hỉ???

Tốt nhất là bác phải post một cái hình cụ thể về cái phương pháp mà bác đã làm lên để mọi người ngâm cứu mới được.

Hề hề hề....

Hê hề Chào Bác!

Ý của gia_bach là:

Ví dụ có 30 điểm thì chia 30 điểm này thành 10 cặp mỗi cặp 3 điểm. lấy tâm của từng cặp này như vậy là từ 30 điểm còn lại 10 điểm. làm tiếp đến khi còn 1 điểm. Nhưng em thấy tư duy như vậy là bị sai rồi 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
Hê hề Chào Bác!

Ý của gia_bach là:

Ví dụ có 30 điểm thì chia 30 điểm này thành 10 cặp mỗi cặp 3 điểm. lấy tâm của từng cặp này như vậy là từ 30 điểm còn lại 10 điểm. làm tiếp đến khi còn 1 điểm. Nhưng em thấy tư duy như vậy là bị sai rồi hê hê.

...........

Nội suy từ n điểm :

- chia n điểm thành các tập ba điểm

- tìm tâm của các tập ba điểm này.

- nội suy tương đối của n/3 các tâm này (quy luật ?!) :undecided:

Bác nào có thời gian viết LISP giùm bạn duyminh86 nào !

Hề hề ....

Chúc các bác cuối tuần zui zẻ ! :wub:

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ào cả nhà!

Có thể không tồn tại đường tròn từ n điểm cho trước, nhưng chắc chắn tồn tại 1 đường tròn qua 3 điểm cho truớc.

Đây là bài toán hình học lớp 7 : tâm của đường tròn ngoại tiếp tam giác (giao của 2 đuờng trung trực).

 

Nội suy từ n điểm :

- chia n điểm thành các tập ba điểm

- tìm tâm của các tập ba điểm này.

- nội suy tương đối của n/3 các tâm này (quy luật ?!) :undecided:

Bác nào có thời gian viết LISP giùm bạn duyminh86 nào !

 

 

Hề hề hề,

Không hiểu ý bác này ra sao cả. Nếu có n điểm sẽ có Tổ hợp chập 3 các nhóm 3 điểm trong n điểm đó. Vậy phải vẽ cả chừng đó vòng tròn hay sao???

Sau đó lại tổ hợp chập 3 của các tâm này ư??? Và cứ thề đến khi nào hỉ???

Tốt nhất là bác phải post một cái hình cụ thể về cái phương pháp mà bác đã làm lên để mọi người ngâm cứu mới được.

Hề hề hề....

 

 

Xin nói thêm : số đường tròn đi qua 3 điểm trong 30 điểm cho trước đã là : C(3,30)=(30! / 3! x 27!)=4060

Nếu cho trước chừng 100 điểm thì nhiều lắm. Đề nghị chủ 2pic nói lại cho rõ ý.

 

 

Hê hề Chào Bác!

Ý của gia_bach là:

Ví dụ có 30 điểm thì chia 30 điểm này thành 10 cặp mỗi cặp 3 điểm. lấy tâm của từng cặp này như vậy là từ 30 điểm còn lại 10 điểm. làm tiếp đến khi còn 1 điểm. Nhưng em thấy tư duy như vậy là bị sai rồi hê hê.

 

 

Theo lý thuyết đúng là mình phải vẽ Tổ hợp chập 3 của n điểm và cứ thế ... :wub: . Nhưng mình chỉ vẽ một ít các đường tròn thôi :) tương đối thôi mà. Thế nên mình mới hỏi có Brô nào có phương pháp nào hay không 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
Theo lý thuyết đúng là mình phải vẽ Tổ hợp chập 3 của n điểm và cứ thế ... :wub: . Nhưng mình chỉ vẽ một ít các đường tròn thôi :undecided: tương đối thôi mà. Thế nên mình mới hỏi có Brô nào có phương pháp nào hay không thì giúp mình với.

Chịu, nếu có người muốn giúp bạn đi chăng nữa thì không giúp được đâu, vì không biết QUY LUẬT dựng hình là như thế nào cả tất yếu sẽ không bao giờ làm đượ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ịu, nếu có người muốn giúp bạn đi chăng nữa thì không giúp được đâu, vì không biết QUY LUẬT dựng hình là như thế nào cả tất yếu sẽ không bao giờ làm được. ?

 

Có phải mình già rồi hay sao mà đọc không hiểu nổi ý của chủ topic. Có cái hình minh hoạ thì hay quá.

 

Có phải là tìm tâm đường tròn đi qua tâm của 3 đường tròn khác. Mỗi đường tròn khác được tạo từ 3 điểm bất kỳ cho truớ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
Theo lý thuyết đúng là mình phải vẽ Tổ hợp chập 3 của n điểm và cứ thế ... :wub: . Nhưng mình chỉ vẽ một ít các đường tròn thôi :undecided: tương đối thôi mà. Thế nên mình mới hỏi có Brô nào có phương pháp nào hay không thì giúp mình với.

Hề hề hề,

Chào bạn ........

Quả thực là bài toán bạn đặt ra nó phiêu phiêu làm sao ý.

Này nhé:

1/- nếu quả thật là n điểm đó đã nằm trên đường tròn thì chỉ cần xác định tâm của một vòng tròn duy nhất đi qua ba điểm bất kỳ trong số các điểm đó là OK.

2/- Nếu n điểm này không nằm trên cùng một vòng tròn thì sẽ có biết bao nhiêu cái vòng tròn gần đúng đi qua gần gần các điểm đó, tùy theo cái độ gần gần mà bạn sẽ chọn. Vậy thì cái tiêu chí gần gần ấy nó phải ra sao chứ??? tỷ như là có diện tích lớn nhất và khoảng cách từ các điểm đó tới dường tròn không vượt qua một giá trị nào đó ???? Hay là ngược lại ??? Hay là cái đường tròn dựng được phải chứa nhiều điểm nhất trong tập hợp n điểm đó chẳng hạn....?????

Túm lại là cái tiêu chí bạn không chịu đưa ra thì chả ai biết bạn cần cái gì. Ngay cả khi có tiêu chí rồi cũng còn chõm chọe mệt nghỉ nữa là .....

Bạn hãy chịu khó ngâm cứu vấn đề của bạn cho ky kỹ một chút và đặt ra các tiêu chí tương đối hữu hạn thì may ra mọi người còn có thể tý toáy được. Bằng không thì TH ... U .... UA..... THUA bạn ạ.

Bạn nói vòng tròn trong không gian nghĩa là sao nhỉ??? có phải ý bạn nói đến một mặt cầu???. Vì vòng tròn chỉ là khái niệm về hình học phẳng. Nó có thể nẳm xiêu vẹo một tí nhưng nó phải nằm trên một mặt phẳng bạn ạ....

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

Chào bạn ........

Quả thực là bài toán bạn đặt ra nó phiêu phiêu làm sao ý.

Này nhé:

1/- nếu quả thật là n điểm đó đã nằm trên đường tròn thì chỉ cần xác định tâm của một vòng tròn duy nhất đi qua ba điểm bất kỳ trong số các điểm đó là OK.

2/- Nếu n điểm này không nằm trên cùng một vòng tròn thì sẽ có biết bao nhiêu cái vòng tròn gần đúng đi qua gần gần các điểm đó, tùy theo cái độ gần gần mà bạn sẽ chọn. Vậy thì cái tiêu chí gần gần ấy nó phải ra sao chứ??? tỷ như là có diện tích lớn nhất và khoảng cách từ các điểm đó tới dường tròn không vượt qua một giá trị nào đó ???? Hay là ngược lại ??? Hay là cái đường tròn dựng được phải chứa nhiều điểm nhất trong tập hợp n điểm đó chẳng hạn....?????

Túm lại là cái tiêu chí bạn không chịu đưa ra thì chả ai biết bạn cần cái gì. Ngay cả khi có tiêu chí rồi cũng còn chõm chọe mệt nghỉ nữa là .....

Bạn hãy chịu khó ngâm cứu vấn đề của bạn cho ky kỹ một chút và đặt ra các tiêu chí tương đối hữu hạn thì may ra mọi người còn có thể tý toáy được. Bằng không thì TH ... U .... UA..... THUA bạn ạ.

Bạn nói vòng tròn trong không gian nghĩa là sao nhỉ??? có phải ý bạn nói đến một mặt cầu???. Vì vòng tròn chỉ là khái niệm về hình học phẳng. Nó có thể nẳm xiêu vẹo một tí nhưng nó phải nằm trên một mặt phẳng bạn ạ....

Hề hề hề,...

 

 

Cám ơn bạn đã quan tâm tới Topic của mình. Mình xin nói rõ hơn vềvươgng mắc của mình để các bạn giúp đỡ.

 

1. Trước tiên là xét trên mặt phẳng, mình có một số điểm màu vàng như trong hình:

c1.jpg

 

mình muốn tìm tìm ra tâm của hình tròn màu tím, tâm đó có tính chất là điểm có tổng khoảng cách tới các điểm màu vàng là nhỏ nhất (có thể làm theo phương pháp bình phương tối thiểu với i là khoảng cách âm dương từ điểm màu vàng tới đường tròn, i<0 khi điểm màu vàng nằm trong đường tròn, 0< i khi điểm màu vàng nằm ngoài đường tròn )

 

 

2. Thứ 2 xét trong không gian, mình có vật hình trụ như trong hình vẽ:

c2.jpg

 

mình có một số điểm màu vàng nằm ko cùng trong mặt phẳng tiết diện cắt hình trụ theo phương vuông góc với trục hình trụ. Mình muốn tìm tâm của đường tròn nằm trong mặt phẳng vuông góc đó (hoặc nằm trong mặt phẳng tạo với mặt phẳng vuông góc đó 1 góc <1độ theo mọi hướng) sao cho mặt phẳng đó có tổng khoảng cách tới các điểm màu vàng là nhỏ nhất, và trên mặt phẳng đó tìm tâm đường tròn có tổng khoảng cách tới các điểm màu vàng là nhỏ nhất

(làm theo phương pháp bình phương tối thiểu thì tốt quá)

 

mình nói hơi bị lằng nhằng, có bạn nào hiểu thì giúp mình với nhé. Còn chưa rõ chỗ nào mong các bạn chỉ giú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
Cám ơn bạn đã quan tâm tới Topic của mình. Mình xin nói rõ hơn vềvươgng mắc của mình để các bạn giúp đỡ.

 

1. Trước tiên là xét trên mặt phẳng, mình có một số điểm màu vàng như trong hình:

c1.jpg

 

mình muốn tìm tìm ra tâm của hình tròn màu tím, tâm đó có tính chất là điểm có tổng khoảng cách tới các điểm màu vàng là nhỏ nhất (có thể làm theo phương pháp bình phương tối thiểu với i là khoảng cách âm dương từ điểm màu vàng tới đường tròn, i

2. Thứ 2 xét trong không gian, mình có vật hình trụ như trong hình vẽ:

c2.jpg

 

mình có một số điểm màu vàng nằm ko cùng trong mặt phẳng tiết diện cắt hình trụ theo phương vuông góc với trục hình trụ. Mình muốn tìm tâm của đường tròn nằm trong mặt phẳng vuông góc đó (hoặc nằm trong mặt phẳng tạo với mặt phẳng vuông góc đó 1 góc

(làm theo phương pháp bình phương tối thiểu thì tốt quá)

 

mình nói hơi bị lằng nhằng, có bạn nào hiểu thì giúp mình với nhé. Còn chưa rõ chỗ nào mong các bạn chỉ giúp.

Hề hề hề,

Vậy là cái tiêu chí gần gần đã có. Vấn đề là cái thuật toán để tìm ra cái thỏa tiêu chí đó. Quả thực không đơn giản. Mình thử đưa một phương án bạn xem có đồng ý không nhé.

1/- Chọn ba điểm bất kỳ trong tập hợp n điểm .

2/- Dựng vòng tròn qua ba điểm đó.

3/- Tính giá trị tổng bình phương khoảng cách từ các điểm còn lại tới vòng tròn.

4/- So sánh các giá trị này để có được giá trị nhỏ nhất.

5/- Lấy vòng tròn tương ứng với giá trị này làm kết quả.

 

Phương án này gặp phải một vấn đề khá hóc là số bước lặp sẽ rất lớn nếu như cái số n điểm của bạn không nhỏ. Và khi đó thì dễ treo máy lắm....

Phương án này cũng không cho kết quả đúng như bạn muốn vì có thể có những vòng tròn chỉ đi qua 1, 2 hoặc thậm chí chẳng qua điểm nào trong tập hợp n điểm đó lại có thể có bình phương tổng khoảng cách từ các điểm tới nó nhỏ hơn cái vòng tròn kết quả mà bạn chọn.

Hề hề hề, tuy vậy nhưng mình thấy nó khả dĩ có cơ sở hơn là việc đi dựng một vòng tròn vu vơ để tính bạn ạ.....

 

Nếu bạn Ok thì mình có thể bắt tay vào thử làm xem sao.

Hề hề hề.

Còn cái bài toán không gian của bạn thì mình chưa nghĩ ra giải pháp cụ thể. ...

  • 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ề,
Vậy là cái tiêu chí gần gần đã có. Vấn đề là cái thuật toán để tìm ra cái thỏa tiêu chí đó. Quả thực không đơn giản. Mình thử đưa một phương án bạn xem có đồng ý không nhé.
1/- Chọn ba điểm bất kỳ trong tập hợp n điểm .
2/- Dựng vòng tròn qua ba điểm đó.
3/- Tính giá trị tổng bình phương khoảng cách từ các điểm còn lại tới vòng tròn.
4/- So sánh các giá trị này để có được giá trị nhỏ nhất.
5/- Lấy vòng tròn tương ứng với giá trị này làm kết quả.

Phương án này gặp phải một vấn đề khá hóc là số bước lặp sẽ rất lớn nếu như cái số n điểm của bạn không nhỏ. Và khi đó thì dễ treo máy lắm....
Phương án này cũng không cho kết quả đúng như bạn muốn vì có thể có những vòng tròn chỉ đi qua 1, 2 hoặc thậm chí chẳng qua điểm nào trong tập hợp n điểm đó lại có thể có bình phương tổng khoảng cách từ các điểm tới nó nhỏ hơn cái vòng tròn kết quả mà bạn chọn.
Hề hề hề, tuy vậy nhưng mình thấy nó khả dĩ có cơ sở hơn là việc đi dựng một vòng tròn vu vơ để tính bạn ạ.....

Nếu bạn Ok thì mình có thể bắt tay vào thử làm xem sao.
Hề hề hề.
Còn cái bài toán không gian của bạn thì mình chưa nghĩ ra giải pháp cụ thể. ...



Mình nghĩ phương pháp đó của bản cũng hay, bạn giúp mình nhé.

bạn nào có phương pháp nào khác thì giúp mình nhé, đặc biệt là giải bài toán trong không gian. Công việc đòi hỏi nên mình khá là cầ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
Mình nghĩ phương pháp đó của bản cũng hay, bạn giúp mình nhé, mình ko biết lập trình, ko biết autolisp :undecided: giúp mình phát nhé.

 

bạn nào có phương pháp nào khác thì giúp mình nhé, đặc biệt là giải bài toán trong không gian. Công việc đòi hỏi nên mình khá là cần.

thanks

Bài toán của Bạn thuộc loại thử dần.ở đây Mình thử 3 lần. Lần nhất deltaX=10, deltaR=1.0 lần thứ hai deltaX=1, deltaR=0.1 và lần thứ ba

deltaX=0.1, deltaR=0.01.

Bạn đánh từ dòng command tamVT và nhấn enter.

Nếu Bạn up lên 1 mẫu (ví dụ) để Mình chạy thử thì tốt. Bài toán này nếu dùng ngôn ngữ khác thì sẽ chạy nhanh hơn là LISP.

Bài toán không gian thì phức tạp hơn.Dịp khác vậy!

Hy vọng sẽ có ích cho Bạn!

 

http://www.cadviet.com/upfiles/3/tamvt.lsp

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 nghĩ phương pháp đó của bản cũng hay, bạn giúp mình nhé, mình ko biết lập trình, ko biết autolisp :undecided: giúp mình phát nhé.

 

bạn nào có phương pháp nào khác thì giúp mình nhé, đặc biệt là giải bài toán trong không gian. Công việc đòi hỏi nên mình khá là cần.

thanks

Chào bạn duyminh86,

Bạn dùng thử lisp này coi sao nhé. Nó được làm dựa trên cái cách mà mình đã nói. Bạn lưu ý trước khi chạy lisp này, bạn phải gõ lệnh locpoint để nó loại bỏ các điểm trùng nhau trong tập chọn của bạn đã nhé.

Mình không hiểu vì sao khi đưa nó vào làm hàm con trong lisp nội suy tâm thì nó lại làm cho lisp này chạy sai nữa. Vì thế đành tạm để nó thành lệnh riêng và bạn phải chạy hai lần vậy. Mình sẽ cố tìm cách khắc phục sự bất tiện này sau nhé.

Hy vọng nó đáp ứng phần nào yêu cầu của bạn.

(defun c:nst ( )
(command "undo" "be")
(setq olc (getvar "cecolor"))
(setq lscir (list))
(setq ssp (ssget (list (cons 0 "point"))))
;;;;;;;;;;;(locpoint ssp)
(setq lst (acet-ss-to-list ssp) )   
(foreach e lst
     (setq lst1 (vl-remove e lst)              
             p (cdr (assoc 10 (entget e)))              
     )
     (foreach e1 lst1      
           (setq lst2 (vl-remove e1 lst1)                    
                   p1 (cdr (assoc 10 (entget e1)))                   
           )
           (foreach e2 lst2         
                  (setq p2 (cdr (assoc 10 (entget e2))))
                  (setvar "cecolor" "3")
                  (command "circle" "3p" p p1 p2 )
                  (setq ent (entlast))
                  (setq cir (vlax-ename->vla-object ent))
                  (setq tkc 0)
                  (foreach e lst
                         (setq pt (cdr (assoc 10 (entget e))))
                         (setq pc (vlax-curve-getClosestPointTo cir pt ))
                         (setq kc (distance pt pc))
                         (setq tkc (+ tkc (expt kc 2)))
                  )
                  (setq lscir (append lscir (list (list tkc ent))))                                    
           )          
     ) 
)
(setq lscir (vl-sort lscir '(lambda (x y) ((setq mau (car lscir))
(foreach cir lscir
         (if (/= (cadr cir) (cadr mau))
            (command "erase" (cadr cir) "")
         )
)

(setvar "cecolor" olc)
(command "undo" "e")
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:locpoint (ssp / lstpt i n e p)
(setq lstpt (list))
(if ssp
   (progn
        (setq i 0 
                n (sslength ssp)
        )
        (while (               (setq e (ssname ssp i))
              (setq p (cdr (assoc 10 (entget e))))
              (if (not (member p lstpt))
                  (setq lstpt (append lstpt (list p)))
                  (command "erase" e "")
              )
              (setq i (1+ i))
        )
    )
)
ssp
)

 

@All: Nhờ các bác xem giùm vì sao nó lại bị lỗi như vậy. Khi chạy riêng thành hai bước thì mọi thứ OK cả mới kỳ chứ. Mình cho rằng có lẽ là cái hàm (command "erase" ..... ) nó chỉ xóa đối tượng mà không làm cho đối tượng mất hẳn khỏi bộ chọn. Vì thế khi đưa vào làm hàm con trong lisp thì nó gây ra lỗi. Cách khắc phục thì mình nghĩ có thể chơi kiểu chuối là làm một phát chọn lại nữa sau khi xài hàm con locpoint. Các bác có gợi ý gì giải quyết cái chỗ hóc xương này 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
Chào bạn duyminh86,

Mình đã sửa lại để chỉ cần một lần nhập lệnh nst là xong. Bạn xài thử nhé. Cách khắc phục như mình đã nói ở bài trước hơi củ chuối nhưng dùng tạm đã nhé.

Hy vọng nó đáp ứng phần nào yêu cầu của bạn.

(defun c:nst ( )
(command "undo" "be")
(setq olc (getvar "cecolor"))
(setq lscir (list))
(setq ssp (ssget (list (cons 0 "point"))))
(setq p1 (car (acet-geom-ss-extents ssp 0))
       p2 (cadr (acet-geom-ss-extents ssp 0))
)
(locpoint ssp)
(setq ssp1 (ssget "c" p1 p2 (list (cons 0 "point"))))
(setq lst (acet-ss-to-list ssp1) )   
(foreach e lst
     (setq lst1 (vl-remove e lst)              
             p (cdr (assoc 10 (entget e)))              
     )
     (foreach e1 lst1      
           (setq lst2 (vl-remove e1 lst1)                    
                   p1 (cdr (assoc 10 (entget e1)))                   
           )
           (foreach e2 lst2         
                  (setq p2 (cdr (assoc 10 (entget e2))))
                  (setvar "cecolor" "3")
                  (command "circle" "3p" p p1 p2 )
                  (setq ent (entlast))
                  (setq cir (vlax-ename->vla-object ent))
                  (setq tkc 0)
                  (foreach e lst
                         (setq pt (cdr (assoc 10 (entget e))))
                         (setq pc (vlax-curve-getClosestPointTo cir pt ))
                         (setq kc (distance pt pc))
                         (setq tkc (+ tkc (expt kc 2)))
                  )
                  (setq lscir (append lscir (list (list tkc ent))))                                    
           )          
     ) 
)
(setq lscir (vl-sort lscir '(lambda (x y) ((setq mau (car lscir))
(foreach cir lscir
         (if (/= (cadr cir) (cadr mau))
            (command "erase" (cadr cir) "")
         )
)

(setvar "cecolor" olc)
(command "undo" "e")
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun locpoint (ssp / lstpt i n e p)
(setq lstpt (list))
(if ssp
   (progn                  
        (setq i 0 
                n (sslength ssp)
        )
        (while (               (setq e (ssname ssp i))
              (setq p (cdr (assoc 10 (entget e))))
              (if (not (member p lstpt))
                  (setq lstpt (append lstpt (list p)))
                  (command "erase" e "")
              )
              (setq i (1+ 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
(defun c:nst ( )
(command "undo" "be")
(setq olc (getvar "cecolor"))
(setq lscir (list))
(setq ssp (ssget (list (cons 0 "point"))))
;;;;;;;;;;;(locpoint ssp)
(setq lst (acet-ss-to-list ssp) )   
(foreach e lst
     (setq lst1 (vl-remove e lst)              
             p (cdr (assoc 10 (entget e)))              
     )
     (foreach e1 lst1      
           (setq lst2 (vl-remove e1 lst1)                    
                   p1 (cdr (assoc 10 (entget e1)))                   
           )
           (foreach e2 lst2         
                  (setq p2 (cdr (assoc 10 (entget e2))))
                  (setvar "cecolor" "3")
                  (command "circle" "3p" p p1 p2 )
                  (setq ent (entlast))
                  (setq cir (vlax-ename->vla-object ent))
                  (setq tkc 0)
                  (foreach e lst
                         (setq pt (cdr (assoc 10 (entget e))))
                         (setq pc (vlax-curve-getClosestPointTo cir pt ))
                         (setq kc (distance pt pc))
                         (setq tkc (+ tkc (expt kc 2)))
                  )
                  (setq lscir (append lscir (list (list tkc ent))))                                    
           )          
     ) 
)
(setq lscir (vl-sort lscir '(lambda (x y) ((setq mau (car lscir))
(foreach cir lscir
         (if (/= (cadr cir) (cadr mau))
            (command "erase" (cadr cir) "")
         )
)

(setvar "cecolor" olc)
(command "undo" "e")
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:locpoint (ssp / lstpt i n e p)
(setq lstpt (list))
(if ssp
   (progn
        (setq i 0 
                n (sslength ssp)
        )
        (while (               (setq e (ssname ssp i))
              (setq p (cdr (assoc 10 (entget e))))
              (if (not (member p lstpt))
                  (setq lstpt (append lstpt (list p)))
                  (command "erase" e "")
              )
              (setq i (1+ i))
        )
    )
)
ssp
)

 

@All: Nhờ các bác xem giùm vì sao nó lại bị lỗi như vậy. Khi chạy riêng thành hai bước thì mọi thứ OK cả mới kỳ chứ. Mình cho rằng có lẽ là cái hàm (command "erase" ..... ) nó chỉ xóa đối tượng mà không làm cho đối tượng mất hẳn khỏi bộ chọn. Vì thế khi đưa vào làm hàm con trong lisp thì nó gây ra lỗi. Cách khắc phục thì mình nghĩ có thể chơi kiểu chuối là làm một phát chọn lại nữa sau khi xài hàm con locpoint. Các bác có gợi ý gì giải quyết cái chỗ hóc xương này không ạ....

Chào Bác Bình

1. Bác tắt chế độ Osnap trong Lisp nhé. Nếu không sẽ bị lỗi

2. Hàm locpoint của bác xóa cái point trùng đi trong tập chọn ssp đi cho nên như bác đã thấy là đối tượng xóa đi, nhưng bản thân ename nó vẫn tồn tại.

Do đó, biến e hay e1 hay e2 mà tình cờ mang giá trị entity tồn tại này (đối tượng bị xóa) thì (entget e) -> trả về nil -> nên bị lỗi

Ví dụ :

(setq e (car(entsel)))

-> Xóa đối tượng đi

(entdel e)

-> Kiểm tra xem đối tượng đã bị xóa chưa

(entget e) -> NIL

Hoặc (vlax-erased-p e) -> Return : T

 

Cách giải quyết như sau :

*. Duyệt qua từng chú point trong tập ssp

*. Nếu point không là thành viên của Lstpt thì đưa point vào Lstpt và thiết lập thêm List Lstent là tập chứa entity của point[/b]

*. Nếu point không là thành viên của Lstpt thì xóa đối tượng point đi

 

Kết quả trả về của hàm phải là :

(acet-list-to-ss Lstent)

Lisp sẽ rất chậm nếu với số lượng điểm là tương đối lớn.

 

Chúc bác ngủ ngon :undecided:

  • 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
(@All: Nhờ các bác xem giùm vì sao nó lại bị lỗi như vậy. Khi chạy riêng thành hai bước thì mọi thứ OK cả mới kỳ chứ. Mình cho rằng có lẽ là cái hàm (command "erase" ..... ) nó chỉ xóa đối tượng mà không làm cho đối tượng mất hẳn khỏi bộ chọn. Vì thế khi đưa vào làm hàm con trong lisp thì nó gây ra lỗi. Cách khắc phục thì mình nghĩ có thể chơi kiểu chuối là làm một phát chọn lại nữa sau khi xài hàm con locpoint. Các bác có gợi ý gì giải quyết cái chỗ hóc xương này không ạ....

 

Theo tôi thì bác đã dùng erase thì nên xoá điểm trùng trước khi chọn ssget để xử lý. Có nghĩa cái lcpoint đặt trước xử lý trên (ssget "X" '( ...)) rồi sau đó mới mới tới (ssget '(....))

 

Góp ý xí thôi, g9 cả nhà.

  • 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ào Bác Bình

1. Bác tắt chế độ Osnap trong Lisp nhé. Nếu không sẽ bị lỗi

2. Hàm locpoint của bác xóa cái point trùng đi trong tập chọn ssp đi cho nên như bác đã thấy là đối tượng xóa đi, nhưng bản thân ename nó vẫn tồn tại.

Do đó, biến e hay e1 hay e2 mà tình cờ mang giá trị entity tồn tại này (đối tượng bị xóa) thì (entget e) -> trả về nil -> nên bị lỗi

Ví dụ :

(setq e (car(entsel)))

-> Xóa đối tượng đi

(entdel e)

-> Kiểm tra xem đối tượng đã bị xóa chưa

(entget e) -> NIL

Hoặc (vlax-erased-p e) -> Return : T

 

Cách giải quyết như sau :

*. Duyệt qua từng chú point trong tập ssp

*. Nếu point không là thành viên của Lstpt thì đưa point vào Lstpt và thiết lập thêm List Lstent là tập chứa entity của point[/b]

*. Nếu point không là thành viên của Lstpt thì xóa đối tượng point đi

 

Kết quả trả về của hàm phải là :

(acet-list-to-ss Lstent)

Lisp sẽ rất chậm nếu với số lượng điểm là tương đối lớn.

 

Chúc bác ngủ ngon :wub:

Chào bác Tue_NV,

Chân thành cám ơn sự chỉ bảo của bác. Mình cũng hơi dốt khi tạo list point mà không tạo list ename của nó bởi vì cái cần là list ename chứ không phải list point. Cái list point chỉ giúp mình loại các điểm trùng mà thôi. Mình đã bổ sung lại và lisp đã chạy tốt. Nó đây ạ: (trong lisp này mình có bổ sung thêm phần thông báo các giá trị xác định của đối tượng tìm được để người sử dụng cân nhắc lựa chọn và tạo thêm tâm của vòng tròn tìm được để người dùng có thể sử dụng tiếp theo)

(defun c:nst ( / olc lscir ssp ssp1 p1 p2 lst lst1 lst2 p cir tkc pt pc kc mau)
(command "undo" "be")
(setq oldos (getvar "osmode"))
(setq olc (getvar "cecolor"))
(setvar "osmode" 0)
(setq lscir (list))
(setq ssp (ssget (list (cons 0 "point"))))
;;;;;;;;(setq p1 (car (acet-geom-ss-extents ssp 0))
      ;;;;;;;; p2 (cadr (acet-geom-ss-extents ssp 0))
;;;;;;;:undecided:
(locpoint ssp)
;;;;;;;;(setq ssp1 (ssget "c" p1 p2 (list (cons 0 "point"))))
;;;;;;;;(setq lst (acet-ss-to-list ssp1) )   
(foreach e lst
     (setq lst1 (vl-remove e lst)              
             p (cdr (assoc 10 (entget e)))              
     )
     (foreach e1 lst1      
           (setq lst2 (vl-remove e1 lst1)                    
                   p1 (cdr (assoc 10 (entget e1)))                   
           )
           (foreach e2 lst2         
                  (setq p2 (cdr (assoc 10 (entget e2))))
                  (setvar "cecolor" "3")
                  (command "circle" "3p" p p1 p2 )
                  (setq ent (entlast))
                  (setq cir (vlax-ename->vla-object ent))
                  (setq tkc 0)
                  (foreach e lst
                         (setq pt (cdr (assoc 10 (entget e))))
                         (setq pc (vlax-curve-getClosestPointTo cir pt ))
                         (setq kc (distance pt pc))
                         (setq tkc (+ tkc (expt kc 2)))
                  )
                  (setq lscir (append lscir (list (list tkc ent))))                                    
           )          
     ) 
)
(setq lscir (vl-sort lscir '(lambda (x y) ((setq mau (car lscir))
(alert (strcat  "\n Tong binh phuong khoang cach tu cac diem toi vong tron tim duoc la:  " (rtos (car mau) 2 2)))
(setq po (cdr (assoc 10 (entget (cadr mau))))
       R (cdr (assoc 40 (entget (cadr mau))))
)
(command "point" po "")
(alert (strcat "\n Vong tron tim duoc co toa do tam la:" "\n x = " (rtos (car po) 2 4) 
              "\n y =  " (rtos (cadr po) 2 4) "\n z =  " (rtos (caddr po) 2 4)
                  "\n Ban kinh la " (rtos R 2 4) ))
(foreach cir lscir
         (if (/= (cadr cir) (cadr mau))
            (command "erase" (cadr cir) "")
         )
)
(setvar "osmode" oldos)      
(setvar "cecolor" olc)
(command "undo" "e")
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun locpoint (ssp / lstpt i n e p)
(setq lstpt (list)
        lst (list)
)
(if ssp
   (progn                  
        (setq i 0 
                n (sslength ssp)
        )
        (while (               (setq e (ssname ssp i))
              (setq p (cdr (assoc 10 (entget e))))
              (if (not (member p lstpt))
                  (progn 
                  (setq lstpt (append lstpt (list p)))
                  (setq lst (append lst (list e)))
                  )
                  (command "erase" e "")
              )
              (setq i (1+ i))
        )
    )
)
lst
)

  • 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ào cả nhà.

Chào bạn ptbinh

Mình góp ý bạn như sau :

- Thuật toán tính số đường tròn qua 3 điểm (Tổ hợp chập 3 của n phần tử) bằng cách lấy foreach 3 lần làm kết quả tăng 6 lần.

Do đó nếu cho chạy chương trình với khoảng n>100 phần tử thì lâu lắm.

- Đường tròn kết quả chỉ là một đtròn qua ít nhất 3 điểm trong tập hợp n điểm với tổng bình phương là nhỏ nhất trong tổng số các đường tròn khả dĩ.

- Mong muốn của bài toán là tìm được đường tròn có tâm là tâm của vùng tạo bởi tâm các đtròn đi qua 3 điểm trong n điểm.

TB: Mong chủ 2pic nói rõ thêm nữa về đề tài này. (Thuần hình học hay đây là một dạng bài toán tối ưu hóa theo pp bình phương tối thiểu)

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 thử viết lại chương trình của ptbinh theo hướng :

Chọn tập hợp gồm n điểm (Ví dụ: Cho n = 5 ta có : tập hợp (1 2 3 4 5) phần tử. trong đó 1 = p1 2 = p2 ...)

Tìm tập hợp là tổ hợp chập 3 của n phần tử như trên

((123) (124) (125) (134) (135) (145) (234) (235) (245) (345))

Tìm tâm của các đtròn trên bằng cách giải hệ 2 phương trình đường tròn qua 3 điểm.

(1 ptrình đtròn đc làm cho suy biến bằng cách cho nó đi qua gốc tọa độ)

Vẽ pline qua các điiểm này.

Cụ thể như sau :

(defun chap3_lstp (lst / lst lst0 lst1 lst2 lstc p)
 (setq lstc '() lst2 '() lst1 '())
 (setq lst0 lst)
(foreach e lst
  (setq lst1 (vl-remove e lst) lst (vl-remove e lst) p e)			  
  (foreach e1 lst1	  
		(setq lst2 (vl-remove e1 lst1) lst1 (vl-remove e1 lst1) p1 e1)				   
		(foreach e2 lst2		 
			   (setq p2 e2)
			   (setq lstc (append (list (list p p1 p2)) lstc)))))
 lstc
 );end chap3
;-------------------------------------------
(defun c:noisuy (/ ssp i n e p lstpt)
 (setq ssp (ssget (list (cons 0 "point"))))
 (setq i 0 n (sslength ssp))
 (while (< i n)
(setq e (ssname ssp i))
(setq p (cdr (assoc 10 (entget e))))
(if (not (member p lstpt))
  (setq lstpt (append lstpt (list p)))
  (setq ssp (vl-remove e ssp)));if
(setq i (1+ i)));while
 (setq lpoint (chap3_lstp lstpt))
 (setq i 0 lcen '())
 (repeat (length lpoint)
(setq dtron (nth i lpoint))
(setq p1 (nth 0 dtron) p2 (nth 1 dtron) p3 (nth 2 dtron))
(setq A12 (angle p1 p2) A13 (angle p1 p3))
(if (or (equal A12 A13 0.000001) (equal A12 (/ A13 pi) 0.000001) (equal (/ A12 pi) A13 0.000001))
  (setq i (1+ i)); 3 diem thang hang
  (progn
(setq pt2 (mapcar '- p2 p1) pt3 (mapcar '- p3 p1))
	(setq x2 (nth 0 pt2) y2 (nth 1 pt2) x3 (nth 0 pt3) y3 (nth 1 pt3))
	(setq detA (- (* x2 y3) (* y2 x3)) m (* -0.5 (+ (expt x2 2) (expt y2 2))) n (* -0.5 (+ (expt x3 2) (expt y3 2))))
	(setq a (/ (- (* m y3) (* n y2)) detA) b (/ (- (* n x2) (* m x3)) detA))
	(setq lcen (append lcen (list (mapcar '+ p1 (list (- a) (- b) 0.0)))) i (1+ i)));progn
  );if
);repeat
 (entmake '((0 . "POLYLINE")) )
 (setq i 0)
 (repeat (length lcen)
(entmake (subst (list 10 (nth 0 (nth i lcen)) (nth 1 (nth i lcen)) (nth 2 (nth i lcen)))
				'(10 1.0 1.0 0.0) '((0 . "VERTEX") (10 1.0 1.0 0.0))));entmake
(setq i (1+ i)));repeat
(entmake '((0 . "SEQEND")))
 );defun
;------------------------------------------

@Duyminh86: Bạn chạy thử xem và cho ý kiến tiếp theo phải làm gì nhé . Hoặc giả mình không hiểu đc ý bạn ở chỗ nào ? Chúng ta sẽ cùng làm tiếp.

  • 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ào cả nhà.

Chào bạn ptbinh

Mình góp ý bạn như sau :

- Thuật toán tính số đường tròn qua 3 điểm (Tổ hợp chập 3 của n phần tử) bằng cách lấy foreach 3 lần làm kết quả tăng 6 lần.

Do đó nếu cho chạy chương trình với khoảng n>100 phần tử thì lâu lắm.

- Đường tròn kết quả chỉ là một đtròn qua ít nhất 3 điểm trong tập hợp n điểm với tổng bình phương là nhỏ nhất trong tổng số các đường tròn khả dĩ.

- Mong muốn của bài toán là tìm được đường tròn có tâm là tâm của vùng tạo bởi tâm các đtròn đi qua 3 điểm trong n điểm.

TB: Mong chủ 2pic nói rõ thêm nữa về đề tài này. (Thuần hình học hay đây là một dạng bài toán tối ưu hóa theo pp bình phương tối thiểu)

Hề hề hề,

Đúng như bác góp ý, ở đây do mình chưa lập được thuật toán để xét tổ hợp nên mình chơi kiểu xét chỉnh hợp của nó. Về lý thuyết thì đúng là nó tăng hơn 6 lần so với số tổ hợp. (3!). Khi n càng tăng cao thì cái 6 lần này càng là con số nhỏ mà mình nghĩ là có thể chấp nhận được. Tỷ như giữa Tổ hợp chập 3 của 30 phần tử với chỉnh hợp chập 3 không xét lặp của 29 phần tử thì cái con số 6 lần này sẽ chả còn ý nghĩa nhiều lắm. Tức là vấn đề hạn chế chính là số điểm n chứ không phải là do cách tính chỉnh hợp hay tổ hợp bác ạ. Tất nhiên là về lý thuyết thì nó chưa tối ưu. Mình cũng đang nghĩ thuật toán để xét được theo các tổ hợp bác à. Hy vọng sẽ tìm ra được.

Do cái khái niệm tâm của vùng chưa được xác định nên mình cũng chưa rõ là cái bác định làm có đúng ý bạn chủ thớt hay không. Cái phương án của mình mình cũng đã giải thích ngay từ đầu là không phải đã đáp ứng đúng yêu cầu của bạn chủ thớt, mà chỉ cho một kết quả khả dĩ để nghiên cứu tiếp thôi. Vậy nên mình mới cho thông báo các thông số về đường tròn tìm được và tổng bình phương khoảng cách từ các điểm tới đường tròn này để bạn chủ thớt xem xét và quyết định phải làm gì tiếp theo bác ạ.

Rất vui vì được bác góp sức giải quyết bài toán khá hóc này.

Chúc bác luôn mạnh khỏe, vui vẻ và quan tâm tới diễ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
Mình thử viết lại chương trình của ptbinh theo hướng :

Chọn tập hợp gồm n điểm (Ví dụ: Cho n = 5 ta có : tập hợp (1 2 3 4 5) phần tử. trong đó 1 = p1 2 = p2 ...)

Tìm tập hợp là tổ hợp chập 3 của n phần tử như trên

((123) (124) (125) (134) (135) (145) (234) (235) (245) (345))

Tìm tâm của các đtròn trên bằng cách giải hệ 2 phương trình đường tròn qua 3 điểm.

(1 ptrình đtròn đc làm cho suy biến bằng cách cho nó đi qua gốc tọa độ)

Vẽ pline qua các điiểm này.

Cụ thể như sau :

 

@Duyminh86: Bạn chạy thử xem và cho ý kiến tiếp theo phải làm gì nhé . Hoặc giả mình không hiểu đc ý bạn ở chỗ nào ? Chúng ta sẽ cùng làm tiếp.

Hề hề hề,

Chào bác NguyenNdait,

Cám ơn bác về cái thuật toán tìm tổ hợp của các đối tượng.

Trong phương án bác đưa ra, có nhẽ hay hơn là bác xác định các tâm vòng tròn bằng point thôi chứ chả cần thiết vẽ pline bác ạ. Tuy nhiên có một vấn đề nảy sinh là nếu bác lại định xác định tâm của các tâm này theo phương án trên thì rất gay. Bởi vì lúc này tập hợp các điểm tâm này sẽ tăng lên gấp bội so với tập hợp n điểm ban đầu. Và như vậy sẽ làm cho việc xác định tâm của nó thêm khó khăn.

Nên chăng từ các điểm tâm này bác tạo một đa giác lồi khép kín, từ đó bác có thể xác định trọng tâm của đa giác này và lấy đó làm tâm vùng?????

 

Vài ý kiến để bác tham khảo. Chúc bác vui.

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ề,

Chào bác NguyenNdait,

Cám ơn bác về cái thuật toán tìm tổ hợp của các đối tượng.

Trong phương án bác đưa ra, có nhẽ hay hơn là bác xác định các tâm vòng tròn bằng point thôi chứ chả cần thiết vẽ pline bác ạ. Tuy nhiên có một vấn đề nảy sinh là nếu bác lại định các định tâm của các tâm này theo phương án trên thì rất gay. Bởi vì lúc này tập hợp các điểm tâm này sẽ tăng lên gấp bội so với tập hợp n điểm ban đầu. Và như vậy sẽ làm cho việc xác định tâm của nó thêm khó khăn.

Nên chăng từ các điểm tâm này bác tạo một đa giác lồi khép kín, từ đó bác có thể xác định trọng tâm của đa giác này và lấy đó làm tâm vùng?????

 

Vài ý kiến để bác tham khảo. Chúc bác vui.

 

Chào buổi sáng cả nhà.

Chương trình của mình đang còn dở dang. mình chỉ vẽ pl qua các tâm cho bạn Duyminh thấy rõ thêm về việc xác định tâm các đtròn theo như ý định ban đầu của topic. Các việc tiếp theo mình chưa rõ lắm.

Chứ nếu cứ lấy C(3,n) mãi thì số lượng tâm tăng lên vô cùng lớn.

@: Còn cái vụ bình phương tối thiểu gì đó thì mình không nắm được bao nhiêu đâu.

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ào bác Tue_NV,

Chân thành cám ơn sự chỉ bảo của bác. Mình cũng hơi dốt khi tạo list point mà không tạo list ename của nó bởi vì cái cần là list ename chứ không phải list point. Cái list point chỉ giúp mình loại các điểm trùng mà thôi. Mình đã bổ sung lại và lisp đã chạy tốt. Nó đây ạ: (trong lisp này mình có bổ sung thêm phần thông báo các giá trị xác định của đối tượng tìm được để người sử dụng cân nhắc lựa chọn và tạo thêm tâm của vòng tròn tìm được để người dùng có thể sử dụng tiếp theo)

(defun c:nst ( / olc lscir ssp ssp1 p1 p2 lst lst1 lst2 p cir tkc pt pc kc mau)
(command "undo" "be")
(setq oldos (getvar "osmode"))
(setq olc (getvar "cecolor"))
(setvar "osmode" 0)
(setq lscir (list))
(setq ssp (ssget (list (cons 0 "point"))))
;;;;;;;;(setq p1 (car (acet-geom-ss-extents ssp 0))
      ;;;;;;;; p2 (cadr (acet-geom-ss-extents ssp 0))
;;;;;;;:undecided:
(locpoint ssp)
;;;;;;;;(setq ssp1 (ssget "c" p1 p2 (list (cons 0 "point"))))
;;;;;;;;(setq lst (acet-ss-to-list ssp1) )   
(foreach e lst
     (setq lst1 (vl-remove e lst)              
             p (cdr (assoc 10 (entget e)))              
     )
     (foreach e1 lst1      
           (setq lst2 (vl-remove e1 lst1)                    
                   p1 (cdr (assoc 10 (entget e1)))                   
           )
           (foreach e2 lst2         
                  (setq p2 (cdr (assoc 10 (entget e2))))
                  (setvar "cecolor" "3")
                  (command "circle" "3p" p p1 p2 )
                  (setq ent (entlast))
                  (setq cir (vlax-ename->vla-object ent))
                  (setq tkc 0)
                  (foreach e lst
                         (setq pt (cdr (assoc 10 (entget e))))
                         (setq pc (vlax-curve-getClosestPointTo cir pt ))
                         (setq kc (distance pt pc))
                         (setq tkc (+ tkc (expt kc 2)))
                  )
                  (setq lscir (append lscir (list (list tkc ent))))                                    
           )          
     ) 
)
(setq lscir (vl-sort lscir '(lambda (x y) ((setq mau (car lscir))
(alert (strcat  "\n Tong binh phuong khoang cach tu cac diem toi vong tron tim duoc la:  " (rtos (car mau) 2 2)))
(setq po (cdr (assoc 10 (entget (cadr mau))))
       R (cdr (assoc 40 (entget (cadr mau))))
)
(command "point" po "")
(alert (strcat "\n Vong tron tim duoc co toa do tam la:" "\n x = " (rtos (car po) 2 4) 
              "\n y =  " (rtos (cadr po) 2 4) "\n z =  " (rtos (caddr po) 2 4)
                  "\n Ban kinh la " (rtos R 2 4) ))
(foreach cir lscir
         (if (/= (cadr cir) (cadr mau))
            (command "erase" (cadr cir) "")
         )
)
(setvar "osmode" oldos)      
(setvar "cecolor" olc)
(command "undo" "e")
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun locpoint (ssp / lstpt i n e p)
(setq lstpt (list)
        lst (list)
)
(if ssp
   (progn                  
        (setq i 0 
                n (sslength ssp)
        )
        (while (               (setq e (ssname ssp i))
              (setq p (cdr (assoc 10 (entget e))))
              (if (not (member p lstpt))
                  (progn 
                  (setq lstpt (append lstpt (list p)))
                  (setq lst (append lst (list e)))
                  )
                  (command "erase" e "")
              )
              (setq i (1+ i))
        )
    )
)
lst
)

Không có chi đâu bác Bình.

Em có ý kiến như thế này để cải thiện tốc độ của Lisp. Ta hạn chế việc vòng lặp tìm biến tkc (Tong binh phuong khoang cach tu cac diem toi vong tron tim duoc la) và đồng thời hạn chế được số phần tử trong tâp lscir

Bác xây dựng thử nhé :

 

1. Nếu đường tròn mà Tong binh phuong khoang cach tu cac diem toi vong tron tim duoc la: 0 thì đường tròn đó là duy nhất

 

2. Tìm cách Xác định khoảng cách giữa 2 điểm lớn nhất gọi là Dmax. Đường tròn tìm được là đường tròn có bán kính không được lớn hơn Dmax/2.

 

=> Do đó khi mà bác vẽ đường tròn thì xác định luôn bán kính R của nó. Xem bán kính R có bé hơn Dmax/2 không?

Nếu R

Nếu R> Dmax/2 thì xóa luôn đường tròn và vì thế ta không xác định biến tkc chẳng đưa vào tập lscir để tăng tốc độ của Lisp

 

3. Nếu 3 điểm thẳng hàng thì không thể nào xây dựng được đường tròn nào cả. Nếu 3 điểm thẳng hàng thì Lisp của bác chạy sai vì bác chưa xét đến trường hợp này

 

Chuúc bác vui

  • 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
Đăng nhập để thực hiện theo  

×