向量场可视化¶
VectorField 一族把向量值函数 f(x, y) → (dx, dy) 可视化:在网格上采样并画出每个采样点处的向量或流向线,讲解微分方程、梯度场、流场时的利器。
VectorField¶
- class manim.VectorField(func: Callable[[Point3D], Vector3D], color: ParsableManimColor | None = None, color_scheme: Callable[[Vector3D], float] | None = None, min_color_scheme_value: float = 0, max_color_scheme_value: float = 2, colors: Sequence[ParsableManimColor] = [ManimColor('#236B8E'), ManimColor('#83C167'), ManimColor('#F7D96F'), ManimColor('#FC6255')], **kwargs)
基类:
VGroup
VectorField 是所有向量场的基类:传入函数 func 后按默认网格采样。color_scheme 可把向量模长映射为颜色(蓝 → 绿 → 黄 → 红),nudge() / get_nudge_updater() 让任意 mobject 沿场线漂移,start_submobject_movement() 则让场里的所有向量自己流动起来。
name |
type |
default |
desc |
|---|---|---|---|
|
Callable[[Point3D], Vector3D] |
— |
向量值函数 |
|
Callable | None |
None |
向量 → [0,1] 颜色映射 |
|
float |
0 / 2 |
颜色映射的值域 |
|
Sequence[color] |
蓝→绿→黄→红 |
渐变的取色序列 |
ArrowVectorField¶
- class manim.ArrowVectorField(func: ~collections.abc.Callable[[~numpy.ndarray], ~numpy.ndarray], color: ~manim.utils.color.core.ManimColor | int | str | ~numpy._typing._array_like.NDArray[~numpy.int64] | tuple[int, int, int] | ~numpy._typing._array_like.NDArray[~numpy.float64] | tuple[float, float, float] | tuple[int, int, int, int] | tuple[float, float, float, float] | None = None, color_scheme: ~collections.abc.Callable[[~numpy.ndarray], float] | None = None, min_color_scheme_value: float = 0, max_color_scheme_value: float = 2, colors: ~collections.abc.Sequence[~manim.utils.color.core.ManimColor | int | str | ~numpy._typing._array_like.NDArray[~numpy.int64] | tuple[int, int, int] | ~numpy._typing._array_like.NDArray[~numpy.float64] | tuple[float, float, float] | tuple[int, int, int, int] | tuple[float, float, float, float]] = [ManimColor('#236B8E'), ManimColor('#83C167'), ManimColor('#F7D96F'), ManimColor('#FC6255')], x_range: ~collections.abc.Sequence[float] = None, y_range: ~collections.abc.Sequence[float] = None, z_range: ~collections.abc.Sequence[float] = None, three_dimensions: bool = False, length_func: ~collections.abc.Callable[[float], float] = <function ArrowVectorField.<lambda>>, opacity: float = 1.0, vector_config: dict | None = None, **kwargs)
基类:
VectorField
ArrowVectorField 用箭头画出每个采样点的向量(VectorField 的直线版更轻量,箭头版更直观)。x_range / y_range / z_range 控制采样网格。
StreamLines¶
- class manim.StreamLines(func: Callable[[ndarray], ndarray], color: ManimColor | int | str | NDArray[int64] | tuple[int, int, int] | NDArray[float64] | tuple[float, float, float] | tuple[int, int, int, int] | tuple[float, float, float, float] | None = None, color_scheme: Callable[[ndarray], float] | None = None, min_color_scheme_value: float = 0, max_color_scheme_value: float = 2, colors: Sequence[ManimColor | int | str | NDArray[int64] | tuple[int, int, int] | NDArray[float64] | tuple[float, float, float] | tuple[int, int, int, int] | tuple[float, float, float, float]] = [ManimColor('#236B8E'), ManimColor('#83C167'), ManimColor('#F7D96F'), ManimColor('#FC6255')], x_range: Sequence[float] = None, y_range: Sequence[float] = None, z_range: Sequence[float] = None, three_dimensions: bool = False, noise_factor: float | None = None, n_repeats=1, dt=0.05, virtual_time=3, max_anchors_per_line=100, padding=3, stroke_width=1, opacity=1, **kwargs)
基类:
VectorField
StreamLines 不画向量,而是撒下一大批虚拟粒子,沿场方向积分出**流线**,用 Create 播放即可获得流体动画。virtual_time / dt 控制积分步长与总时长,noise_factor 给起点加扰动让线条分布更自然。
旋转场((-y, x))上的 ArrowVectorField 与 StreamLines:箭头指方向,流线展示完整轨迹。
查看源码 vector_fields.py
from manim import *
class VectorFieldDemo(Scene):
def construct(self):
def field(p):
return np.array([-p[1], p[0], 0]) / 4
vf = ArrowVectorField(field, x_range=[-5, 5, 1], y_range=[-2.5, 2.5, 1])
self.play(Create(vf), run_time=1.5)
sl = StreamLines(field, x_range=[-2.5, 2.5, 0.6], y_range=[-2.5, 2.5, 0.6],
noise_factor=0.2)
self.add(sl)
self.play(Create(sl), run_time=3)
self.wait()
提示
StreamLines 的采样密度由 x/y_range 的步长决定(步长越小线越密),渲染时间也随之增长;讲解用场取步长 0.5~1 即可。