manim边学边做–角度标记

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

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

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

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

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

其中,RightAngle模块继承自Angle

manim边学边做--角度标记

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

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个点来生成一个角度标记。

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) 

函数的参数是ABC三个点,

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

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

manim边学边做--角度标记

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

lines = angle.get_lines() 

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

print(f"角度:{angle.get_value(degrees=True)}") print(f"弧度:{angle.get_value()}")  # 运行结果 角度:71.56505117707799 弧度:1.2490457723982544 

3. 使用示例

3.1. 角度大小

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

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) 

manim边学边做--角度标记

3.2. 角度位置

角度标记的位置由两个参数来控制,quadrantother_angle

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

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

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

manim边学边做--角度标记

other_angle默认为False,表示绘制角度时从Line1Line2

设置other_angle为True时,绘制角度的顺序相反,从Line2Line1

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)  

manim边学边做--角度标记

3.3. 角度中的点

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

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

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, ) 

manim边学边做--角度标记

3.4. 直角标记

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

manim中提供了2个模块来标记直角,RightAngleElbow

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

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

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)  

manim边学边做--角度标记

4. 附件

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

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

发表评论

相关文章