manim边学边做--角度标记

manim中绘制一个角度其实就是绘制两条直线,本篇介绍的不是绘制角度,而是绘制角度标记。

对于锐角 和钝角 ,角度标记是一个弧,弧的度数与角的度数一样;

对于直角 ,角度标记是一个垂直的拐角。

manim中关于角度标记的模型主要有3个:

  1. Angle:根据两条直线绘制角度标记
  2. RightAngle:根据两条互相垂直的线绘制直角标记
  3. Elbow:不受限于直线,任意方向和大小的直角标记

其中,RightAngle模块继承自Angle。

角度标记的主要作用是在动画中标记出一些特殊角度,更好的展示数学定理的证明过程。

1. 主要参数

Angle模块是通用的角度标记,它的主要参数有:

参数名称 类型 说明
line1 Line 构成角度的第一条线
line2 Line 构成角度的第二条线
radius float 角度标记的半径
quadrant Point2D 此参数控制角度标记显示在哪个位置
other_angle bool True:顺时针从line1到line2 False:逆时针从line1到line2
dot bool 是否在角度标记中显示一个点
dot_radius float 点的半径
dot_distance float 点到圆弧(角度标记)的相对距离
dot_color Color 点的颜色
elbow bool 是否显示成直角的形状

后面在使用示例中演示这些参数的使用。

RightAngle模块继承自Angle,除了上面Angle的参数之外,还有一个自己特有的参数。

参数名称 类型 说明
length float 标记的大小

Elbow模块与上面两个不一样,它不是根据两条线来生成角度标记。

参数名称 类型 说明
width float 标记的大小
angle float 标记朝向那个方向

Elbow的形状和RightAngle是一样的。

2. 主要方法

Angle模块的方法主要有3个:

名称 说明
from_three_points 根据三个点来生成角度标记
get_lines 获取生成角度的两条线
get_value 获取角度的值

一般我绘制一个角度标记时,都是根据两条相交的线来确定角度位置的。

通过from_three_points方法,可以根据任意3个点来生成一个角度标记。

python 复制代码
A = np.array([2, -1, 0])
B = np.array([0, 0, 0])
C = np.array([1, 1, 0])

angle = Angle.from_three_points(A, B, C)

函数的参数是A,B,C三个点,

  • A:角度的起点
  • B:角度的顶点
  • C:角度的终点

生成的角度以B为顶点,从点A到点C逆时针旋转。

方法get_lines可获取构成角度的两条线,也就是上图中的BA,BC两条线。

python 复制代码
lines = angle.get_lines()

最后,get_value方法,可以实时得到当前角度的值,值可以是度数,也可以是弧度。

python 复制代码
print(f"角度:{angle.get_value(degrees=True)}")
print(f"弧度:{angle.get_value()}")

# 运行结果
角度:71.56505117707799
弧度:1.2490457723982544

3. 使用示例

3.1. 角度大小

因为角度标记Angle是一个弧形,所以角度的大小通过参数radius(半径)来调整。

python 复制代码
line1 = Line(LEFT, RIGHT)
line2 = Line(DOWN, UP)

Angle(line1, line2)
Angle(line1, line2, radius=0.2)
Angle(line1, line2, radius=0.5)
Angle(line1, line2, radius=0.8)

3.2. 角度位置

角度标记的位置由两个参数来控制,quadrant和other_angle。

quadrant参数一共有四种选项:(1, 1)或(1, -1)或(-1, 1)或(-1, -1)

这个参数分两部分,分别表示角度标记在Line1上的起点位置 和在Line2上的终点位置。

比如下面相交的两条直线,quadrant的第一个值和第二个值分别在Line1和Line2上的位置如图。

other_angle默认为False,表示绘制角度时从Line1到Line2;

设置other_angle为True时,绘制角度的顺序相反,从Line2到Line1。

python 复制代码
l1 = Line(
    LEFT + (1 / 3) * UP,
    RIGHT + (1 / 3) * DOWN,
)
l2 = Line(
    DOWN + (1 / 3) * RIGHT,
    UP + (1 / 3) * LEFT,
)

Angle(l1, l2)
Angle(l1, l2, quadrant=(1, -1))
Angle(l1, l2, quadrant=(-1, 1))
Angle(l1, l2, quadrant=(-1, -1))
Angle(l1, l2, other_angle=True)
Angle(l1, l2, quadrant=(1, -1), other_angle=True)
Angle(l1, l2, quadrant=(-1, 1), other_angle=True)
Angle(l1, l2, quadrant=(-1, -1), other_angle=True)

3.3. 角度中的点

Angle中可以加一个点的标记,当一个画面中有很多角度的时候,这个标记可以帮助我们区分不同的角。

通过dot_radius,dot_distance和dot_color等参数,可以调整点的大小,位置和颜色。

python 复制代码
line1 = Line(
    LEFT / 2,
    RIGHT / 2,
)
line2 = Line(
    DOWN / 2,
    UP / 2,
)

Angle(
    line1,
    line2,
    dot=True,
    dot_radius=0.02,
    dot_color=RED,
)
Angle(
    line1,
    line2,
    dot=True,
    dot_radius=0.08,
    dot_color=BLUE,
)
Angle(
    line1,
    line2,
    dot=True,
    dot_distance=0.2,
    dot_color=GREEN,
)
Angle(
    line1,
    line2,
    dot=True,
    dot_distance=0.8,
    dot_color=YELLOW,
)

3.4. 直角标记

最后,还有一个特殊的角度标记--直角标记。

manim中提供了2个模块来标记直角,RightAngle和Elbow。

它们的显示效果差不多,区别在于,RightAngle需要根据两条线来生成,

而Elbow更加灵活一些,它可以在任意位置生成直角标记。

python 复制代码
line1 = Line(
    LEFT / 2,
    RIGHT / 2,
)
line2 = Line(
    DOWN / 2,
    UP / 2,
)

RightAngle(
    line1,
    line2,
    length=0.2,
)
RightAngle(
    line1,
    line2,
    length=0.4,
)
RightAngle(
    line1,
    line2,
    quadrant=(1, -1),
)
RightAngle(
    line1,
    line2,
    quadrant=(-1, -1),
)
Elbow(width=0.5)
Elbow(width=1)
Elbow(width=1, angle=PI / 2)
Elbow(width=1, angle=5 * PI / 4)

4. 附件

文中完整的代码放在网盘中了(angle.py),

下载地址: 完整代码 (访问密码: 6872)

相关推荐
wang_yb1 天前
Scikit-Learn实战:5步搞定PCA降维
ai·databook
zwd20052 天前
Manim add_sound 用法详解:time_offset、gain、多条音频与旁白对齐(2026 最新教程,0.21.0)
python·音频·动画·manim·数学动画·add_sound
wang_yb3 天前
什么是范数?用 NumPy 动手算一遍就明白了
数据分析·databook
wang_yb4 天前
从手动检查到自动监控:一个数据质量工作流的实现
数据分析·databook
zwd20055 天前
Manim move_to 和 shift 用法详解:相对位移、绝对落点与 aligned_edge(0.21.0 实测)
python·动画·可视化·shift·manim·数学动画·move_to
wang_yb6 天前
面向数据工程师的正则表达式:从日志清洗到字段提取
数据分析·databook
wang_yb7 天前
时间序列分解:从噪声中提取有效信号
数据分析·databook
wang_yb9 天前
使用 SciPy 库进行时间序列分析
数据分析·databook
wang_yb11 天前
如何比较你不同学科成绩的好坏?
数据分析·databook
wang_yb12 天前
用Pandas+Pydantic搭建数据清洗与验证管道
数据分析·databook