Ниже приведено решение O(n)
, которое также может содержать дополнительный вес для каждого сегмента.
Мы моделируем каждый сегмент своим углом с осью X (a) с весом (w). На этом этапе направление сегмента не важно, любое значение по модулю 180 ° будет делать. Идея состоит в том, чтобы петля для каждого сегмента и отслеживать среднее направление, вычисленное до сих пор; и отрегулируйте это среднее с направлением по модулю 180, которое ближе к самому среднему.
Псевдо-код (все углы в градусах):
aa = 0
ww = 0
for a, w in segments:
// Compute delta between angles in range [-180°..+180°[
da = a - aa
if da < -180:
da += 360
if da >= 180:
da -= 360
// Optional direction swap, delta in [-90°..+90°[
if da < -90:
da += 180
if da >= 90:
da -= 180
// The following formula also make sure aa = a mod 180
// when ww = 0 (first iteration).
aa += da * w/(w + ww)
ww += w
// Clamp result to [0°..+360°[
if aa >= 360:
aa -= 360
if aa < 0:
aa += 360
// Clamp final result aa to [0..+180°[ (optional step)
if aa > 180:
aa -= 180
я не показал, что результат не зависит от порядка итерации, но на первый взгляд алгоритма должно быть.
На зависимость этого алгоритма против ввода итерации порядка
Для хорошо себя входных данных, алгоритм является очень стабильным, независимо от того, итерации.
Однако, как только входные данные не имеют четкого основного направления, этот результат этого алгоритма будет сильно зависеть от порядка итераций, который будет трудно предсказать хаотический режим.
Численное моделирование показывает, что для случайных направлений со стандартным отклонением менее 20 ° (вокруг медианы) алгоритм всегда стабилен. При стандартном отклонении более 20 ° начинают появляться числовые неустойчивости, и результат сильно зависит от порядка итерации (между 20 и 30 ° различие, вероятно, достаточно мало, чтобы игнорировать, более 30 ° появляется большая разница).
Я точно не вычислил точное хаотическое/стабильное стандартное отклонение, поэтому возьмите это значение 20 ° как исходное предположение. Точное математическое решение остается как упражнение для читателя.
Ниже приведено численное моделирование (для каждого стандартного отклонения от 0 до 45 ° запускается в 1000 раз алгоритм на различные случайные данные данного стандартного отклонения и измеряется средняя дельта между 10 прогонами).
Таким образом, для достижения наилучших результатов, если входные данные не гарантирован иметь небольшое стандартное отклонение, это, вероятно, лучше заказать входные данные о стабильном ключе (больший вес первой, или любой другой ключ в зависимости от вашего ввода).
Как я понимаю, это будет означать * векторы *. У меня есть * неориентированные сегменты *, поэтому сегмент и его противоположность (обе точки сменяются местами) должны рассматриваться одинаково. –
@ LaurentGrégoire, пожалуйста, объясните, что я добавил до конца. – maxim1000
Отлично, действительно, трюк состоит в том, чтобы усреднять подшипники, умноженные на 2, а затем вдвое уменьшить это среднее значение. Кстати, для моей потребности я использовал простое взвешенное среднее значение синусов и косинусов. –