用Manim实现【线】类的实现——[下]

  1. Elbow:这个类创建两个线条,形成一个直角(L形),常用于表示坐标轴等情况。

  2. Line:一个基本的线条类,用于表示一条直线。

  3. RightAngle:此类专门表示直角的肘型对象,通常应用于几何图形。

  4. TangentLine:构造一条与某个可视化对象(VMobject)在特定点相切的线,用于描绘切线。

  5. Vector:专门用于图形中的向量,通常用于表示大小和方向(例如在二维或三维空间中的表现)。

1.L 形的线条【Elbow

Elbow” 这个词在不同的上下文中有多种意义,但在数学和计算机图形学中,特别是在动画和可视化领域,通常是指一种形状或图形元素。

  1. 含义:

    • 在计算机图形学中,“Elbow” 通常指的是一种 L 形的线条或边界。它的外观像人的肘部,因此得名。它通常由两个相连的直线段组成,形成一个折角。
  2. 用途:

    • 数据可视化: 在数据可视化中,elbow 形状有时用来指代“肘部法则”,这个法则常用于选择最佳的聚类数量(例如在K-means聚类中)。图中一般会显示不同聚类数的成本函数值,肘部的出现点通常表示最佳的聚类数。
    • 图形界面: 在计算机图形学中,Elbow 形状可以用于绘制路径、界限和框架。例如,可以用它来创建房屋、道路等的边界。
    • 动画和建模: 使用 Elbow 类,可以在动画中创建与折线相关的图形,为简单的几何形状增加复杂性和美观。在动画中,它常用于描绘运动轨迹或运动的路径。

构造函数:

Elbow(width=0.2, angle=0, **kwargs)[source]
参数说明
  1. width (float):这个参数定义了 L 形状两条边的长度。默认为 0.2。通过调整这个参数,可以改变 L 形状的大小。

  2. angle (float):该参数表示 L 形状的旋转角度。默认为 0,意味着默认情况下,L 形状会朝向标准的水平和垂直方向。可以通过设置不同的角度值来旋转 L 形状。

  3. kwargs:这是一个可变参数,用于传递额外的参数给 VMobjectVMobject 是一个基础类,可以接受许多绘图相关的参数,例如颜色、线条粗细等,这些都可以通过这些额外的参数来定义。

实例1.
from manim import *

class ElbowExample(Scene):
    def construct(self):
        elbow_1 = Elbow()
        elbow_2 = Elbow(width=2.0)
        elbow_3 = Elbow(width=2.0, angle=5*PI/4)

        elbow_group = Group(elbow_1, elbow_2, elbow_3).arrange(buff=1)
        self.add(elbow_group)

运行结果:

 实例2:
from manim import *  

class ElbowExample01(Scene):  
    def construct(self):  
        # 创建 L 形状  
        elbow = Elbow(width=2, angle=90)  

        # 设置属性  
        elbow.set_color(RED)  # 设置整体颜色为红色  
        elbow.set_fill(BLUE, opacity=0.5)  # 设置填充颜色为蓝色,透明度为0.5  
        elbow.set_stroke(color=YELLOW, width=8)  # 设置描边颜色为黄色,宽度为8  
        elbow.set_sheen(0.5)  # 设置光泽因子  
        elbow.set_height(3)  # 设置高度为3  
        elbow.set_width(3)  # 设置宽度为3  
        elbow.depth = 1  # 设置深度为1  
        #elbow.n_points_per_curve = 5  # 设置每个曲线的点数为50  

        # 创建动画场景  
        self.play(Create(elbow))  # 动画创建 L 形状  
        self.play(elbow.animate.rotate(6*PI / 4))  # 沿逆时针方向旋转 45 度  
        self.play(elbow.animate.shift(RIGHT * 2))  # 向右移动 2 个单位  
        self.play(elbow.animate.set_color(GREEN))  # 设置颜色为绿色  

        # 完成后保留结果  
        self.wait(2)  

运行结果:

 2.直线【Line】

线条的构造函数:

Line(start=array([-1., 0., 0.]), end=array([1., 0., 0.]), buff=0,
 path_arc=None, **kwargs)
