样例学习 ========== ``examples.py`` 提供了一些样例 .. janim-example:: HelloJAnimExample :media: ../_static/videos/HelloJAnimExample.mp4 from janim.imports import * class HelloJAnimExample(Timeline): def construct(self): # define items circle = Circle(color=BLUE) square = Square(color=GREEN, fill_alpha=0.5) # do animations self.forward() self.play(Create(circle)) self.play(Transform(circle, square)) self.play(Uncreate(square)) self.forward() .. janim-example:: SimpleCurveExample :media: ../_static/videos/SimpleCurveExample.mp4 from janim.imports import * class SimpleCurveExample(Timeline): def construct(self): item1 = VItem( LEFT * 2, DR, UR * 3 + UP, RIGHT * 4, DR * 2, DOWN * 2, LEFT * 2, NAN_POINT, DL * 3, DL * 2, DOWN * 3, DL * 4, DL * 3, ) item1.fill.set(alpha=0.5) item1.show() self.forward(0.5) self.play(item1.anim.color.set(BLUE)) self.play(Rotate(item1, -90 * DEGREES)) self.forward(0.5) item2 = VItem(LEFT, UP, RIGHT, DOWN, LEFT) item2.color.set(BLUE) item2.fill.set(alpha=0.2) state = self.camera.copy() self.play(self.camera.anim.points.scale(0.5)) self.play(self.camera.anim.become(state)) self.play( Transform(item1, item2), duration=2 ) self.forward(1) .. janim-example:: TextExample :media: ../_static/videos/TextExample.mp4 from janim.imports import * class TextExample(Timeline): def construct(self): txt = Text('Here is a text', font_size=64) desc = Group( Text('You can also apply styles to the text.', format=Text.Format.RichText), Text('You can also apply styles to the text.', format=Text.Format.RichText), ) group = Group(txt, desc) group.points.arrange(DOWN, buff=MED_LARGE_BUFF) self.forward() self.play(Write(txt)) self.play(FadeIn(desc[0], UP)) self.play(Transform(desc[0], desc[1])) self.forward() .. janim-example:: TypstExample :media: ../_static/videos/TypstExample.mp4 from janim.imports import * typst_doc = ''' JAnim provides #text(green)[`TypstDoc`] class to insert typst document. Math expressions are also available. $ A = pi r^2 $ $ "area" = pi dot "radius"^2 $ $ cal(A) := { x in RR | x "is natural" } $ #let x = 5 $ #x < 17 $ The difference between #text(green)[`TypstDoc`] and #text(green)[`Typst`]: - #text(green)[`TypstDoc`] automatically align to the top of view, so you can see the document from the start. - The content of #text(green)[`Typst`] is wrapped by math environment and move to the center by default. ''' class TypstExample(Timeline): def construct(self): doc = TypstDoc(typst_doc) typ = Typst('sum_(i=1)^n x_i') # Applying animations on text is slow self.play(Write(doc), duration=4) self.forward() self.play(FadeOut(doc)) self.play(Write(typ)) self.forward() self.play(FadeOut(typ)) .. janim-example:: AnimatingPiExample :media: ../_static/videos/AnimatingPiExample.mp4 from janim.imports import * class AnimatingPiExample(Timeline): def construct(self): grid = Typst('pi') * 100 grid.points.scale(2).arrange_in_grid(10, 10, buff=0.2) grid.show() self.play(grid.anim.points.shift(LEFT)) self.play(grid(VItem).anim.color.set(YELLOW)) self.forward() self.play(grid(VItem).anim.color.set(BLUE)) self.forward() self.play(grid.anim.points.to_center().set_height(TAU - MED_SMALL_BUFF)) self.forward() self.play(grid.anim.points.apply_complex_fn(np.exp), duration=5) self.forward() self.play( grid.anim.points.apply_point_fn( lambda p: [ p[0] + 0.5 * math.sin(p[1]), p[1] + 0.5 * math.sin(p[0]), p[2] ] ), duration=5 ) self.forward() .. janim-example:: NumberPlaneExample :media: ../_static/videos/NumberPlaneExample.mp4 from janim.imports import * class NumberPlaneExample(Timeline): def construct(self): plane = NumberPlane(faded_line_ratio=1) sin_graph = plane.get_graph(lambda x: math.sin(x)) self.forward(0.2) self.play(Write(plane, lag_ratio=0.05)) self.play(Write(sin_graph)) self.forward() self.play( sin_graph.anim(), plane.anim.points.apply_matrix([ [3, -1], [1, 2] ]), duration=2 ) self.forward() .. janim-example:: UpdaterExample :media: ../_static/videos/UpdaterExample.mp4 from janim.imports import * class UpdaterExample(Timeline): def construct(self): square = Square(fill_color=BLUE_E, fill_alpha=1).show() brace = Brace(square, UP).show() def text_updater(p: UpdaterParams): cmpt = brace.current().points return cmpt.create_text(f'Width = {cmpt.brace_length:.2f}') self.prepare( DataUpdater( brace, lambda data, p: data.points.match(square.current()) ), ItemUpdater(None, text_updater), duration=10 ) self.forward() self.play(square.anim.points.scale(2)) self.play(square.anim.points.scale(0.5)) self.play(square.anim.points.set_width(5, stretch=True)) w0 = square.points.box.width self.play( DataUpdater( square, lambda data, p: data.points.set_width( w0 + 0.5 * w0 * math.sin(p.alpha * p.range.duration) ) ), duration=5 ) self.forward()