TocHomeGithubInfo

program/draw-n-pointed-star

多角星的生成

我们都知道,正五角星只有一种画法(除去平凡的正五边形情形),但当点数增大时,画法就有很多了。我感觉当点数增加时,绘制的形状应该会很好看,于是就写了这个网页画着玩。

结论:确实好看。

在下面的输入框中输入n1:m1,n2:m2,n_1:m_1, n_2:m_2, \dots格式的数据来绘制图形, 其中nin_i是边数,mim_i是连接间隔,例如输入5:25:2表示在一个圆上逆时针均匀排布5个顶点中,每个顶点连接其后第2个顶点(mod5)\pmod 5,按顺序0241300 \rightarrow 2 \rightarrow 4 \rightarrow 1 \rightarrow 3 \rightarrow 0绘制出五角星。maxini\max_i n_i决定绘制的是几角星,剩余的nin_i控制子图形的连接间隔。

五角星

示例:

  • 5:2 → 五角星(5个顶点,间隔21=12-1=1个点连接)
  • 8:3 → 八角星(8个顶点,间隔31=23-1=2个点连接)
  • 6:2 → 六芒星(6个顶点,间隔21=12-1=1个点连接)
  • 10:2,5:2 → 由两个五角形组成的十角星(这等价于10:4
  • 35:5,7:2 → 由5个7角形组成的35角星(这等价于35:10

mim_i可以替换为[mi,1,mi,2,][m_{i,1},m_{i,2}, \dots]使用不同间隔轮流填充

示例:

  • 16:[4,2] → 16角星,但是轮流使用八边形和四边形填充
  • 14:[4,6]→ 14角星,但是使用两个不同的七角星填充

在连接间隔后面加上小数点可以使形状不调用接下来的间隔

示例:

  • 10:[2,2.],5:2 → 由一个五边形和一个五角形组成的10角星
  • 60:[12,12.],5:2 → 由五边形和五角形组成的60角星

让我们把东西组合在一起:

  • 试试32:[4,2,4.,2],8:3,16:3

前往单独标签页绘制

题外话

从群的角度可以很容易地理解这个程序在做什么,正nn边形的对称性构成nn阶循环群 G=Z/nZG=\mathbb{Z}/n\mathbb{Z}:

  • 对顶点编号:V={0,1,2,,n1}V = \{0,1,2,\cdots,n-1\} 对应群元素
  • 配备的运算:模nn加法 ab=(a+b)modna \oplus b = (a + b) \mod n

连接间隔mm是群生成元,连接操作定义为群作用:ii+mmodni \rightarrow i + m \mod n

  • n,mn,m互素时构成单一轨道(orbit),并且也完全生成了整个循环群。
    • 例如五角星 5:25:2
      • 生成元 m=2m=2
      • 连接序列:0241300 \rightarrow 2 \rightarrow 4 \rightarrow 1 \rightarrow 3 \rightarrow 0
  • gcd(n,m)=d>1\gcd(n,m) = d > 1时,群作用分解为dd个轨道,每个轨道是阶为n/dn/d的循环子群HZ/(n/d)ZH \cong \mathbb{Z}/(n/d)\mathbb{Z}。此时的形状n:mn:m其实就是ddn/d:m/dn/d:m/d的组合。因此我们也可以对这些轨道做递归操作,最后生成复杂图像。
    • 例如10角星 10:210:2
      • 轨道1:{0,2,4,6,8}\{0,2,4,6,8\} \to 五边形
      • 轨道2:{1,3,5,7,9}\{1,3,5,7,9\} \to 五边形
      • 此时五边形可以再通过5:25:2生成五角星(这与直接使用10:410:4是相同的)

不过如果使用不同间隔[mi,1,mi,2,][m_{i,1},m_{i,2}, \dots]轮流填充就没有什么理论保证了,所以当你使用这个语法时,有时候会能看到有些顶点被重复使用,有些顶点却没被使用。

2025/07/17 (感谢土豆帮我纠正文中错误)