帶箭頭的直線就是有方向的直線,既可以用來表示矢量,也可以用來標記某個關鍵位置。manim中提供了4種常用的帶箭頭的直線模塊: Arrow:單箭頭的直線 DoubleArrow:雙箭頭的直線 LabeledArrow:帶標簽的直線 Vector:向量 其中,DoubleArrow,LabeledArr ...
帶箭頭的直線就是有方向的直線,既可以用來表示矢量,也可以用來標記某個關鍵位置。manim
中提供了4種常用的帶箭頭的直線模塊:
Arrow
:單箭頭的直線DoubleArrow
:雙箭頭的直線LabeledArrow
:帶標簽的直線Vector
:向量
其中,DoubleArrow
,LabeledArrow
和Vector
都繼承自Arrow
模塊,
而Arrow
模塊繼承自上一次介紹的Line
模塊。
Vector
錶面看起來Arrow
一樣,也是一個單箭頭直線,它們的主要區別在於:Arrow
需要設置起點和終點,而Vector
只要設置終點,它的的起點固定為坐標系原點。
帶箭頭直線系列的模塊位於manim
中的Mobject
之下。
1. 主要參數
Arrow
模塊的主要參數有:
參數名稱 | 類型 | 說明 |
---|---|---|
start | Point3D | 起點 |
end | Point3D | 終點 |
stroke_width | float | 箭頭的粗細 |
buff | float | 箭頭的長短 |
max_tip_length_to_length_ratio | float | 箭頭大小與線的粗細的比例,此值越大,箭頭相對於線越大 |
max_stroke_width_to_length_ratio | float | 線的粗細與箭頭大小的比例,此值越大,線相對於箭頭線越粗 |
tip_shape | VMobject | 箭頭的類型,本質就是一個幾何對象 |
其中,start
和end
參數繼承自Line
模塊。
DoubleArrow
模塊的參數與Arrow
基本一致,只是它兩頭都有箭頭。
Vector
模塊的主要參數有:
參數名稱 | 類型 | 說明 |
---|---|---|
direction | Point2D/Point3D | 向量的方向,相當於終點 |
Vector
模塊只需要設置終點,也就是direction
。其他參數可以參考Arrow
模塊。
模塊LabeledArrow
可以在箭頭直線上加一個便簽,用於添加額外的說明信息。
參數名稱 | 類型 | 說明 |
---|---|---|
label | str | 標簽中文字,可支持數學公式 |
label_position | float | 標簽位置,預設在直線正中間 |
font_size | float | 標簽字體大小 |
label_color | Color | 標簽顏色 |
label_frame | bool | 是否顯示標簽背景 |
frame_fill_color | Color | 標簽背景顏色 |
frame_fill_opacity | float | 標簽背景透明度 |
2. 主要方法
Arrow
模塊的主要方法有:
名稱 | 說明 |
---|---|
get_default_tip_length | 獲取箭頭的長度 |
get_normal_vector | 獲取向量的法線 |
reset_normal_vector | 重置向量的法線 |
scale | 縮放向量 |
DoubleArrow
和LabeledArrow
的方法和Arrow
一樣。
Vector
除了上面Arrow
的方法,還有一個自己特有的方法:
名稱 | 說明 |
---|---|
coordinate_label | 基於向量的坐標顯示向量的值 |
比如:
class ArrowExample(Scene):
def construct(self):
vec_1 = Vector([1, 3])
vec_2 = Vector([-2, -2])
label_1 = vec_1.coordinate_label(color=BLUE)
label_2 = vec_2.coordinate_label(color=YELLOW)
self.add(vec_1, vec_2, label_1, label_2)
3. 使用示例
3.1. 箭頭和線的比例
通過buff
,max_stroke_width_to_length_ratio
和max_tip_length_to_length_ratio
參數,
可以調整箭頭和直線的比例,使之符合不同動畫場景的需要。
# buff
vg = VGroup()
for buff in np.arange(0, 2, 0.5):
vg.add(
Arrow(
buff=buff,
start=2 * LEFT,
end=2 * RIGHT,
)
)
vg.arrange(DOWN)
vg.move_to(2.5 * LEFT)
self.play(Create(vg), run_time=run_time)
# max_stroke_width_to_length_ratio
vg = VGroup()
for i in np.arange(0, 5, 1):
vg.add(
Arrow(
max_stroke_width_to_length_ratio=i,
),
)
vg.arrange(DOWN)
self.play(Create(vg), run_time=run_time)
# max_tip_length_to_length_ratio
vg = VGroup()
for i in np.arange(0, 0.3, 0.06):
vg.add(
Arrow(
max_tip_length_to_length_ratio=i,
),
)
3.2. 箭頭的樣式
箭頭的樣式不僅僅只有三角形,manim
中內置了多種不同的箭頭樣式。
Arrow(
start=2 * LEFT,
end=2 * RIGHT,
tip_shape=ArrowCircleFilledTip,
)
Arrow(
start=2 * LEFT,
end=2 * RIGHT,
tip_shape=ArrowCircleTip,
)
Arrow(
start=2 * LEFT,
end=2 * RIGHT,
tip_shape=ArrowSquareFilledTip,
)
Arrow(
start=2 * LEFT,
end=2 * RIGHT,
tip_shape=ArrowSquareTip,
)
Arrow(
start=2 * LEFT,
end=2 * RIGHT,
tip_shape=ArrowTriangleFilledTip,
)
Arrow(
start=2 * LEFT,
end=2 * RIGHT,
tip_shape=ArrowTriangleTip,
)
Arrow(
start=2 * LEFT,
end=2 * RIGHT,
tip_shape=StealthTip,
)
3.3. 向量的樣式
向量是一種特殊的帶箭頭直線,它的起點預設在坐標原點。
其他的屬性也可以和上面帶箭頭的一樣進行設置。
vec1 = Vector([1, 1], color=BLUE)
vec2 = Vector(
[-2, 1],
color=RED,
tip_shape=ArrowSquareTip,
)
label2 = vec2.coordinate_label(color=RED)
vec3 = Vector([2, -1.5], color=GREEN)
3.4. 帶標簽的箭頭
最後,帶箭頭的直線和普通的直線一樣,也可以添加標簽信息,用於對直線進行說明。
LabeledArrow(
label="y=kx+b",
font_size=25,
start=start,
end=end,
)
LabeledArrow(
label=txt1,
start=start,
end=end,
)
LabeledArrow(
label="z=\sqrt{x^2+y^2}",
font_size=25,
start=start,
end=end,
label_color=RED,
label_frame=False,
)
LabeledArrow(
label=txt2,
start=start,
end=end,
frame_fill_color=GREEN,
frame_fill_opacity=0.8,
)
4. 附件
文中完整的代碼放在網盤中了(arrow.py
),
下載地址: 完整代碼 (訪問密碼: 6872)