首页 > 其他分享 >manim边学边做--角度标记

manim边学边做--角度标记

时间:2024-09-07 11:14:44浏览次数:8  
标签:Angle 标记 -- line2 line1 角度 边学边 dot manim

manim中绘制一个角度其实就是绘制两条直线,本篇介绍的不是绘制角度,而是绘制角度标记

对于锐角钝角角度标记是一个弧,弧的度数与角的度数一样;

对于直角角度标记是一个垂直的拐角。

manim中关于角度标记的模型主要有3个:

  1. Angle:根据两条直线绘制角度标记
  2. RightAngle:根据两条互相垂直的线绘制直角标记
  3. Elbow:不受限于直线,任意方向和大小的直角标记

其中,RightAngle模块继承自Angle

角度标记的主要作用是在动画中标记出一些特殊角度,更好的展示数学定理的证明过程。

1. 主要参数

Angle模块是通用的角度标记,它的主要参数有:

参数名称 类型 说明
line1 Line 构成角度的第一条线
line2 Line 构成角度的第二条线
radius float 角度标记的半径
quadrant Point2D 此参数控制角度标记显示在哪个位置
other_angle bool True:顺时针从line1到line2
False:逆时针从line1到line2
dot bool 是否在角度标记中显示一个点
dot_radius float 点的半径
dot_distance float 点到圆弧(角度标记)的相对距离
dot_color Color 点的颜色
elbow bool 是否显示成直角的形状

后面在使用示例中演示这些参数的使用。

RightAngle模块继承自Angle,除了上面Angle的参数之外,还有一个自己特有的参数。

参数名称 类型 说明
length float 标记的大小

Elbow模块与上面两个不一样,它不是根据两条线来生成角度标记。

参数名称 类型 说明
width float 标记的大小
angle float 标记朝向那个方向

Elbow的形状和RightAngle是一样的。

2. 主要方法

Angle模块的方法主要有3个:

名称 说明
from_three_points 根据三个点来生成角度标记
get_lines 获取生成角度的两条线
get_value 获取角度的值

一般我绘制一个角度标记时,都是根据两条相交的线来确定角度位置的。

通过from_three_points方法,可以根据任意3个点来生成一个角度标记。

A = np.array([2, -1, 0])
B = np.array([0, 0, 0])
C = np.array([1, 1, 0])

angle = Angle.from_three_points(A, B, C)

函数的参数是ABC三个点,

  • A:角度的起点
  • B:角度的顶点
  • C:角度的终点

生成的角度以B为顶点,从点A到点C逆时针旋转。

方法get_lines可获取构成角度的两条线,也就是上图中的BABC两条线。

lines = angle.get_lines()

最后,get_value方法,可以实时得到当前角度的值,值可以是度数,也可以是弧度。

print(f"角度:{angle.get_value(degrees=True)}")
print(f"弧度:{angle.get_value()}")

# 运行结果
角度:71.56505117707799
弧度:1.2490457723982544

3. 使用示例

3.1. 角度大小

因为角度标记Angle是一个弧形,所以角度的大小通过参数radius(半径)来调整。

line1 = Line(LEFT, RIGHT)
line2 = Line(DOWN, UP)

Angle(line1, line2)
Angle(line1, line2, radius=0.2)
Angle(line1, line2, radius=0.5)
Angle(line1, line2, radius=0.8)

3.2. 角度位置

角度标记的位置由两个参数来控制,quadrantother_angle

quadrant参数一共有四种选项:(1, 1)(1, -1)(-1, 1)(-1, -1)

这个参数分两部分,分别表示角度标记在Line1上的起点位置和在Line2上的终点位置

比如下面相交的两条直线,quadrant的第一个值和第二个值分别在Line1Line2上的位置如图。

other_angle默认为False,表示绘制角度时从Line1Line2

设置other_angle为True时,绘制角度的顺序相反,从Line2Line1

l1 = Line(
    LEFT + (1 / 3) * UP,
    RIGHT + (1 / 3) * DOWN,
)
l2 = Line(
    DOWN + (1 / 3) * RIGHT,
    UP + (1 / 3) * LEFT,
)

Angle(l1, l2)
Angle(l1, l2, quadrant=(1, -1))
Angle(l1, l2, quadrant=(-1, 1))
Angle(l1, l2, quadrant=(-1, -1))
Angle(l1, l2, other_angle=True)
Angle(l1, l2, quadrant=(1, -1), other_angle=True)
Angle(l1, l2, quadrant=(-1, 1), other_angle=True)
Angle(l1, l2, quadrant=(-1, -1), other_angle=True)

3.3. 角度中的点

Angle中可以加一个点的标记,当一个画面中有很多角度的时候,这个标记可以帮助我们区分不同的角。

通过dot_radiusdot_distancedot_color等参数,可以调整点的大小,位置和颜色。

line1 = Line(
    LEFT / 2,
    RIGHT / 2,
)
line2 = Line(
    DOWN / 2,
    UP / 2,
)

Angle(
    line1,
    line2,
    dot=True,
    dot_radius=0.02,
    dot_color=RED,
)
Angle(
    line1,
    line2,
    dot=True,
    dot_radius=0.08,
    dot_color=BLUE,
)
Angle(
    line1,
    line2,
    dot=True,
    dot_distance=0.2,
    dot_color=GREEN,
)
Angle(
    line1,
    line2,
    dot=True,
    dot_distance=0.8,
    dot_color=YELLOW,
)

