Làm cách nào để kiểm tra xem một đa giác có đơn điệu đối với một đường tùy ý không?


16

Định nghĩa : Một đa giác P trong mặt phẳng được gọi là đơn điệu đối với đường thẳng L , nếu mọi đường thẳng trực giao với L cắt P nhiều nhất hai lần.

Cho đa giác P , có thể xác định xem có tồn tại bất kỳ dòng L nào để đa giác P đơn điệu đối với L không? Nếu có, làm thế nào?

Trước đây, tôi hỏi một câu hỏi liên quan (nơi tôi hỏi làm thế nào để xác định xem một đa giác là đơn điệu đối với một dòng cụ thể với), nhưng bây giờ tôi đang quan tâm đến trường hợp khi Lkhông nhất định hoặc quy định trước.


Tại sao không chỉ xoay / dịch chuyển hệ tọa độ sao cho L trở thành x -axis và sau đó chạy lại thuật toán cũ? Công việc bổ sung phải được quản lý trong O(1) .
HdM

4
@HdM: Dòng L không được đưa ra như một phần của đầu vào.
Tsuyoshi Ito

Câu trả lời:


16

Điều đó là có thể.

Xem xét bạn đa giác và xem xét các đỉnh "lõm". Chúng xác định chính xác những dòng nào sẽ giao nhau với đa giác nhiều hơn hai lần. Trong hình dưới đây tôi đã đánh dấu các khoảng (màu đỏ) của các góc bị cấm. Nếu bạn đặt chúng lại với nhau và nhìn thấy một cái lỗ trên đĩa màu đỏ, sau đó có được phép góc δ (màu xanh lam). Đa giác sau đó đơn điệu đối với bất kỳ đường dốc nào 1/tanδ (màu xanh lá cây).

Tiểu hành tinh

Bây giờ là thuật toán.

Đặt là đỉnh thứ i của đa giác. Đầu tiên tính toán góc tuyệt đối alpha i của cạnh ( v i v i + 1 ) và góc bên βvi=(xi,yi)iαi(vivi+1) của đỉnh v i . Sử dụngchức năngcó sẵn trong tất cả các ngôn ngữ lập trình tốt.βiviatan2

β i = α i + 1 - α i + { 0  nếu  α i + 1α i 2 π  nếu  α i + 1 < α i

αi=atan2(yi+1yi,xi+1xi)
βi=αi+1αi+{0 if αi+1αi2π if αi+1<αi

Đảo ngược thứ tự của các đỉnh nếu chúng không theo thứ tự ngược chiều kim đồng hồ, tức là nếu không âm. ( s = - 2 π : ngược chiều kim đồng hồ, s = 2 π : chiều kim đồng hồ).s=iβinπs=2πs=2π

Điều sau đây chỉ dành cho các góc bên trong lớn hơn π nghĩa là, β j > π . Những cái màu đỏ trong pic của tôi. Mục đích là để tìm một góc δ đó không phải là trong j [ α j + 1 , α j ] modulo π . Cụ thể là sao cho tất cả j sao cho β j > π :mπβj>πδj[αj+1,αj]πjβj>π

( α j < δ < α j + 1 )  nếu  α j < α j + 1

(δ<αj+1αj<δ) if αj+1<αj
(αj<δ<αj+1) if αj<αj+1

Trong đó ở đây là giá trị chuẩn hóa của α j trong [ 0 ,αjαj . Trường hợp tương ứng với thứ hai để một khoảng thời gian mà đi xa hơn π (vì vậy thời gian này δ phải "bên trong").[0,π)πδ

Có thể là một cách nhanh hơn để làm điều này nhưng một trong là để sắp xếp các giá trị α j  mod  π vào γ 1 , ... γ m và để thử nghiệm cho delta{ γ 1O(n2)αj mod πγ1,γm.δ{γ12,γ1+γ22,,γm1+γm2,γm+π2}

Nếu bạn có tìm thấy một số sau đó L tồn tại và là dốc - 1 / tan δ . Nếu không thì P không đơn điệu.δL1/tanδP


Phần mềm nào bạn đã sử dụng để thực hiện minh họa đó?
jojman

@jojman Tôi không nhớ nhưng đó phải là GIMP, tôi không thể nhớ bất kỳ chương trình nào khác mà tôi đã sử dụng trước đó.
jmad
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.