我有一个n
边的正多边形,每边的长度都是a1,a2...an
。
我该如何绘制这个规则的边多边形?
多边形的长度以这种方式给出,它始终可以从中构造多边形。
如果给出了半径r
,那么我会遵循这个吗?
但我应该如何画两侧?
x[n] = r * cos(2*pi*n/N)
y[n] = r * sin(2*pi*n/N)
答案 0 :(得分:0)
找到多边形的顶点位置(即一组满足边长的位置)等于求解以下方程组:
(x2 - x1)^2 + (y2 - y1^2) = a1^2
(x3 - x2)^2 + (y3 - y2^2) = a2^2
...
(x1 - xn)^2 + (y1 - yn^2) = an^2
有几种方法可以解决这个问题。最简单的可能是使用一些优化库。
所有方法都需要初始猜测顶点位置。一个好的猜测可能是边长等于平均边长的正多边形。此多边形的半径为1/2 * a / sin(pi / n)
,其中a
是平均边长,n
是顶点数。计算初始位置x1, y1, x2, y2, ... xn, yn
。然后应用任何解决方法。我在下面介绍其中两个:
我们将上面的等式转换为误差(能量):
E1 = ((x2 - x1)^2 + (y2 - y1^2) - a1^2)^2
...
然后,任务是找到参数,使得能量之和最小(最小二乘法)。针对这些问题有各种解决方案。大多数方法都注重特殊风味。在这种情况下,它是非凸的非线性最小二乘法。但它看起来并不太糟糕。因此,Levenberg-Marquardt应该给出相当好的和快速的结果。当然,您也可以尝试其他方法。
使用库来解决这个问题通常非常简单。大多数库只需要您指定能量函数(只需插入上面的等式)和初始猜测。指定了这个,它们将直接给你顶点位置。如果您使用C ++,我可以推荐levmar。但是大多数其他语言也应该有库。
如果您不想使用库,一种非常简单的方法是参数优化。想法是改变单个参数,直到能量不再减少(即寻找局部最小值)。由于单个参数仅存在于两个方程中,因此可以非常有效地完成。对所有参数和几次迭代执行此操作。结果将是局部最小值。由于这个问题看起来不太糟糕,我觉得常规的基于多边形的初始猜测会给你全局最小值。