计算无向线段平均方向的算法

Lau*_*ire 5 algorithm geometry

我有一组 2D 无向线段,由两个端点组成。从统计上讲,他们中的大多数都或多或少地处于相同的方向。

我想计算的是段集的平均方向(例如,如果该集是全局 N/S,它将返回 ~ 0° 等......)。请注意,我不在乎返回哪个实际方向(0° 或 180° 也一样)。

在 [0..180°[ 范围内钳制每个段的方向并取平均值不起作用(例如两个段,一个 1° 和另一个 -1°:第二个将钳位到 179°,平均值为错了,这里是 90°,应该是 0°)。

我还考虑将“标准化段”端点分为两组,并计算由 2 个簇中点组成的段的方向,但这对于任务来说似乎有点复杂。“归一化线段”是指在单位圆上具有两个端点和在原点处的中点的线段。

是否有已知的算法/公式?

max*_*000 4

据我了解,段的位置并不重要,重要的是它们的方向。

所以我们可以稍微改变一下问题:我们有一组向量,我们想在它们上拟合一条线。

我们可以对此采取不同的标准。常用的是最小二乘法。

对于这个标准,解决方案是:

double dvx=0,dvy=0;
for(const auto &direction:directions)
{
    dvx+=2*direction.dx*direction.dy;
    dvy+=squared(directions.dx)-squared(directions.dy);
}
return std::atan2(dvx,dvy)/2;//or may be +pi/2
Run Code Online (Sandbox Code Playgroud)

注意:对于此实现,方向将按其长度进行加权,如果要分配相同的权重,则应对方向向量进行归一化。

此方法有时用于确定指纹识别中的线条方向:http://jmit.us.edu.pl/cms/jmitjrn/22/28_Wieclaw_4.pdf

有几种方法可以理解这个方法。其中之一是几何的:

我们有一组与 X 轴成角度的向量alpha[i]。我们不对这些向量进行平均。相反,我们用角度构建向量2*alpha[i],对它们进行平均并取所得角度的一半。诀窍在于,如果相反的方向pi在加倍后有所不同,那么它们将有所不同,而2*pi这根本没有区别。