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.
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:
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.
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.
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.
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ộ.
status
duy 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 status
và 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?