Giao lộ vòng tròn với thuật toán quét dòng


15

Thật không may, tôi vẫn không quá mạnh mẽ để hiểu Thuật toán quét dòng . Tất cả các bài viết và sách giáo khoa về chủ đề này đã được đọc, tuy nhiên sự hiểu biết vẫn còn rất xa. Để làm cho nó rõ ràng hơn, tôi cố gắng giải quyết càng nhiều bài tập càng tốt. Nhưng, những nhiệm vụ thực sự thú vị và quan trọng vẫn là một thách thức đối với tôi.

Bài tập sau đây tôi tìm thấy trong các bài giảng về Giao lộ phân đoạn của Jeff Erickson toàn năng.

Bài tập 2. Mô tả và phân tích thuật toán quét để xác định, cho vòng tròn trong mặt phẳng, cho dù có hai giao điểm nào, trong thời gian . Mỗi vòng tròn được xác định bởi tâm và bán kính của nó, vì vậy đầu vào bao gồm ba mảng và . Hãy cẩn thận để thực hiện chính xác các nguyên thủy cấp thấp.nÔi(nđăng nhậpn)X[1 ..n],Y[1 ..n]R[1 ..n]

Hãy cố gắng làm cho một điều phức tạp dễ dàng hơn. Chúng ta biết gì về giao điểm của các vòng tròn? Những gì tương tự có thể được tìm thấy với giao điểm của các dòng. Hai đường thẳng có thể giao nhau nếu chúng liền kề, thuộc tính nào hai đường tròn nên có để giao nhau? Gọi là khoảng cách giữa tâm của các vòng tròn, và tâm của các vòng tròn. Hãy xem xét một vài trường hợp:dr0r1

  • Trường hợp 1: Nếu thì không có giải pháp, các vòng tròn là riêng biệt.d>r0+r1

  • Trường hợp 2: Nếusau đó không có giải pháp vì một vòng tròn được chứa trong vòng tròn kia.d<|r0-r1|

  • Trường hợp 3: Nếu và thì các vòng tròn trùng nhau và có vô số giải pháp.d= =0r0= =r1

Vì vậy, có vẻ như điều kiện giao lộ đã sẵn sàng, tất nhiên đó có thể là điều kiện sai. Vui lòng sửa nếu nó là như vậy.

Thuật toán. Bây giờ chúng ta cần tìm một điểm chung giữa hai vòng tròn giao nhau. Với giao điểm tương tự với đường thẳng, chúng ta cần có điều kiện chèn và xóa điều kiện vào hàng đợi sự kiện. Giả sử điểm sự kiện là tọa độ x của điểm đầu tiên và điểm cuối mà đường quét dọc chạm vào. Ở điểm đầu tiên, chúng tôi chèn vòng tròn vào trạng thái và kiểm tra giao lộ (3 trường hợp kiểm tra được đề cập ở trên) với các vòng tròn gần nhất, ở điểm cuối cùng chúng tôi xóa vòng tròn khỏi trạng thái .

Có vẻ như là đủ cho thuật toán quét dòng. Nếu có điều gì đó sai, hoặc có thể có điều gì đó nên được thực hiện khác nhau, hãy thoải mái chia sẻ suy nghĩ của bạn với chúng tôi.

Phụ lục :

Tôi chèn một vòng tròn khi đường quét dọc chạm vào vòng tròn lần đầu tiên và xóa vòng tròn khỏi trạng thái khi đường quét chạm vào lần cuối cùng. Việc kiểm tra giao lộ nên được thực hiện cho vòng tròn gần nhất trước đó. Nếu chúng tôi đã thêm một vòng tròn vào trạng thái và đã có một vòng tròn khác mà chúng tôi đã thêm trước đó và nó vẫn ở đó, do đó vòng tròn phổ biến không bị "đóng", do đó có thể có một giao lộ.


4
toàn năng [cần dẫn nguồn]
JeffE

@com bạn có ý gì bởi "vòng tròn trước gần nhất"?
Joe

