Đ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).
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+1−yi,xi+1−xi)
βi=αi+1−αi+{02π if αi+1≥αi 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βi−nπ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,…,γm−1+γ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.δL−1/tanδP