Skip to main content

manim-straightedge-compass

一个用于 Manim 的尺规作图动画插件:圆规会带着针尖与铅笔腿真实地旋转扫出圆弧,直尺会落到两点之间、铅笔沿尺边滑动画出直线。配合一组几何求交工具,可以用声明式的几行代码还原欧几里得式尺规作图。

  • 圆规 Compass:金属双腿 + 红色针尖 + 黄色铅笔,绕针尖刚性旋转,弧与铅笔尖严格同步
  • 直尺 Straightedge:半透明尺身、刻度、高亮刃边,自动对齐任意两点
  • 几何工具:圆–圆、圆–直线、直线–直线求交,中点、角度、选点等
  • 场景基类 EuclidScene:mark_point / draw_circle / draw_arc / draw_segment 四个方法完成大部分作图
  • 6 个经典示例:等边三角形、垂直平分线(中点)、角平分线、过点作垂线、圆内接正六边形、复制线段
  • 进阶示例:正十七边形(Richmond 尺规作法,辅助线分批淡出)

安装

# 需要先具备 manim 的系统依赖(ffmpeg、LaTeX 等),见 https://docs.manim.community/
pip install manim

# 安装本插件(在项目根目录)
pip install -e .

不安装也可以使用:直接把 manim_sc 目录放进工程,或在示例脚本中 sys.path.insert(0, <项目根目录>)(示例文件已这样处理)。

快速开始

from manim_sc import (
    EuclidScene, P,
    circle_circle_intersection, uppermost,
)

class EquilateralTriangle(EuclidScene):
    def construct(self):
        A, B = P(-1.5, -0.7), P(1.5, -0.7)
        r = 3.0                                   # 圆规张开的半径
        self.mark_point(A, "A")                   # 标注点
        self.mark_point(B, "B")
        self.draw_circle(A, radius=r)             # 圆规画圆
        self.draw_circle(B, radius=r)
        C = uppermost(circle_circle_intersection(A, r, B, r))
        self.mark_point(C, "C")
        self.draw_segment(A, B)                   # 直尺画线
        self.draw_segment(A, C)
        self.draw_segment(B, C)
        self.wait(1)

渲染:

manim -qm examples/equilateral_triangle.py EquilateralTriangle

API 文档

EuclidScene 场景基类

方法 说明
intro(title) 显示中文标题并缩到左上角
mark_point(p, label=None, direction=UP, color=..., radius=0.06) 在 p 处落下红点,可选 LaTeX 标签与标签方向
draw_circle(center, through=None, radius=None, color=CONSTRUCTION_COLOR, start_angle=0) 圆规画整圆;半径可直接给,或给圆周上一点 through 自动量取
draw_arc(center, radius, start_angle=0, angle=TAU, color=..., stroke_width=2, keep_compass=False) 圆规扫一段弧;keep_compass=True 时圆规不收走,便于保持张角搬到下一个圆心
draw_segment(p1, p2, color=RESULT_COLOR, stroke_width=4, keep_ruler=False) 直尺对齐 p1p2,铅笔从 p1 滑到 p2 画出线段;连续画多边形边时传 keep_ruler=True,最后调用 retire_ruler() 收尺
retire_ruler() 一组 keep_ruler=True 线段画完后把直尺移出画面

工具会自动从画面下方移入、作画、再移出;颜色常量 CONSTRUCTION_COLOR(蓝,辅助痕迹)、CONSTRUCTION_GREEN(绿,第二组痕迹)、RESULT_COLOR(黄,最终结果)、RESULT_RED 可直接导入。

几何工具(manim_sc.geometry,纯 numpy 计算,与渲染无关)

