Исследуйте задачу о построении многоугольника по диагоналям: при каких данных о длинах и взаимных углах диагоналей можно единственным образом (с точностью до переменной симметрии) восстановить выпуклый многоугольник, и приведите алгоритм восстановления
Краткий ответ (утверждение и алгоритм). Утверждение. Пусть PPP — выпуклый nnn-угольник с вершинами в порядке v1,v2,…,vnv_1,v_2,\dots,v_nv1,v2,…,vn. Достаточно и (при естественных условиях на выпуклость) необходимо знать для одной фиксированной вершины v1v_1v1: - расстояния до остальных вершин dk=∣v1vk∣\;d_k=|v_1v_k|dk=∣v1vk∣, k=2,…,nk=2,\dots,nk=2,…,n; - углы между соседними лучами v1vkv_1v_kv1vk и v1vk+1v_1v_{k+1}v1vk+1, т.е. αk=∠(vkv1vk+1)\;\alpha_k=\angle(v_kv_1v_{k+1})αk=∠(vkv1vk+1) для k=2,…,n−1k=2,\dots,n-1k=2,…,n−1, при условии 0<αk<π\;0<\alpha_k<\pi0<αk<π и ∑k=2n−1αk<2π\sum_{k=2}^{n-1}\alpha_k<2\pi∑k=2n−1αk<2π. Тогда PPP единственным образом (с точностью до переноса и поворота и зеркального отражения) восстанавливается из данных {dk,αk}\{d_k,\alpha_k\}{dk,αk}. Краткое обоснование. Если поместить v1v_1v1 в начало координат и зафиксировать направление первого луча, то направления остальных лучей однозначно задаются кумулятивными суммами ϕ2=0,ϕk=∑j=2k−1αj(k=3,…,n).
\phi_2=0,\qquad \phi_k=\sum_{j=2}^{k-1}\alpha_j\quad(k=3,\dots,n). ϕ2=0,ϕk=j=2∑k−1αj(k=3,…,n).
Тогда координаты вершин получают вид vk=dk(cosϕk, sinϕk),k=2,…,n,
v_k=d_k(\cos\phi_k,\;\sin\phi_k),\qquad k=2,\dots,n, vk=dk(cosϕk,sinϕk),k=2,…,n,
и v1=(0,0)v_1=(0,0)v1=(0,0). При указанных ограничениях на αk\alpha_kαk и при том, что полученный многоугольник оказывается выпуклым и вершины идут в правильном порядке, этот набор векторов задаёт единственный (до евклидовых движений и отражения) nnn-угольник. Алгоритм восстановления (пошагово). 1. Выбрать ориентацию: поместить v1v_1v1 в (0,0)(0,0)(0,0) и положить направление луча v1v2v_1v_2v1v2 вдоль положительной оси xxx. 2. Посчитать углы ϕk\phi_kϕk по формуле ϕ2=0, ϕk=∑j=2k−1αj\phi_2=0,\ \phi_k=\sum_{j=2}^{k-1}\alpha_jϕ2=0,ϕk=∑j=2k−1αj. 3. Вычислить координаты вершин vk=dk(cosϕk,sinϕk)\;v_k=d_k(\cos\phi_k,\sin\phi_k)vk=dk(cosϕk,sinϕk), k=2,…,nk=2,\dots,nk=2,…,n. 4. Получить многоугольник с вершинами v1,v2,…,vnv_1,v_2,\dots,v_nv1,v2,…,vn. Проверить выпуклость (например, знаки ориентированных площадей соседних треугольников одинаковы). Если проверка не проходит — данные несовместимы с выпуклым nnn-угольником. Замечания и уточнения. - Если известны только длины всех диагоналей (без углов между ними), задача в общем не единственна (простая контрпримера — невырожденный четырёхугольник: одни и те же длинны диагоналей могут соответствовать разным углу между ними). - Аналогичный результат: если задана какая-либо триангуляция многоугольника и для каждой треугольной ячейки заданы либо все три стороны, либо две стороны и угол между ними, то полигон восстанавливается путём поочередного «склеивания» треугольников (это стандартный метод, сложность линейная по числу вершин). - Сложность предложенного алгоритма — O(n)O(n)O(n) арифметических операций (вычисления сумм углов и косинусов/синусов). - Симметрия: восстановление однозначно до общего поворота/переноса и зеркального отражения (если ориентация лучей не ориентирована). Если нужно — приведу подробный пример для конкретных числовых данных.
Утверждение. Пусть PPP — выпуклый nnn-угольник с вершинами в порядке v1,v2,…,vnv_1,v_2,\dots,v_nv1 ,v2 ,…,vn . Достаточно и (при естественных условиях на выпуклость) необходимо знать для одной фиксированной вершины v1v_1v1 :
- расстояния до остальных вершин dk=∣v1vk∣\;d_k=|v_1v_k|dk =∣v1 vk ∣, k=2,…,nk=2,\dots,nk=2,…,n;
- углы между соседними лучами v1vkv_1v_kv1 vk и v1vk+1v_1v_{k+1}v1 vk+1 , т.е. αk=∠(vkv1vk+1)\;\alpha_k=\angle(v_kv_1v_{k+1})αk =∠(vk v1 vk+1 ) для k=2,…,n−1k=2,\dots,n-1k=2,…,n−1,
при условии 0<αk<π\;0<\alpha_k<\pi0<αk <π и ∑k=2n−1αk<2π\sum_{k=2}^{n-1}\alpha_k<2\pi∑k=2n−1 αk <2π. Тогда PPP единственным образом (с точностью до переноса и поворота и зеркального отражения) восстанавливается из данных {dk,αk}\{d_k,\alpha_k\}{dk ,αk }.
Краткое обоснование. Если поместить v1v_1v1 в начало координат и зафиксировать направление первого луча, то направления остальных лучей однозначно задаются кумулятивными суммами
ϕ2=0,ϕk=∑j=2k−1αj(k=3,…,n). \phi_2=0,\qquad \phi_k=\sum_{j=2}^{k-1}\alpha_j\quad(k=3,\dots,n).
ϕ2 =0,ϕk =j=2∑k−1 αj (k=3,…,n). Тогда координаты вершин получают вид
vk=dk(cosϕk, sinϕk),k=2,…,n, v_k=d_k(\cos\phi_k,\;\sin\phi_k),\qquad k=2,\dots,n,
vk =dk (cosϕk ,sinϕk ),k=2,…,n, и v1=(0,0)v_1=(0,0)v1 =(0,0). При указанных ограничениях на αk\alpha_kαk и при том, что полученный многоугольник оказывается выпуклым и вершины идут в правильном порядке, этот набор векторов задаёт единственный (до евклидовых движений и отражения) nnn-угольник.
Алгоритм восстановления (пошагово).
1. Выбрать ориентацию: поместить v1v_1v1 в (0,0)(0,0)(0,0) и положить направление луча v1v2v_1v_2v1 v2 вдоль положительной оси xxx.
2. Посчитать углы ϕk\phi_kϕk по формуле ϕ2=0, ϕk=∑j=2k−1αj\phi_2=0,\ \phi_k=\sum_{j=2}^{k-1}\alpha_jϕ2 =0, ϕk =∑j=2k−1 αj .
3. Вычислить координаты вершин vk=dk(cosϕk,sinϕk)\;v_k=d_k(\cos\phi_k,\sin\phi_k)vk =dk (cosϕk ,sinϕk ), k=2,…,nk=2,\dots,nk=2,…,n.
4. Получить многоугольник с вершинами v1,v2,…,vnv_1,v_2,\dots,v_nv1 ,v2 ,…,vn . Проверить выпуклость (например, знаки ориентированных площадей соседних треугольников одинаковы). Если проверка не проходит — данные несовместимы с выпуклым nnn-угольником.
Замечания и уточнения.
- Если известны только длины всех диагоналей (без углов между ними), задача в общем не единственна (простая контрпримера — невырожденный четырёхугольник: одни и те же длинны диагоналей могут соответствовать разным углу между ними).
- Аналогичный результат: если задана какая-либо триангуляция многоугольника и для каждой треугольной ячейки заданы либо все три стороны, либо две стороны и угол между ними, то полигон восстанавливается путём поочередного «склеивания» треугольников (это стандартный метод, сложность линейная по числу вершин).
- Сложность предложенного алгоритма — O(n)O(n)O(n) арифметических операций (вычисления сумм углов и косинусов/синусов).
- Симметрия: восстановление однозначно до общего поворота/переноса и зеркального отражения (если ориентация лучей не ориентирована).
Если нужно — приведу подробный пример для конкретных числовых данных.