参数说明
  1. start:

    • 类型: np.array(NumPy数组)
    • 含义: 指定线段的起点坐标。这里的起点设置为 [-1., 0., 0.],意味着线段的起点在三维空间中的 x=-1, y=0, z=0 位置。
  2. end:

    • 类型: np.array(NumPy数组)
    • 含义: 指定线段的终点坐标。这里的终点设置为 [1., 0., 0.],表明线段的终点在 x=1, y=0, z=0 的位置。
  3. buff:

    • 类型: float
    • 含义: 用于控制线段与其他对象之间的缓冲距离(即边距),默认为 0。设置为 0 时,线段紧靠起点和终点。如果设置为其他值,则线段将在起点和终点之间增加额外的空间。
  4. path_arc:

    • 类型: float 或 None
    • 含义: 表示线段是否要以弧形进行绘制,值表示弧的半径。如果设置为 None(默认值),则线段将是直线。如果设置为具体的值,线段将沿指定的圆弧绘制。
  5. kwargs:

    • 含义: 这个参数允许传入其他关键字参数(如颜色、线宽等)。这些参数会被传递给线段的 superclass,帮助定制线的外观。
 实例1.
from manim import *  

class LineExample01(Scene):  
    def construct(self):  
        # 创建一条水平线  
        line = Line(start=np.array([-1.,-1, 0.]), end=np.array([2, 0., 0.]),color=RED)  
        self.add(NumberPlane(),line)  # 在屏幕上展示这条线  

 运行结果:

实例2:
class LineExample02(Scene):
    def construct(self):
        self.add(NumberPlane())
        d = VGroup()
        for i in range(0,10):
            d.add(Dot())
        d.arrange_in_grid(buff=1)
        self.add(d)
        l= Line(d[0], d[1])
        self.add(l)
        self.wait()
        l.put_start_and_end_on(d[1].get_center(), d[2].get_center())
        self.wait()
        l.put_start_and_end_on(d[4].get_center(), d[7].get_center())
        self.wait()

运行结果:

实例3: 
from manim import *  

class LineExample03(Scene):  
    def construct(self): 
        self.add(NumberPlane())
        # 创建一条线段  
        line = Line(start=np.array([-2, 0, 0]), end=np.array([2, 0, 0]))  
        
        # 设定起点和终点  
        line.put_start_and_end_on(np.array([-1, 1, 0]), np.array([1, 1, 0]))  

        # 设置线段的长度  
        line.set_length(4)  # 设置线段总长为4单位  

        # 设置线段的角度  
        line.set_angle(PI / 4)  # 将线段旋转45度  

        # 计算线段的单位向量和斜率  
        unit_vector = line.get_unit_vector()  
        slope = line.get_slope()  

        # 调用投影法  
        projection_point = line.get_projection(np.array([1, 2, 0]))  

        # 生成线段的点  
        line.generate_points()  

        # 显示线段、单位向量和投影点  
        self.play(Create(line))  
        self.play(Create(Dot(projection_point, color=YELLOW)))  # 显示投影点  
        self.wait(2)  # 保持画面

运行结果:

 3.直角【RightAngle

构造函数:

RightAngle(line1, line2, length=None, **kwargs)
参数说明
  1. line1:

    • 类型Line 对象
    • 说明: 这是第一个线段,通常是直角的一个边。它必须是 manim 中的 Line 对象,或可以是任意支持的对象。
  2. line2:

    • 类型Line 对象
    • 说明: 这是第二个线段,通常是与 line1 形成直角的另一个边。它同样也必须是 manim 中的 Line 对象。
  3. length:

    • 类型float 或 None
    • 说明: 这是直角符号的长度。如果设置为 None(默认值),则长度将自动计算,通常根据两个线段的相对位置来确定。如果需要更明确的直角符号大小,可以通过这个参数来调整。
  4. kwargs:

    • 类型: 关键字参数
    • 说明: 这些参数将被传递给 RightAngle 对象的构造函数,通常用于设置其他属性,例如样式、颜色、透明度等。
 实例1:
from manim import *  

class RightAngleExample01(Scene):  
    def construct(self):  
        # 创建两个线段  
        line1 = Line(start=ORIGIN, end=RIGHT)  
        line2 = Line(start=ORIGIN, end=UP)  

        # 在两条线段之间创建直角标识  
        right_angle = RightAngle(line1, line2, length=0.4, color=YELLOW)  

        # 显示线段和直角标识  
        self.play(Create(line1), Create(line2), Create(right_angle))  
        self.wait()

 运行结果:

实例2:

from manim import *