P(x, y)                               # 构造点 (x, y, 0)
distance(a, b);midpoint(a, b);angle_of(a, b);unit(v);point_on(c, r, theta)
circle_circle_intersection(c1, r1, c2, r2)   # -> 0/1/2 个交点
circle_line_intersection(center, r, p1, p2)  # 圆与(无限长)直线的交点
line_line_intersection(p1, p2, p3, p4)       # 两直线交点或 None
uppermost / lowermost / leftmost / rightmost(points)   # 选点
other(two_points, given)             # 两点中不是 given 的另一个

工具 Mobject 与动画(可脱离基类自由编排)

from manim_sc import Compass, CompassDrawArc, Straightedge, PencilTip, RulerDraw, Arc, Line, TAU

compass = Compass(radius=1.5, start_angle=0, center=P(0, 0))
compass.pose(center, radius, theta)          # 定位(可配合 .animate)
arc = Arc(radius=1.5, start_angle=0, angle=1e-6, arc_center=center)
self.play(CompassDrawArc(compass, arc, TAU)) # 边旋转边出弧

ruler = Straightedge()
ruler.pose(p1, p2)                            # 刃边对齐两点
line = Line(p1, p1)
tip = PencilTip(p1)
self.play(RulerDraw(line, tip, p1, p2))       # 铅笔滑过,线段生长

Compass 腿长、颜色,Straightedge 长度/宽度/填充透明度等都可在构造时调整 (见 manim_sc/compass.py、manim_sc/straightedge.py 顶部常量)。

示例

文件 内容
examples/equilateral_triangle.py 等边三角形(《原本》I.1)
examples/perpendicular_bisector.py 线段的垂直平分线与中点
examples/angle_bisector.py 角平分线
examples/perpendicular_from_point.py 过直线外一点作垂线、垂足
examples/regular_hexagon.py 圆内接正六边形(边长 = 半径)
examples/copy_segment.py 圆规保持张角,把线段长度搬到射线上
examples/heptadecagon.py 正十七边形(Richmond 作法)完整过程:垂直直径、J 点两次平分、两次角平分、45° 角的垂线+平分、两构造圆定出 P3/P4/P5,圆规绕圆截取全部顶点;每步的中间痕迹在完成使命后分批淡出

渲染全部示例:

for f in examples/*.py; do manim -qm "$f"; done

项目结构

manim-straightedge-compass/
├── manim_sc/
│   ├── __init__.py        # 公共导出
│   ├── geometry.py        # 纯几何:交点、选点、向量工具
│   ├── compass.py         # Compass 圆规 + CompassDrawArc 动画
│   ├── straightedge.py    # Straightedge 直尺 + PencilTip + RulerDraw
│   ├── marks.py           # MarkedPoint 点与标签
│   └── scene.py           # EuclidScene 高层场景基类
├── examples/              # 六个经典作图示例
└── demo/                  # 预渲染的 720p 演示视频

许可

MIT

Metadata

Release files for manim-straightedge-compass 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for manim-straightedge-compass 0.1.1
File Size Uploaded
manim_straightedge_compass-0.1.1.tar.gz 16.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for manim-straightedge-compass 0.1.1
File Interpreter ABI Platform
manim_straightedge_compass-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 31.9 kB

Release files / manim_straightedge_compass-0.1.1.tar.gz

Download URL manim_straightedge_compass-0.1.1.tar.gz
Size 16.9 kB
Tags Source
SHA-256 checksum
How to use checksums
c79323f7b98cdbb22f294d8627e2f78e0478f64905e7ac5aceeaf3561e661550
BLAKE2b-256 checksum
How to use checksums
7f20192e1a908008eca852bf8fa30dbff75f66d7c22186e95af46727f990589d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.8.6

Release files / manim_straightedge_compass-0.1.1-py3-none-any.whl

Download URL manim_straightedge_compass-0.1.1-py3-none-any.whl
Size 15.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
02c34db9acd5e3505017d23525c4741358d63c8628657e0be2f510ca4de7e06a
BLAKE2b-256 checksum
How to use checksums
b9add9825eaa41a1d292f7203226351cd2d2901c722cc31a3570497b0ec890d1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.8.6

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page