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)

manim边学边做--角度标记的更多相关文章

  1. 学EE做硬件找工作不如学CS做软件,为什么会这样?

    学EE做硬件找工作不如学CS做软件,为什么会这样? 电子工程(EE)就业最好的方向居然是转计算机,也许让有的人觉得很不公平,EE也是很重要的学科,我们学习也很努力,为什么就业会不如CS?也有的人好奇, ...

  2. 牛腩学Kotlin做Android应用

    牛腩学Kotlin做Android应用,蹭热度视频,边学边做, 01-kotlin插件安装及hello world 02-kotlin基础语法速览 哔哩哔哩观看地址:http://www.bilibi ...

  3. php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习)

    php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习) 一.总结 1.递归不优化的话,30层开外就有点吃力了 2.php因为定义变量的时候不用定义变量类型,所以数组里面的类型也是p ...

  4. html5-3 html5标签(热点地图如何实现)(边学边做)

    html5-3 html5标签(热点地图如何实现)(边学边做) 一.总结 一句话总结:热点地图用绝对定位实现. 1.自定义列表怎么弄? dl  自定义列表dt  自定义标题dd  自定义列表内容 2. ...

  5. 第一份开发工作,边学边做android

    我刚刚毕业,在培训学校学的Java web开发,虽然学的没有大学生那么丰富细致,没有他们理论基础扎实,但是这是我学习软件开发的唯一方式了. 从小学我学习就是倒数2.3等,所有人都认为我是个没法学习的孩 ...

  6. 边学边做,简单的 GraphQL 实例

    项目中有功能要调用 API,对方 API 用的是 GraphQL 实现,就简单学了下,感叹技术进步真快,Facebook 发明的这玩意儿咋这么牛逼,使前端开发人员变得主动起来,想要什么接口.返回什么结 ...

  7. 如何做一个标记为安全的ACTIVEX控件

    1.添加辅助函数控件的基本结构中含有xxApp,xxCtrl,xxPropPage三个类.找到xxApp的头文件,添加三个辅助函数.// Helper functionto create a comp ...

  8. LabVIEW Actor Framwork (2)________ 边学边做server&client

    回顾下初始需求: 现在要做一个类似聊天的demo,一个server端,若干个client端:首先是server启动,通过server可以打开若干个client端,然后每个client可以独立给serv ...

  9. transient 做个标记

    import java.io.*; import java.util.*; public class Logon implements Serializable { /** * */ private ...

  10. 如何在WebGL全景图上做标记

    WebGL可以用来做3D效果的全景图呈现,例如故宫的全景图.但有时候我们不仅仅只是呈现全景图,还需要增加互动.故宫里边可以又分了很多区域,例如外朝中路.外朝西路.外朝东路等等.我们需要在3D图上做一些 ...

随机推荐

  1. springboot实现异步调用demo

    springboot实现异步调用 异步调用特点 异步调用在开发程序中被广泛应用,在异步任务中,主线程不需要阻塞等待异步任务的完成,而是可以继续处理其他请求. 异步调用的特点如下: 非阻塞:主线程在调用 ...

  2. javaweb使用gson工具使浏览器返回json数据

    1.什么是序列化和反序列化 (1)Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程: (2)序列化:对象序列化的最主要的用处就是在传递和保 ...

  3. VPS测试脚本,网络线路,路由测试,流媒体服务器测试脚本

    ​ 收集了一些服务器测试脚本,测试性能,网络以及解锁Netflix等服务.记录收集一下,特此记录. yabs测试脚本wget -qO- yabs.sh | bash 老外比较爱用的服务器性能测试脚本. ...

  4. 基于Docker安装项目管理工具禅道

    禅道是通用的项目管理软件 完整支持敏捷项目模型.瀑布项目模型.看板模型 内置项目集.产品.项目和执行四个管理框架 支持CMMI标准的落地实施 下载镜像 docker pull easysoft/zen ...

  5. [oeasy]python0007_ print函数_字符串_display_电传打字机_程序员的浪漫

    你好世界 回忆上次内容 上次 想输出 Hello world! 据说是程序猿的浪漫   键盘按键 作用 ↑ 上一条指令 ↓ 下一条指令 ← 光标 向左移动 一格 → 光标 向右移动 一格 ctrl + ...

  6. 学习笔记--Java方法中的注意事项

    Java方法中的注意事项 方法调用 Java的方法在同一个类中调用,可以省略 类名. /* 方法调用 */ public class MethodTest03{ public static void ...

  7. TypeScript快速上手

    TypeScript快速上手 参考TypeScript零基础入门 轻松搞定ts进行整理 TS文档:TypeScript: The starting point for learning TypeScr ...

  8. 滑块解锁-scratch编程作品

    程序说明: <滑块解锁>是一款基于Scratch平台制作的益智类小游戏.游戏中存在多个黄色滑块阻挡红色滑块通往出口的路径.玩家需要通过逻辑思考和精确操作,滑动黄色滑块以开辟道路,使红色滑块 ...

  9. P9058 [Ynoi2004] rpmtdq 与 P9678 [ICPC2022 Jinan R] Tree Distance

    思路: 注意到点对数量有 \(N^2\) 个,考虑丢掉一些无用的点对. 对于点对 \((x_1,y_1),(x_2,y_2)\),满足 \(x_1 \le x_2 < y_2 \le y_1\) ...

  10. Kotlin 字符串教程:深入理解与使用技巧

    Kotlin 字符串 字符串用于存储文本. 字符串包含由双引号包围的字符集合: 示例 var greeting = "Hello" 与 Java 不同,您不必指定变量是字符串.Ko ...