3.4. 直角标记

最后,还有一个特殊的角度标记--直角标记。

manim中提供了2个模块来标记直角,RightAngleElbow

它们的显示效果差不多,区别在于,RightAngle需要根据两条线来生成,

Elbow更加灵活一些,它可以在任意位置生成直角标记。

line1 = Line(
    LEFT / 2,
    RIGHT / 2,
)
line2 = Line(
    DOWN / 2,
    UP / 2,
)

RightAngle(
    line1,
    line2,
    length=0.2,
)
RightAngle(
    line1,
    line2,
    length=0.4,
)
RightAngle(
    line1,
    line2,
    quadrant=(1, -1),
)
RightAngle(
    line1,
    line2,
    quadrant=(-1, -1),
)
Elbow(width=0.5)
Elbow(width=1)
Elbow(width=1, angle=PI / 2)
Elbow(width=1, angle=5 * PI / 4)

4. 附件

文中完整的代码放在网盘中了(angle.py),

下载地址: 完整代码 (访问密码: 6872)

标签:Angle,标记,--,line2,line1,角度,边学边,dot,manim
From: https://www.cnblogs.com/wang_yb/p/18401449

相关文章

  • Android init.rc
    Android.rc执行顺序:onearly-initoninitonlate-init onearly-fs onfs onpost-fs onlate-fs class_startearly_hal onpost-fs-data load_persist_props_action zygote-start firmware_mounts_complete onearly-boot onboot class_starthal class_startcoreontri......
  • 关于Tailscale Subnet routers要说的
    国内的水文很多,Tailscale的部署就不说了。简单的都有讲到,但凡深度一点儿的只能找找外边儿的文章了。昨天刚给群晖装完Tailscale,打算着利用Subnetrouters功能来访问另外的2个子网。国内的水文在介绍这一段使用的时候是这样的:该文章提到:如果有多个网段添加,就多运行上面说到的......
  • ACM中的AC题(BFS,三维vis,牛客小白月赛)
    题目来源:https://ac.nowcoder.com/acm/contest/88878/D//题意:迷宫中,两个人,走的每一步两个人的方向都是相反的,问两个人都走到地图中‘@’,最少的步数(地图上多个‘@’)。//思路:难点就在可以一个人到了,然后另一个人再独自走,就不用考虑到了那个人了。说明一个人独自走是可能会走重复......
  • 可视化编程和低代码编程
      计算机编程是比较晦涩和需要大脑思考的工作。管理程序员就像管理一群骄傲的猫。计算机科学学科上个世纪中业就有规范的大学学习课程。计算机硬件和编程语言的设计更新很快。编写开发设计语言的程序源码,编译器编译成机器能够识别的机器码之后运行科学计算机硬件之上,需要大......
  • python PaddleOCR库用法及知识点详解
    识别图片的设置https://blog.csdn.net/f2315895270/article/details/128147744?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-128147744-blog-89082526.pc_relevant_default&spm=1001.2101.3001.4242.1&utm_relevant_in......
  • ROS话题通信
    #发布方#以发布订阅的方式实现不同节点之间数据交互的通讯模式,用于不断更新的、少逻辑处理的数据传输场景impoosytrospyfromstd_msgs.msgimportString#初始化ROS节点(命门)rospy.init_node("talker_1")#实例化发布者对象pub_1=rospy.Publisher("chatter",String......
  • CASIA-OLHWDB1.0-1.2数据集解析
    OLHWDB1.0-1.2提供联机手写单字数据。OLHWDB1.0收录汉字3866个,字母数字及符号171个。其中,GB2312-80一级集(共3755个字符)收录汉字3740个。OLHWDB1.1收录GB2312-80一级集汉字3755个,字母数字及符号171个。OLHWDB1.2收录汉字3319个,字母数字及符号171个。OLHWDB1.2的汉字集(3319类)与OL......
  • 枚举测试
      /***枚举类*/publicenumSocialTypeEnum{FACEBOOK(1),//脸书GITEE(2),//GITEEWECHAT_ENTERPRISE(3);//企业微信privatefinalinttype;SocialTypeEnum(inttype){this.type=type;}publicintgetType(){......
  • rk3566 rk3588 Android11/13 给内置APP添加相关权限,无需手动同意APP权限
    现象:打开APP会跳出权限弹窗,给APP相关权限才能够使用APP。目录1、adb查看logcat2、在SystemUIService.java内给APP添加加权限3、开机自启动APP4、executeCMD函数1、adb查看logcat打开APP,logcat会打印APP包名。我这边包名是com.jhooit.endoscope2、在SystemUIService.......
  • AI大语言模型LLM学习-WebAPI搭建
    系列文章1.AI大语言模型LLM学习-入门篇2.AI大语言模型LLM学习-Token及流式响应前言在上一篇博文中,我们调用了在线大模型API,并用Python写了一个控制台流式对话客户端,基本能愉快的与大模型对话聊天了。但控制台总归太技术化,我们希望能有个类似ChatGPT那样的Web......