class RightAngleExample(Scene):
    def construct(self):
        line1 = Line( LEFT, RIGHT )
        line2 = Line( DOWN, UP )
        rightangles = [
            RightAngle(line1, line2),
            RightAngle(line1, line2, length=0.4, quadrant=(1,-1)),
            RightAngle(line1, line2, length=0.5, quadrant=(-1,1), stroke_width=8),
            RightAngle(line1, line2, length=0.7, quadrant=(-1,-1), color=RED),
        ]
        plots = VGroup()
        for rightangle in rightangles:
            plot=VGroup(line1.copy(),line2.copy(), rightangle)
            plots.add(plot)
        plots.arrange(buff=1.5)
        self.add(plots)

 运行结果:

 4.切线【切线

构造函数:

TangentLine(vmob, alpha, length=1, d_alpha=1e-06, **kwargs)
参数说明
  1. vmob:

    • 类型VMobject 或其子类
    • 说明: 这是您要计算切线的对象(如曲线、路径等)。该对象必须是 manim 中的图形对象,可能是 CircleLine 或自定义的 VMobject 组合。
  2. alpha:

    • 类型float
    • 说明: 这是切线的切点在 vmob 上的参数值。具体来说,如果 vmob 是一个参数曲线或轨迹,则 alpha 表示您想要在该曲线上的某个位置(通常在0到1的范围内)。
  3. length:

    • 类型float
    • 默认值1
    • 说明: 这是切线的长度。根据您的需求,您可以调整切线的长度。
  4. d_alpha:

    • 类型float
    • 默认值1e-06
    • 说明: 这是计算切线时的精度值。它在计算切线的方向时通过小的增量值(或差分值)来估算切线的斜率。较小的值会提供更高的准确性,但可能会减慢计算速度。
  5. kwargs:

    • 类型: 关键字参数
    • 说明: 这些参数将传递给 TangentLine 对象的构造函数,以自定义切线的样式、颜色等其他属性。
 实例1:
from manim import *

class TangentLineExample01(Scene):
    def construct(self):
        circle = Circle(radius=2)
        line_1 = TangentLine(circle, alpha=1, length=3.5, color=BLUE_D) # right
        line_2 = TangentLine(circle, alpha=0.25, length=3.5, color=GREEN) # top left
        line_3 = TangentLine(circle, alpha=0.66, length=6, color=WHITE) # top left
        self.add(circle, line_1, line_2,line_3)
%manim -qm -v WARNING TangentLineExample01

运行结果:

 5.向量【Vector】

构造函数:

Vector(direction=array([1., 0., 0.]), buff=0, **kwargs)
  1. direction:

    • 类型: numpy.array
    • 说明: 这是一个表示向量方向的数组。它的元素定义了向量在各个维度上的分量。在这个例子中,array([1., 0., 0.]) 表示一个指向 x 轴正方向的单位向量(即 x 方向的向量)。
    • 您可以传递不同的数组来获取不同方向的向量,例如 array([0., 1., 0.]) 会表示一个指向 y 轴正方向的向量。
  2. buff:

    • 类型: float
    • 说明: 这个参数控制箭头与起点之间的距离(缓冲区)。默认值为 0,意味着箭头的起点就是向量的起点。如果您设定了一个正值,箭头会从起点向外“移动”这个距离。
    • 例如,buff=0.1 将使得箭头起点向外移动 0.1 个单位。
  3. **kwargs:

    • 说明: 这是一个可变关键字参数,可以传递给 Vector 类,以便设置其他属性。例如,您可以指定向量的颜色、线宽、样式等。
 实例1.
from manim import *  

class VectorExample01(Scene):  
    def construct(self):  
        # 创建一个向量  
        vector = Vector(direction=np.array([3, 3, 0]), buff=0, color=RED)  # 红色向量指向x轴  
        
        # 显示向量  
        self.add(NumberPlane(),vector) 
        self.wait()

 运行结果:

实例2:
from manim import *

class VectorExample(Scene):
    def construct(self):
        plane = NumberPlane()
        vector_1 = Vector([1,2])
        vector_2 = Vector([-5,-2])
        self.add(plane, vector_1, vector_2)

 运行结果:

实例3:
from manim import *

class VectorCoordinateLabel(Scene):
    def construct(self):
        plane = NumberPlane()

        vec_1 = Vector([1, 2])
        vec_2 = Vector([-3, -2])
        label_1 = vec_1.coordinate_label()
        label_2 = vec_2.coordinate_label(color=YELLOW)

        self.add(plane, vec_1, vec_2, label_1, label_2)

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yasen.M

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值