Постановка (ясность). Пусть задан выпуклый многоугольник с вершинами v1,v2,…,vnv_1,v_2,\dots,v_nv1,v2,…,vn в порядке обхода (индексы по модулю nnn). Периметр обозначим PPP. Требуется найти точку на границе (то есть на некотором рёбре/отрезке) многоугольника, такая что при обходе по границе от этой точки в одном направлении длина пути равна половине периметра P/2P/2P/2. Метод (алгоритм) 1. Вычислите длины рёбер ℓi=∣vivi+1∣\ell_i=|v_i v_{i+1}|ℓi=∣vivi+1∣ для i=1,…,ni=1,\dots,ni=1,…,n и периметр P=∑i=1nℓi,S=P2.
P=\sum_{i=1}^n \ell_i,\qquad S=\frac{P}{2}. P=i=1∑nℓi,S=2P.
2. Постройте кумулятивную последовательность длин от v1v_1v1: L0=0,Lk=∑i=1kℓi(k=1,…,n).
L_0=0,\qquad L_k=\sum_{i=1}^k \ell_i\quad (k=1,\dots,n). L0=0,Lk=i=1∑kℓi(k=1,…,n).
3. Найдите индекс kkk такой, что Lk−1≤S<LkL_{k-1}\le S< L_kLk−1≤S<Lk. (Если S=LjS=L_jS=Lj для некоторого jjj, то искомая точка — вершина vj+1v_{j+1}vj+1.) 4. Тогда искомая точка лежит на рёбре [vk,vk+1][v_k,v_{k+1}][vk,vk+1]. Её расстояние от вершины vkv_kvkd=S−Lk−1,
d=S-L_{k-1}, d=S−Lk−1,
и координаты точки получаются линейной интерполяцией: p=vk+dℓk (vk+1−vk).
p=v_k+\frac{d}{\ell_k}\,(v_{k+1}-v_k). p=vk+ℓkd(vk+1−vk). Доказательство корректности и единственности - Непрерывность и монотонность. Если параметризовать обход границы длиной от v1v_1v1 в прямом направлении функцией t↦q(t)t\mapsto q(t)t↦q(t), где t∈[0,P)t\in[0,P)t∈[0,P) — текущая пройденная длина, то q(t)q(t)q(t) — непрерывная функция, которая монотонно проходит по границе. Значит для любого значения длины t∈[0,P)t\in[0,P)t∈[0,P) существует ровно одна точка на границе с этой пройденной длиной (за исключением совпадения в вершинах, где два параметра описывают одну точку). - По определению S∈[0,P)S\in[0,P)S∈[0,P). Так как LkL_kLk — кумулятивные суммы, существует единственный индекс kkk с Lk−1≤S<LkL_{k-1}\le S< L_kLk−1≤S<Lk. Это означает, что при обходе от v1v_1v1 точка с пройденной длиной SSS попадает именно на ребро [vk,vk+1][v_k,v_{k+1}][vk,vk+1]. Дистанция от vkv_kvk до этой точки равна d=S−Lk−1d=S-L_{k-1}d=S−Lk−1 и, раз движение по рёбру соответствует однородной скорости по длине, положение точки определяется линейной интерполяцией, указанной в шаге 4. - Единственность. Поскольку функция длины до точки вдоль обхода строго возрастает (на рёбрах она линейна по параметру, на вершинах есть переход, но не убывание), уравнение «пройденная длина = SSS» имеет единственное решение на отрезке [0,P)[0,P)[0,P). Следовательно, точка единственна. Замечания - Если нужно разделить периметр на две равные части независимо от выбранной начальной вершины, алгоритм даёт точку, от которой в выбранном направлении длина пути равна P/2P/2P/2. В другом направлении получится другая (комплементарная) точка, расположенная на расстоянии P/2P/2P/2 вдоль границы от первой. - Сложность вычисления: O(n)O(n)O(n) арифметических операций (вычисление длин и поиск нужного ребра). Таким образом метод сводится к вычислению половины периметра и однократному поиску ребра, на котором лежит точка с соответствующей пройденной длиной; корректность обеспечивается непрерывностью и монотонностью функции пройденной длины вдоль границы.
Метод (алгоритм)
1. Вычислите длины рёбер ℓi=∣vivi+1∣\ell_i=|v_i v_{i+1}|ℓi =∣vi vi+1 ∣ для i=1,…,ni=1,\dots,ni=1,…,n и периметр
P=∑i=1nℓi,S=P2. P=\sum_{i=1}^n \ell_i,\qquad S=\frac{P}{2}.
P=i=1∑n ℓi ,S=2P . 2. Постройте кумулятивную последовательность длин от v1v_1v1 :
L0=0,Lk=∑i=1kℓi(k=1,…,n). L_0=0,\qquad L_k=\sum_{i=1}^k \ell_i\quad (k=1,\dots,n).
L0 =0,Lk =i=1∑k ℓi (k=1,…,n). 3. Найдите индекс kkk такой, что Lk−1≤S<LkL_{k-1}\le S< L_kLk−1 ≤S<Lk . (Если S=LjS=L_jS=Lj для некоторого jjj, то искомая точка — вершина vj+1v_{j+1}vj+1 .)
4. Тогда искомая точка лежит на рёбре [vk,vk+1][v_k,v_{k+1}][vk ,vk+1 ]. Её расстояние от вершины vkv_kvk d=S−Lk−1, d=S-L_{k-1},
d=S−Lk−1 , и координаты точки получаются линейной интерполяцией:
p=vk+dℓk (vk+1−vk). p=v_k+\frac{d}{\ell_k}\,(v_{k+1}-v_k).
p=vk +ℓk d (vk+1 −vk ).
Доказательство корректности и единственности
- Непрерывность и монотонность. Если параметризовать обход границы длиной от v1v_1v1 в прямом направлении функцией t↦q(t)t\mapsto q(t)t↦q(t), где t∈[0,P)t\in[0,P)t∈[0,P) — текущая пройденная длина, то q(t)q(t)q(t) — непрерывная функция, которая монотонно проходит по границе. Значит для любого значения длины t∈[0,P)t\in[0,P)t∈[0,P) существует ровно одна точка на границе с этой пройденной длиной (за исключением совпадения в вершинах, где два параметра описывают одну точку).
- По определению S∈[0,P)S\in[0,P)S∈[0,P). Так как LkL_kLk — кумулятивные суммы, существует единственный индекс kkk с Lk−1≤S<LkL_{k-1}\le S< L_kLk−1 ≤S<Lk . Это означает, что при обходе от v1v_1v1 точка с пройденной длиной SSS попадает именно на ребро [vk,vk+1][v_k,v_{k+1}][vk ,vk+1 ]. Дистанция от vkv_kvk до этой точки равна d=S−Lk−1d=S-L_{k-1}d=S−Lk−1 и, раз движение по рёбру соответствует однородной скорости по длине, положение точки определяется линейной интерполяцией, указанной в шаге 4.
- Единственность. Поскольку функция длины до точки вдоль обхода строго возрастает (на рёбрах она линейна по параметру, на вершинах есть переход, но не убывание), уравнение «пройденная длина = SSS» имеет единственное решение на отрезке [0,P)[0,P)[0,P). Следовательно, точка единственна.
Замечания
- Если нужно разделить периметр на две равные части независимо от выбранной начальной вершины, алгоритм даёт точку, от которой в выбранном направлении длина пути равна P/2P/2P/2. В другом направлении получится другая (комплементарная) точка, расположенная на расстоянии P/2P/2P/2 вдоль границы от первой.
- Сложность вычисления: O(n)O(n)O(n) арифметических операций (вычисление длин и поиск нужного ребра).
Таким образом метод сводится к вычислению половины периметра и однократному поиску ребра, на котором лежит точка с соответствующей пройденной длиной; корректность обеспечивается непрерывностью и монотонностью функции пройденной длины вдоль границы.