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

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
两条线。

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)

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

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
等参数,可以调整点的大小,位置和颜色。

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
更加灵活一些,它可以在任意位置生成直角标记。

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)

标签: none

添加新评论