正多边形算法

什么是正多边形?

  1. 各边相同
  2. 各角相同

triangle

思想

对计算机绘图而言,要绘制正多边形,实际上是确定正多边形的各顶点的位置(坐标)

如果确定正多边形的坐标从分析正多边形的特点开始。

正多边形有边同角同的特点。

以绘制正三角形 🔺 为例。

方法一

以正多边形的第一个顶点原点,依次求出其余各点坐标。

实例

假设 $n=3$ 条边,边长为 $r$,则角度为 $\theta = 360 / n$。

那么可知第一个顶点点坐标为 $(x_0, y_0) = (0, 0)$ 。

依次向左上 ↖ 方画正多边形,根据边同角同的特点。

可以计算出第二个顶点的横坐标为 $x_1 = x_0 - r \times sin(\theta)$

第二个顶点的纵坐标为 $y_1 = y_0 + r - r \times cos(\theta)$

从计算第二个顶点的过程中,可以发现计算顶点坐标的公式,从而可以依次计算剩余顶点坐标。

源代码

import numpy as np
import pylab as pl


def polygon1(n=3, startX=0, startY=0, r=20):
    """获取正多边形顶点

    Keyword Arguments:
        n {int} -- 边数 (default: {3})
        startX {int} -- 启始顶点横坐标 (default: {0})
        startY {int} -- 启始顶点纵坐标 (default: {0})
        r {int} -- 边长 (default: {100})

    Returns:
        (list, list) -- 正多边形顶点坐标
    """

    theta = 2 * np.pi / n
    x = [startX - r * np.sin(theta * i) if i > 0 else startX
         for i in range(n + 1)]
    y = [startY + r - r * np.cos(theta * i) if i > 0 else startY
         for i in range(n + 1)]
    return x, y

更多细节见源代码

方法二

以正多边形的中心原点,依次求出其余各点坐标。

实例

第二种方法实际上更简单些。

要求 $A$ 点坐标,实际上横坐标就是顶点 $A$ 所对应的 $\theta$ 的 $sin$ 值与正多边形中心 $O$ 连线 $AO$ 长度的乘积,即 $AO \times sin(\theta)$;而纵坐标则是 $AO \times cos(\theta)$。

依次类推可以求出其余顶点坐标。

源代码

import numpy as np
import pylab as pl



def polygon2(n=3, r=20):
    """获取正多边形顶点

    Keyword Arguments:
        n {int} -- 边数 (default: {3})
        r {int} -- 正多边形中心与边的距离 (default: {20})

    Returns:
        (np.ndarray, np.ndarray) -- 正多边形顶点坐标
    """

    theta = np.linspace(0, 2*np.pi, n, endpoint=False)
    x = r*np.sin(theta)
    y = r*np.cos(theta)
    x = np.append(x, x[0])
    y = np.append(y, y[0])
    return x, y

更多细节见源代码

话说

话说,讲算法,很难讲清楚,直接放代码又太了。

算法是一种形而上的思想,代码则是算法的具现化。

描述算法其实也就是那么一回事,代码则是要带入算法的思想辅以相应的语言知识才能明白。

所以,还是您自己看吧。

Reference