Làm thế nào để tính toán xoay vòng hiệu quả?


13

Bức tranh 1 Hình 2

Tôi có một hình được biểu diễn thông qua một ma trận byte (ma trận giống như bitmap). Hình ví dụ được hiển thị trên Picture 1.

Mục tiêu là tìm góc quay tốt nhất của một số hình đã cho . Khi Hình được xoay theo góc tốt nhất, hình chữ nhật song song với trục X và Y và ghi Hình có diện tích nhỏ nhất.

Hình chữ nhật ghi hình được hiển thị màu xám nhạt trên hình ảnh. Trong phần Picture 2, bạn có thể thấy rằng góc quay lý tưởng của Hình là khoảng 30 độ theo chiều kim đồng hồ.

Bây giờ, tôi biết thuật toán làm thế nào để tìm góc này, nhưng dường như nó rất kém hiệu quả. Nó như thế này:

  1. Vòng qua các góc từ 0 đến 45.
  2. Đối với góc hiện tại, với mỗi điểm hình, tính toán vị trí mới, xoay,
  3. Tìm giới hạn của hình chữ nhật có chứa hình (tối thiểu và tối đa x, y) và đăng ký nó nếu phù hợp nhất cho đến nay
  4. Góc tiếp theo

Đây là một loại phương pháp vũ phu và hoạt động tốt và nhanh chóng hợp lý cho các số liệu nhỏ. Tuy nhiên, tôi cần làm việc với các số liệu có chứa tới 10 triệu điểm và thuật toán của tôi trở nên chậm.

Điều gì sẽ là thuật toán tốt cho vấn đề này?

Câu trả lời:


20

Có vẻ như bạn có thể tìm thấy hộp giới hạn tối thiểu được căn chỉnh tùy ý bằng thuật toán calipers Xoay thời gian tuyến tính .

Khi bạn có hộp giới hạn, bạn chỉ cần xác định góc quay bằng cách tính độ dốc của một trong các cạnh.


Đây là một giải pháp tuyệt vời, rất tốt.
Được thông báo vào

Thật tuyệt, vì tôi đã sắp xếp các điểm theo x và y, tôi có thể tìm thấy thân tàu lồi với en.wikibooks.org/wiki/Alerskym_Imcellenceation/Geometry/ và sử dụng thuật toán hiện có với các điểm thân tàu.
Dusan

12

Bước đầu tiên của phương pháp của bạn là thiếu sót - có vô số giá trị thực trong khoảng từ 0 đến 45, do đó, sẽ không có ý nghĩa gì khi "lặp qua chúng". Tuy nhiên, thuật toán của bạn có thể được sửa chữa:

  • tìm vỏ lồi của đa giác

  • lặp qua số góc hữu hạn (!) được cho bởi các cạnh ngoài của thân lồi

  • Bây giờ áp dụng các bước 2 đến 4 bằng cách sử dụng các góc này.

Điều này hoạt động bởi vì nó có thể được chỉ ra rằng hình chữ nhật bao quanh tối thiểu phải chạm vào một trong các cạnh bên ngoài của thân lồi.


Vâng, đó chính xác là những gì tôi sẽ làm, đã tìm thấy sự giúp đỡ của câu trả lời của Dan. Cảm ơn bạn.
Dusan

@Dusan: Tôi không chắc câu trả lời khác mô tả cách tiếp cận tương tự, do đó tôi đã cố gắng mô tả giải pháp theo cách đơn giản hơn, hy vọng rõ ràng hơn một chút. Tìm thấy một mô tả ở đây: cgm.cs.mcgill.ca/~orm/maer.html
Doc Brown

Vâng, bạn đã đúng, cách tiếp cận của bạn cụ thể hơn và đơn giản và rõ ràng hơn, nhưng tôi đã tự kết luận cách tiếp cận tương tự bằng các gợi ý được đưa ra trong câu trả lời của Dan, vì vậy tôi đã cho anh ấy chấp nhận. Hy vọng câu trả lời của bạn sẽ đạt được nhiều lượt bình chọn hơn. Không cảm thấy khó khăn. Chúc mừng!
Dusan
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.