Manim中几何作图时如何添加直角标识

我们在作几何图像的时候,难免会涉及两线垂直的情况,从几何常识的角度思考,此时我们就需要添加一个垂直符号,更加直观的告诉观察者,这两条线是垂直的位置关系,今天我们就来学习探究这个知识点,如何在相互垂直的两线交点处添加一个垂直符号。在Manim中,RightAngle 是用于绘制直角的几何对象。以下是关于它的详细说明:

1.参数说明

1
2
3
4
5
6
7
8
9
RightAngle(
line1, # 第一条线段
line2, # 第二条线段
length=0.25, # 直角边长度(默认0.25)
quadrant=(-1, 1), # 直角所在象限
stroke_width=2, # 线宽
color=WHITE, # 颜色
**kwargs
)

2.参数分析

从参数来看,直角所在的象限理解起来有点问题,互联网查了查资料,发现这个象限,并不是笛卡尔坐标系的象限,在数学常识中,笛卡尔坐标系的象限是

  1. 第一象限:x>0, y>0(右上)
  2. 第二象限:x<0, y>0(左上)
  3. 第三象限:x<0, y<0(左下)
  4. 第四象限:x>0, y<0(右下)

可以简单的如下图标识

1
2
3
4
5
6
# 标准坐标系象限
# ↑ y
# II | I
# ←---⊕---→ x
# III | IV
# ↓

然而,RightAngle 的象限是相对于两条线段的方向来定义的,而不是绝对坐标系。它的规则是:

1
2
3
4
5
6
7
8
9
# quadrant=(line1, line2) 表示:
# - line1: 沿第一条线段的延伸方向(±1)
# - line2: 沿第二条线段的延伸方向(±1)

# 默认实际效果:
# quadrant=(1, 1) # 从交点出发,沿line1正方向 + 沿line2正方向
# quadrant=(-1, 1) # 从交点出发,沿line1反方向 + 沿line2正方向
# quadrant=(-1, -1) # 从交点出发,沿line1反方向 + 沿line2反方向
# quadrant=(1, -1) # 从交点出发,沿line1正方向 + 沿line2反方向

如果两条直线如坐标系两条轴一样的水平和竖直,那么直角标识的象限有可能和坐标系象限相同,如果两条直线倾斜了角度,就要看直线的走向区分正负,根据两条直线的正负方向来确定直角标识所在的象限。关于两条线的起点和终点,在line对象中有规定

1
2
line1 = Line(start, end1, color=RED)    # 起点→终点1
line2 = Line(start, end2, color=BLUE) # 起点→终点2

再例如

1
2
3
# 创建不同顺序的线段对
line_AB = Line(A, B, color=RED) # A→B
line_BA = Line(B, A, color=RED) # B→A(反向)

最为便捷的是,RightAngle 会自动计算两条线段的交点,或延长线的交点,不需要特意指明交点的情况,这是它非常智能和方便的地方。

3.示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from manim import *

class RightAngleExample(Scene):
def construct(self):
# 创建两条线段的端点
A = LEFT * 2
B = ORIGIN
C = UP * 2

# 创建两条线段
line1 = Line(A, B)
line2 = Line(B, C)

# 创建直角(默认在B点处)
right_angle = RightAngle(line1, line2, quadrant=(-1,1), color=RED)

# 添加标签(可选,便于理解)
dot_A = Dot(A, color=RED)
dot_B = Dot(B, color=GREEN)
dot_C = Dot(C, color=BLUE)

label_A = Text("A", font_size=24).next_to(A, LEFT)
label_B = Text("B", font_size=24).next_to(B, DOWN)
label_C = Text("C", font_size=24).next_to(C, UP)

# 添加到场景
self.play(Create(line1), Create(line2), Create(right_angle))
self.play(Create(dot_A),Create(dot_B),Create(dot_C))
self.play(Create(label_A), Create(label_B), Create(label_C))
self.wait()

显示的效果如下

4.实例分析

再来看在直角三角形中创建直角标识

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from manim import *

class TriangleRightAngle(Scene):
def construct(self):
# 创建直角三角形
A = LEFT * 2
B = ORIGIN
C = UP * 2

triangle = Polygon(A, B, C, color=BLUE)

# 在B点处创建直角标记
right_angle = RightAngle(
Line(A, B),
Line(B, C),
length=0.3,
quadrant=(-1, 1),
color=RED,
stroke_width=6
)

self.play(Create(triangle), Create(right_angle))
self.wait(2)

显示的实际效果

5.注意事项

1
2
3
4
5
6
7
8
9
right_angle = RightAngle(
line1, line2,
length=0.35,
quadrant=(-1, 1),
color="#FF6B6B", # 自定义颜色
stroke_width=8, # 更粗的线
fill_opacity=0.3, # 添加填充
fill_color=YELLOW # 填充颜色
)

这段代码的参数可能更多一些,在这里适当的做一个标记,最后汇总一下直角标识的知识,

  1. 自动对齐RightAngle 会自动计算两条线段的交点作为直角的顶点。
  2. 更新机制:如果线段移动,RightAngle 会自动更新位置。
  3. 非直角情况:即使两条线段不垂直,RightAngle 仍会绘制,但可能不是数学上的直角。
  4. 长度单位length 参数的单位与 Manim 坐标系单位相同。