1
Tôi giả sử rằng statusduy trì các vòng tròn hiện đang giao nhau trong đường quét? Giả sử bạn hiện có 100 vòng tròn statusvà bạn xử lý một sự kiện chèn và chèn vòng tròn thứ 101. Bạn so sánh bao nhiêu vòng tròn để kiểm tra giao lộ? Làm thế nào để bạn chọn những vòng tròn để so sánh?
Joe

yyyyyy

Câu trả lời:


5

Bạn chắc chắn đang đi đúng hướng. Câu hỏi lớn là: khi bạn chèn một vòng tròn, bạn sẽ kiểm tra giao lộ nào khác? Làm thế nào để bạn thực hiện kiểm tra này?

Trong trường hợp giao cắt phân đoạn dòng, các phân đoạn dòng tại bất kỳ tọa độ x đã cho nào được sắp xếp hoàn toàn. (Bạn có thể liệt kê chúng từ tọa độ Y thấp nhất đến cao nhất). Do đó, bạn có thể duy trì các phân đoạn dòng trong cây tìm kiếm nhị phân và khi bạn thêm một phân đoạn mới, bạn chỉ cần tìm ra vị trí của nó trong cây tìm kiếm nhị phân và kiểm tra các hàng xóm của nó để biết các sự kiện giao nhau.

Trong trường hợp vòng tròn, nó không ngay lập tức xóa vòng tròn nào cần kiểm tra. Nếu câu trả lời của bạn là "tất cả chúng" thì thuật toán của bạn cần một số công việc.

Bạn có thể tìm ra một cách để đại diện cho các vòng tròn để chúng được sắp xếp hoàn chỉnh, giống như các phân đoạn dòng không?

Hãy thử đại diện cho các vòng tròn là hai nửa vòng tròn. Mỗi sự kiện chèn thực sự là hai sự kiện: chèn nửa trên và chèn nửa dưới.


Thật không may, tôi không có ý tưởng về hình bán nguyệt, có thể bạn coi hình bán nguyệt là một đơn vị hình tròn tối thiểu có thể giao nhau (3 trường hợp giao nhau: giao lộ nằm trên hình bán nguyệt trên hoặc trên cả hai hoặc trên cả hai). Tại cầu xin tất cả các vòng tròn được sắp xếp theo x tọa độ của ranh giới trái và phải của chúng. Vì vậy, chúng ta không nên xem xét x phối hợp trong trạng thái , bởi vì tất cả các vòng tròn đã đi theo thứ tự tọa độ x. Do đó, có vẻ hợp lý hơn khi xem xét tọa độ y của tâm (hình bán nguyệt) hoặc bất kỳ sự kết hợp nào của y và bán kính. Ý kiến ​​của bạn?
com

@com Bạn cần điểm trung tâm và bán kính để xác định xem hai vòng tròn có giao nhau không, như bạn đã thực hiện trong kiểm tra giao lộ của riêng mình. Chỉ tọa độ y và bán kính thôi không xác định đầy đủ ranh giới của vòng tròn. Dường như có một cái gì đó cơ bản về các thuật toán quét dòng mà bạn không hiểu, nhưng thật khó để tôi biết nó là gì.
Joe

0

Tôi có thể nghĩ về cách tiếp cận này tương tự như quét Bentley Ottmann chạy trong thời gian O ((n + k) logn).

Tôi có thể giảm vấn đề giao nhau vòng tròn thành giao lộ đoạn đường. Tôi sẽ xem xét đường kính dọc song song với trục Y cho mỗi vòng tròn. Thuật toán sẽ sử dụng một đường ngang quét mặt phẳng từ dưới lên trên.

Bây giờ chúng ta có điểm cuối trên, điểm cuối thấp hơn cho mỗi vòng tròn. Ngoài ra, chúng ta cần sửa đổi vị từ Giao lộ để nói rằng hai phân đoạn giao nhau khi và chỉ khi đường quét cắt qua cả hai vòng tròn tại một điểm.

Vì vấn đề giao cắt đường có thể được giải quyết trong thời gian O ((n + k) logn), nên cùng một ràng buộc theo sau đối với giao tuyến vòng tròn.

Tôi khá tin rằng điều này sẽ hiệu quả nhưng nếu các bạn có thể chỉ ra bất kỳ trường hợp nào mà điều này sẽ không xử lý nói chung, hãy cho tôi biết.

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.