边学边做Manim中星形多边形

Manim 中的RegularPolygram中用于生成具有规则间距顶点的“广义正多边形”,例如星形、复合等边多边形等,其关键参数如下在下面会注意介绍。

1.概念与核心参数

1.1RegularPolygram

  1. num_vertices (int):顶点总数(必填)。
  2. density (int, 默认=2):步长,表示“每隔多少个顶点连一次线”。例如 density=2 常用于绘制五角星;当 density=1 时等价于正多边形。
  3. radius (float, 默认=1):外接圆半径,控制大小。
  4. start_angle (float 或 None, 默认=None):起始顶点相对 x 轴正向 的角度,用于旋转图形。
  5. kwargs:其他样式参数(如 color、fill_color、fill_opacity、stroke_width 等)。

1.2与相近类的区别:

  1. Polygon:由一组顶点顺序连线并闭合,顶点可任意。
  2. RegularPolygon:正 n 边形,顶点等距分布,无跳跃连接。
  3. Polygram:可传入多组顶点,形成多个子多边形或复合图形。
  4. RegularPolygram:顶点等距分布,但按 density 跳跃连接,能生成星形与复合等边图形。

2.常见用法与示例

下面我们来使用不同的参数,来制作不同的正多边形。

2.1基本五角星与七角星

我们先来看下面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from manim import *

class StarDemo(Scene):
def construct(self):
pentagram = RegularPolygram(
num_vertices=5, density=2, radius=2.0,
color=YELLOW, fill_color=ORANGE, fill_opacity=0.6
)
heptagram = RegularPolygram(
num_vertices=7, density=2, radius=1.6,
color=PINK, fill_color=RED, fill_opacity=0.5
)
VGroup(pentagram, heptagram).arrange(RIGHT, buff=1.0)
self.play(Create(pentagram), Create(heptagram))
self.wait()

代码演示的视频效果

2.2从正多边形到星形

调整 density的参数来画出不同的代顶点的多边形

1
2
3
4
5
6
7
8
9
10
11
from manim import *

class DensityDemo(Scene):
def construct(self):
polys = VGroup(
RegularPolygram(9, density=1, radius=1.6, color=BLUE), # 正九边形
RegularPolygram(9, density=2, radius=1.6, color=GREEN), # 九角星
RegularPolygram(9, density=3, radius=1.6, color=RED), # 另一星形
).arrange(DOWN, buff=1.0)
self.play(Create(polys))
self.wait()

来看演示的效果

2.3旋转与样式

使用.rotate(PI/2参数来调整图形的旋转

1
2
3
4
5
6
7
8
9
10
from manim import *

class RotateStyleDemo(Scene):
def construct(self):
star = RegularPolygram(
num_vertices=5, density=2, radius=2.0,
color=GOLD, stroke_width=4, fill_opacity=0.4
).rotate(PI/2) # 起始顶点朝上
self.play(Create(star))
self.wait()

下面来看视频效果

3.圆角星形

圆角星形的含义,就是星形的顶点不再是尖锐状,而是成一个圆弧状,就是柔化了顶点的尖角,来看代码

1
2
3
4
5
6
7
8
from manim import *

class RoundedStarDemo(Scene):
def construct(self):
star = RegularPolygram(5, density=2, radius=2.0, color=WHITE)
star.round_corners(radius=0.2) # 圆角半径
self.play(Create(star))
self.wait()

说明:

1
round_corners(radius=数值)

Polygram 提供的方法,RegularPolygram 继承后可直接使用,用于柔化尖角。

来看视频效果

4.density 取值与图形效果

  1. 规则:设 n=num_verticesd=density,每次连接跳 d 个顶点,实际会生成 gcd(n, d) 个连通分支(组件)。
  2. 常见对应关系(以最小正整数为例):
    • n=5
      • d=1:正五边形(1 个组件)
      • d=2:五角星(1 个组件)
    • n=6
      • d=1:正六边形(1 个组件)
      • d=2:两条相交等边三角形(2 个组件)
      • d=3:三对平行线段(3 个组件)
    • n=8
      • d=1:正八边形(1 个组件)
      • d=2:八角星(1 个组件)
      • d=3:两个正方形(2 个组件)
      • d=4:四条直径(4 个组件)
  3. 提示:若 d ≥ n/2,图形通常会退化为若干直径或线段;选择 dn 互素时,通常会得到单一连通的星形。

5.实用建议

  1. 需要“空心轮廓”时,将 fill_opacity=0;需要“实心星形”时,设置 fill_colorfill_opacity>0
  2. 调整朝向用 start_angle(如 start_angle=PI/2 让顶点朝上)。
  3. 需要更柔和外观时,使用 round_corners(radius=…) 控制圆角半径。
  4. 组合多个图形时,用 VGroup(…).arrange(…) 统一排版与间距。