You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Manim高斯消元演示:如何为矩阵元素设置隐形固定边界框?

解决Manim矩阵元素对齐错位问题:添加隐形固定边界框

针对Manim中矩阵元素因墨迹边界框导致的移动错位问题,提供两种实用实现方案:

方案一:用隐形SurroundingRectangle包裹元素

给每个矩阵元素套一个固定尺寸的透明矩形,将元素与矩形组合为VGroup,让Manim以矩形尺寸作为边界框计算依据。

from manim import *

class MatrixWithInvisibleBorders(Scene):
    def construct(self):
        # 定义统一的边界框尺寸
        fixed_bbox_width = 1.2
        fixed_bbox_height = 0.8
        
        # 初始化矩阵元素
        raw_elements = [
            [MathTex("1"), MathTex("2"), MathTex("3")],
            [MathTex("4"), MathTex("5"), MathTex("6")],
            [MathTex("7"), MathTex("8"), MathTex("9")]
        ]
        
        # 为每个元素添加隐形边界框并组合
        grouped_elements = []
        for row in raw_elements:
            grouped_row = []
            for elem in row:
                # 创建完全透明的固定尺寸矩形
                invisible_border = SurroundingRectangle(
                    elem, 
                    width=fixed_bbox_width, 
                    height=fixed_bbox_height,
                    fill_opacity=0,
                    stroke_opacity=0
                )
                # 确保元素在边界框内居中
                elem.move_to(invisible_border.get_center())
                # 组合元素与边界框
                grouped_elem = VGroup(elem, invisible_border)
                grouped_row.append(grouped_elem)
            grouped_elements.append(grouped_row)
        
        # 创建矩阵并演示移动
        matrix = Matrix(grouped_elements)
        self.add(matrix)
        self.play(Swap(matrix[0][0], matrix[0][1]))
        self.wait()

方案二:自定义元素类重写边界框逻辑

继承MathTex或Tex,直接重写get_bounding_box方法,返回固定尺寸的边界框,无需额外嵌套元素。

from manim import *

class FixedBboxMathTex(MathTex):
    def __init__(self, *args, bbox_width=1.2, bbox_height=0.8, **kwargs):
        super().__init__(*args, **kwargs)
        self.bbox_width = bbox_width
        self.bbox_height = bbox_height
    
    def get_bounding_box(self):
        # 以元素中心为基准生成固定尺寸边界框
        center = self.get_center()
        half_w = self.bbox_width / 2
        half_h = self.bbox_height / 2
        return np.array([
            [center[0] - half_w, center[0] + half_w],
            [center[1] - half_h, center[1] + half_h],
            [0, 0]
        ])

class CustomMatrixScene(Scene):
    def construct(self):
        # 使用自定义元素创建矩阵
        matrix = Matrix([
            [FixedBboxMathTex("1"), FixedBboxMathTex("2"), FixedBboxMathTex("3")],
            [FixedBboxMathTex("4"), FixedBboxMathTex("5"), FixedBboxMathTex("6")],
            [FixedBboxMathTex("7"), FixedBboxMathTex("8"), FixedBboxMathTex("9")]
        ])
        self.add(matrix)
        self.play(matrix[0][0].animate.shift(RIGHT*2))
        self.wait()

方案对比

  • 方案一:直观易调试(临时将stroke_opacity设为1即可查看边界框),适合快速验证需求。
  • 方案二:轻量化无额外嵌套,适合大规模矩阵或对性能有要求的场景。

内容的提问来源于stack exchange,提问作者Stefan Witzel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 02:52:11