Làm cách nào để kiểm tra nếu một hình tròn và đa giác lõm giao nhau?


19

Tôi có một đa giác (đôi khi lồi, nhưng thường lõm), và một loạt các vòng tròn với bán kính khác nhau. Làm thế nào tôi có thể tìm ra nếu một vòng tròn giao nhau / chồng chéo với đa giác?

Tôi có thể chia đa giác lõm của mình thành các mảnh lồi. Điều đó sẽ giúp?

Câu trả lời:


26

Có hai trường hợp của vấn đề này. Đầu tiên là giao điểm và thứ hai là chồng chéo (chứa).

Đầu tiên (giao điểm / đa giác bên trong vòng tròn):

Tìm điểm gần nhất trên mọi cạnh của đa giác với tâm của vòng tròn. Nếu bất kỳ khoảng cách giữa điểm gần nhất đến trung tâm nhỏ hơn bán kính, bạn có giao điểm hoặc chồng chéo.

Thứ hai (vòng tròn là toàn bộ trong đa giác): Bắn tia từ tâm vòng tròn sang phải (hoặc trái / lên / xuống) và giao điểm tia / phân đoạn (cạnh đa giác). Nếu số giao điểm là vòng tròn chẵn nằm ngoài đa giác. Nếu đó là vòng tròn kỳ lạ ở bên trong.

Tôi sẽ chia sẻ picter từ bài giảng cho trường hợp này:

nhập mô tả hình ảnh ở đây

Và chăm sóc các trường hợp số ít.

Hy vọng điều này sẽ giúp.


chỉnh sửa: Tôi nghĩ rằng thật công bằng khi thêm tín dụng vào hình ảnh. Tác giả là Petr Felkel, Trợ lý Giáo sư tại Đại học Kỹ thuật Séc ở Prague


Tôi không nghĩ rằng nó sẽ hoạt động chỉ bằng cách "bắn" một tia sang phải. Có thể tôi đã đọc sai cách tiếp cận của bạn, nhưng theo những gì tôi hiểu thì nó sẽ thất bại với một thiết lập như được mô tả ở đây: imgur.com/Whg2u
bummzack

2
Có nhưng điều này được mô tả trong trường hợp đầu tiên. Chụp tia sẽ chỉ giải quyết được Đa giác chứa vòng tròn (trường hợp thứ hai trong mô tả của tôi). Bạn phải kiểm tra cả hai trường hợp. Nó nhanh, dễ thực hiện và không cần bất kỳ bộ nhớ.
Notabene

1
Tôi xin lỗi tôi đã nhầm lẫn "cạnh" với "đỉnh" và do đó hiểu sai về kiểm tra đầu tiên của bạn. Khi đọc chính xác, nó hoạt động :)
bummzack

7

Bước đầu tiên, như bạn đoán, là chia đa giác lõm thành nhiều hình lồi. Lý do cho điều này là bạn sẽ sử dụng định lý trục tách , chỉ hoạt động trên các đa giác lồi.

SAT per se chỉ hoạt động trên hai đa giác lồi. "Trục phân tách" trong tên dùng để chỉ các trục vuông góc với các cạnh của đa giác. Thật không may, các vòng tròn có số lượng vô hạn trong số này. Tuy nhiên, hóa ra có một cách khá dễ dàng để tìm ra trục nào trong số các trục đó có liên quan, bằng cách nhìn vào dự án này hướng ra ngoài để giao với các đỉnh của đa giác.

Thay vì đi qua toàn bộ thuật toán ở đây, Phần mềm Metanet (nhà sản xuất N / N +) có một hướng dẫn tốt về phát hiện va chạm bằng SAT , phần thứ ba bao gồm SAT khi một trong các đối tượng là một vòng tròn .


Bạn có một tài liệu tham khảo để tách một đa giác lõm thành đa giác lồi? Liên kết SAT bạn cung cấp không đề cập đến bất cứ điều gì thuộc loại này.
ehsanul

Đây thực sự là một vấn đề rất phức tạp tùy thuộc vào hình dạng của đa giác, nhưng tất cả các công cụ 3D đều làm điều này, vì phần cứng thường chỉ có thể hiển thị các hình tứ giác và hình tam giác, chứ không phải đa giác.
SplinterReality

1
@ehsanul: en.wikipedia.org/wiki/Polygon_triangulation mô tả một vài cách tiếp cận phổ biến.

0

Đây là những gì tôi làm.

  1. Sử dụng kiểm tra đường chân trời để phát hiện xem tâm của vòng tròn có nằm trong đa giác không. Nếu có thì chúng giao nhau.
  2. Nếu không, kiểm tra trường hợp sau. Đối với mỗi bên của đa giác
    1. Tìm độ dốc của cạnh đa giác
    2. Tính độ dốc vuông góc
    3. (ĐỌC CẨN THẬN NÀY) Tìm giao điểm giữa một đường thẳng với độ dốc của cạnh đa giác giao với một đỉnh làm cho cạnh bên và đường dốc vuông góc với cạnh bên giao với tâm của đường tròn.
    4. Nếu điểm giao nhau được thiết lập nằm bên trong vòng tròn, điều này có nghĩa là vòng tròn này tại một số điểm đi qua phía bên trong câu hỏi và do đó giao nhau với đa giác
  3. Cuối cùng, nếu không có kết luận nào khác, hãy kiểm tra xem có bất kỳ đỉnh nào của đa giác nằm bên trong vòng tròn không (vì các thử nghiệm trước đó, bạn chỉ cần kiểm tra một lần) Nếu vậy, chúng giao nhau. Nếu không, bạn có thể kết luận rằng họ không.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.