예제 #1
0
 def construct(self):
     sub1 = CText('这将是一个')
     sub2 = CText('关于线段长度的性质')
     subs = VGroup(sub1, sub2)
     subs.arrange(DOWN)
     self.play(Write(sub1))
     self.play(Write(sub2))
     self.wait(2)
     self.play(FadeOut(subs))
예제 #2
0
    def construct(self):
        text1 = CText('这是一条重要的性质')
        text2 = CText('后面会经常用到')

        group = VGroup(text1, text2)
        group.arrange(DOWN)

        self.play(Write(text1))
        self.wait()
        self.play(Write(text2))
        self.wait()
        self.play(FadeOut(group))
예제 #3
0
    def construct(self):
        sub1 = CText('根据性质1')
        sub2 = CText('可以用另一种方法找到')
        sub3 = CText('抛物线上的点')

        subs = VGroup(sub1, sub2, sub3)
        subs.arrange(DOWN)

        self.play(Write(sub1))
        self.wait()
        self.play(Write(sub2))
        self.wait()
        self.play(Write(sub3))
        self.wait(5)
        self.play(FadeOut(subs))
예제 #4
0
    def construct(self):
        text = CText('总结')
        text.set_fill(DARK_BROWN)

        content1 = CText('抛物线任意弦与准线的交点')
        content2 = CText('及该抛物线的焦点所构成的线段,')
        content3 = CText('平分该弦两端点与焦点所构成角的外角')
        contents = VGroup(content1, content2, content3)
        contents.scale(0.7)
        contents.arrange(DOWN)

        total = VGroup(text, contents)
        total.arrange(DOWN, buff=MED_LARGE_BUFF)

        self.play(Write(text))
        self.wait(2)
        self.play(Write(contents))
        self.wait(10)
예제 #5
0
    def construct(self):
        line1_1 = CText('抛物线')
        line1_1.set_fill(DARK_BLUE)

        line1_2 = CText('性质三')
        line1 = VGroup(line1_1, line1_2)
        line1.arrange(RIGHT)
        line2 = CText('推论一')
        lines = VGroup(line1, line2)
        lines.arrange(DOWN, buff=LARGE_BUFF)
        self.play(Write(line1))
        self.wait(3)
        self.play(Write(line2))
        self.wait(3)

        self.play(FadeOut(lines))
예제 #6
0
    def construct(self):
        text = CText('总结')
        text.set_fill(DARK_BROWN)

        content1 = CText('纵标线的平方等于')
        content2 = CText('横标线与焦距乘积的四倍')
        contents = VGroup(content1, content2)
        contents.scale(0.7)
        contents.arrange(DOWN)

        total = VGroup(text, contents)
        total.arrange(DOWN, buff=MED_LARGE_BUFF)

        self.play(Write(text))
        self.wait(2)
        self.play(Write(contents))
        self.wait(10)
예제 #7
0
    def construct(self):
        self.adjust_x_range()
        graph = self.get_graph(color=LIGHT_BROWN)
        directrix = self.get_directrix()
        focus = Dot().move_to(self.get_focus())
        focus.set_fill(DARK_BROWN)
        focus.plot_depth = 2
        focusLabel = TexMobject('F').scale(0.5)
        focusLabel.next_to(focus, RIGHT, buff=SMALL_BUFF)

        self.play(*[ShowCreation(e) for\
            e in [graph, directrix, focus, focusLabel]])
        self.wait()

        sub1 = CText('任取一点P').scale(0.3)
        sub1.to_edge(RIGHT)
        self.play(ShowCreation(sub1))

        y_val = ValueTracker(6)

        p = Dot()
        p.plot_depth = 1
        p.set_fill(DARK_BLUE)
        p.add_updater(lambda m:\
            m.move_to(self.coords_to_point(
                self.func(y_val.get_value()),
                y_val.get_value()
            )))

        self.play(ShowCreation(p))

        p_label = TexMobject('P').scale(0.5)
        p_label.plot_depth = 1
        p_label.add_updater(lambda m:\
            m.next_to(p, RIGHT, buff=SMALL_BUFF))
        self.play(ShowCreation(p_label))
        self.wait()

        self.play(FadeOut(sub1))

        sub2 = CText('过点P做抛物线的切线')
        sub2.scale(0.3)
        sub2.to_edge(RIGHT)
        self.play(ShowCreation(sub2))
        self.wait()

        tangent = Line()
        self.add_tangent_line_updater(tangent, p)
        # self.play(ShowCreation(tangent))
        # self.wait()

        tangent_extent = Line()

        def get_extent(l, p, t):
            l.put_start_and_end_on(LEFT * 10, RIGHT * 10)
            l.set_angle(t.get_angle() + PI)
            l.move_to(p.get_center())
        tangent_extent.add_updater(lambda l:\
            get_extent(l, p, tangent))
        tangent_line = VGroup()
        tangent_line.add(tangent)
        tangent_line.add(tangent_extent)
        self.play(ShowCreation(tangent_extent))
        self.add(tangent_line)

        self.wait()

        self.play(FadeOut(sub2))

        sub3 = CText('交准线于Z').scale(0.3)
        sub3.to_edge(RIGHT)
        self.play(ShowCreation(sub3))
        self.wait()

        z = Dot()
        z.plot_depth = 1
        z.set_fill(DARK_BLUE)
        z.add_updater(lambda m:\
            m.move_to(self.get_tangent_to_directrix(p)))
        self.play(ShowCreation(z))

        z_label = TexMobject('Z').scale(0.5)
        z_label.plot_depth = 1
        z_label.add_updater(lambda m:\
            m.next_to(z, LEFT, buff=SMALL_BUFF))
        self.play(ShowCreation(z_label))
        self.wait()

        self.play(FadeOut(sub3))
        sub4 = CText('交正焦弦于点K').scale(0.3)
        sub4.to_edge(RIGHT)
        self.play(ShowCreation(sub4))
        self.wait()

        def find_k():
            start = z.get_center()
            vec = p.get_center() - start
            vec /= vec[0]
            d = focus.get_center()[0] - start[0]
            vec *= d
            return start + vec

        k = Dot()
        k.plot_depth = 1
        k.set_fill(DARK_BLUE)
        k.add_updater(lambda m:\
            m.move_to(find_k()))

        k_label = TexMobject('K').scale(0.5)
        k_label.plot_depth = 1
        k_label.add_updater(lambda m:\
            m.next_to(k, RIGHT, buff=SMALL_BUFF))

        def find_opp():
            pos = find_k()
            fac = -1
            if pos[1] < 0:
                fac = 1
            return self.coords_to_point(self.func(self.focus * 2),
                                        fac * self.focus * 2)

        k_line = Line()
        k_line.add_updater(lambda m:\
            m.put_start_and_end_on(
                find_k(),
                find_opp()
            ))

        self.play(ShowCreation(k_line))
        self.play(ShowCreation(k))
        self.play(ShowCreation(k_label))

        self.wait()

        self.play(FadeOut(sub4))
        sub5 = CText('则ZF=KF').scale(0.3)
        sub5.to_edge(RIGHT)
        self.play(ShowCreation(sub5))
        self.wait()

        zf = Line()
        zf.set_color(RED)
        zf.add_updater(lambda m:\
            m.put_start_and_end_on(
                z.get_center(),
                focus.get_center()
            ))
        kf = Line()
        kf.set_color(RED)
        kf.add_updater(lambda m:\
            m.put_start_and_end_on(
                k.get_center(),
                focus.get_center()
            ))
        self.play(ShowCreation(zf), ShowCreation(kf))
        self.wait()

        self.play(y_val.set_value, 9, rate_func=easeOutElastic, run_time=2)
        self.wait()

        self.play(y_val.set_value, 1, rate_func=easeOutBounce, run_time=2)
        self.wait()

        self.play(y_val.set_value, -6, rate_func=easeOutElastic, run_time=2)
        self.wait()

        self.play(y_val.set_value, 8, rate_func=easeOutBounce, run_time=2)
        self.wait()

        self.play(FadeOut(sub5))

        m = Dot()
        m.plot_depth = 1
        m.set_fill(YELLOW)
        m.add_updater(lambda e:\
            e.move_to(z.get_center()[0] * RIGHT +
                p.get_center()[1] * UP))

        m_label = TexMobject('M').scale(0.5)
        m_label.add_updater(lambda e:\
            e.next_to(m, LEFT, buff=SMALL_BUFF))

        self.play(ShowCreation(m))
        self.play(ShowCreation(m_label))

        mp = DashedLine()
        mp.add_updater(lambda l:\
            l.put_start_and_end_on(
                m.get_center(),
                p.get_center()
            ))
        self.play(ShowCreation(mp))

        fp = DashedLine()
        fp.add_updater(lambda l:\
            l.put_start_and_end_on(
                focus.get_center(),
                p.get_center()
            ))
        self.play(ShowCreation(fp))
        self.wait()

        km = DashedLine()
        km.add_updater(lambda l:\
            l.put_start_and_end_on(
                k.get_center(),
                m.get_center()
            ))
        self.play(ShowCreation(km))

        k2 = Dot()
        k2.plot_depth = 1
        k2.set_fill(YELLOW)
        k2.add_updater(lambda m:\
            m.move_to(
                k.get_center()[1] * UP +
                z.get_center()[0] * RIGHT
            ))
        self.play(ShowCreation(k2))

        k2_label = TexMobject('K\'').scale(0.5)
        k2_label.add_updater(lambda m:\
            m.next_to(k2, LEFT, buff=SMALL_BUFF))
        self.play(ShowCreation(k2_label))

        kk2 = DashedLine()
        kk2.add_updater(lambda l:\
            l.put_start_and_end_on(
                k.get_center(),
                k2.get_center()
            ))
        self.play(ShowCreation(kk2))

        z2 = Dot()
        z2.plot_depth = 1
        z2.set_fill(YELLOW)
        z2.add_updater(lambda m:\
            m.move_to(
                z.get_center()[1] * UP +
                focus.get_center()[0] * RIGHT
            ))
        self.play(ShowCreation(z2))

        z2f = Line()
        z2f.plot_depth = -1
        z2f.add_updater(lambda l:\
            l.put_start_and_end_on(
                z2.get_center(),
                focus.get_center()
            ))
        self.add(z2f)

        z2_label = TexMobject('Z\'').scale(0.5)
        z2_label.add_updater(lambda m:\
            m.next_to(z2, UR, buff=SMALL_BUFF))
        self.play(ShowCreation(z2_label))

        zz2 = DashedLine()
        zz2.add_updater(lambda l:\
            l.put_start_and_end_on(
                z.get_center(),
                z2.get_center()
            ))
        self.play(ShowCreation(zz2))
        self.wait()

        self.play(kk2.set_color, RED)
        self.play(zz2.set_color, RED)

        proof = VGroup()
        proof1 = CText('证明思路').scale(0.3)
        proof2 = TexMobject('KK\'=ZZ\'').scale(0.5)
        proof3 = TexMobject('\\triangle ZKM \\cong \\triangle ZKF')
        proof3.scale(0.5)
        proof.add(proof1)
        proof.add(proof2)
        proof.add(proof3)
        proof.arrange(DOWN)
        proof.to_edge(RIGHT, buff=LARGE_BUFF)
        proof2.align_to(proof1, LEFT)
        proof3.align_to(proof2, LEFT)
        self.play(ShowCreation(proof))
        self.wait(5)

        zkm = Polygon(z.get_center(), k.get_center(), m.get_center())
        zkm.set_fill(DARK_BLUE, opacity=0.5)

        zkf = Polygon(z.get_center(), k.get_center(), focus.get_center())
        zkf.set_fill(DARK_BLUE, opacity=0.5)

        self.play(ShowCreationThenDestruction(zkm),
                  ShowCreationThenDestruction(zkf))
        self.wait(15)

        self.play(y_val.set_value, 1, rate_func=easeOutBounce)
        self.wait(5)

        self.play(y_val.set_value, -1, rate_func=easeOutElastic)
        self.wait(5)

        self.play(y_val.set_value, -8, rate_func=easeOutBounce)
        self.wait(5)
예제 #8
0
    def construct(self):
        self.adjust_x_range()
        graph = self.get_graph(color=LIGHT_BROWN)
        directrix = self.get_directrix()
        focus = Dot().move_to(self.get_focus())
        focus.set_fill(DARK_BROWN)
        focus.plot_depth = 1
        focusLabel = TexMobject('F').scale(0.5)
        focusLabel.next_to(focus, RIGHT, buff=SMALL_BUFF)

        self.play(*[ShowCreation(e) for\
            e in [graph, directrix, focus, focusLabel]])

        sub1 = CText('P1P2为抛物线正焦弦').scale(0.3)
        sub1.to_edge(RIGHT)

        self.wait(2)
        self.play(Write(sub1))

        p1 = Dot()
        p1.move_to(self.coords_to_point(self.focus, 2 * self.focus))
        p1.plot_depth = 1
        p1.set_fill(DARK_BROWN)

        p2 = Dot()
        p2.move_to(self.coords_to_point(self.focus, -2 * self.focus))
        p2.plot_depth = 1
        p2.set_fill(DARK_BROWN)

        p1_label = TexMobject('P_1').scale(0.5)
        p1_label.next_to(p1, RIGHT)

        p2_label = TexMobject('P_2').scale(0.5)
        p2_label.next_to(p2, RIGHT)

        self.play(ShowCreation(p1), ShowCreation(p2))
        self.play(ShowCreation(Line(p1, p2)))
        self.play(ShowCreation(p1_label), ShowCreation(p2_label))
        self.wait()

        x = Dot()
        x.move_to(self.coords_to_point(-self.focus, 0))
        x.set_fill(DARK_BROWN)
        x.plot_depth = 1

        x_label = TexMobject('X').scale(0.5)
        x_label.next_to(x, LEFT)

        sub2 = CText('X为轴与准线的交点').scale(0.3)
        sub2.to_edge(RIGHT)

        self.play(FadeOut(sub1))
        self.play(FadeIn((sub2)))
        self.wait()

        h_line = Line(focus, x)
        h_line.plot_depth = 2

        self.play(ShowCreation(h_line))
        self.play(ShowCreation(x))
        self.play(FadeOut(h_line))
        self.play(Write(x_label))
        self.wait()

        sub3 = CText('则P1与P2的切线交于X').scale(0.3)
        sub3.to_edge(RIGHT)

        self.play(FadeOut(sub2))
        self.play(Write(sub3))

        p1_tangent = Line()
        self.add_tangent_line_updater(p1_tangent, p1)

        p2_tangent = Line()
        self.add_tangent_line_updater(p2_tangent, p2)

        self.play(ShowCreation(p1_tangent), ShowCreation(p2_tangent))

        self.wait()

        self.play(ShowCreation(DashedLine(x, focus)))

        m1 = Dot()
        m1.move_to(self.coords_to_point(-self.focus, 2 * self.focus))
        m1.set_fill(DARK_BROWN)
        m1.plot_depth = 1

        m1_label = TexMobject('M_1').scale(0.5)
        m1_label.next_to(m1, LEFT)

        self.play(ShowCreation(m1))
        self.play(ShowCreation(m1_label))
        self.play(ShowCreation(DashedLine(p1, m1)))

        sub4 = CText('在正方形XFP1M1中,XP1是对角线')
        sub4.scale(0.3)
        sub4.to_edge(RIGHT)
        self.play(FadeOut(sub3))
        self.play(Write(sub4))

        self.wait(5)
        self.play(
            ShowCreationThenDestruction(
                Polygon(x.get_center(), focus.get_center(), p1.get_center(),
                        m1.get_center())))

        sub5 = CText('XP1也正好平分角M1P1F,因此是过P1点的切线')
        sub5.scale(0.3)
        sub5.to_edge(RIGHT)

        self.wait(5)
        self.play(FadeOut(sub4))
        self.play(Write(sub5))

        sub6 = CText('同理,P2X也为切线')
        sub6.scale(0.3)
        sub6.to_edge(RIGHT)

        self.wait(5)
        self.play(FadeOut(sub5))
        self.play(Write(sub6))

        sub7 = CText('总结:抛物线正焦弦端点切线交于准线与轴的交点')
        sub7.scale(0.3)
        sub7.to_edge(RIGHT)

        self.wait(5)
        self.play(FadeOut(sub6))
        self.play(Write(sub7))

        self.wait(10)
예제 #9
0
    def construct(self):
        self.adjust_x_range()
        graph = self.get_graph(color=LIGHT_BROWN)
        directrix = self.get_directrix()
        focus = Dot().move_to(self.get_focus())
        focus.set_fill(DARK_BROWN)
        focus.plot_depth = 1
        focusLabel = TexMobject('F').scale(0.5)
        focusLabel.next_to(focus, RIGHT, buff=SMALL_BUFF)

        self.play(*[ShowCreation(e) for\
            e in [graph, directrix, focus, focusLabel]])

        y_val = ValueTracker(8)

        p = Dot()
        p.plot_depth = 1
        p.set_fill(DARK_BLUE)
        p.add_updater(lambda m:\
            m.move_to(self.coords_to_point(
                self.func(y_val.get_value()),
                y_val.get_value()
            )))

        p_label = TexMobject('P').scale(0.5)
        p_label.plot_depth = 1
        p_label.add_updater(lambda m:\
            m.next_to(p, RIGHT, buff=SMALL_BUFF))

        k = Dot()
        k.plot_depth = 1
        k.set_fill(DARK_BLUE)
        k.add_updater(lambda m:\
            m.move_to(self.get_tangent_to_directrix(
                p
            )))

        k_label = TexMobject('K').scale(0.5)
        k_label.plot_depth = 1
        k_label.add_updater(lambda m:\
            m.next_to(k, LEFT, buff=SMALL_BUFF))

        tangent = Line()
        self.add_tangent_line_updater(tangent, p)

        self.play(ShowCreation(p))
        self.play(ShowCreation(p_label))
        self.play(ShowCreation(tangent))
        self.play(ShowCreation(k))
        self.play(ShowCreation(k_label))

        def get_extent(l):
            l.put_start_and_end_on(p.get_center(), RIGHT * 10)
            l.set_angle(tangent.get_angle() + PI)

        tangent_extent = Line()
        tangent_extent.add_updater(lambda l:\
            get_extent(l))

        self.play(ShowCreation(tangent_extent))
        self.wait()

        m = Dot()
        m.set_fill(DARK_BLUE)
        m.plot_depth = 1
        m.add_updater(lambda e:\
            e.move_to(self.coords_to_point(
                -self.focus,
                y_val.get_value()
            )))

        m_label = TexMobject('M').scale(0.5)
        m_label.add_updater(lambda e:\
            e.next_to(m, LEFT, buff=SMALL_BUFF))

        mp = Line()
        mp.add_updater(lambda l:\
            l.put_start_and_end_on(
                p.get_center(),
                self.coords_to_point(
                    -self.focus,
                    y_val.get_value()
            )))

        fp = Line()
        fp.add_updater(lambda l:\
            l.put_start_and_end_on(
                focus.get_center(),
                p.get_center()
            ))

        self.play(ShowCreation(mp), ShowCreation(fp))
        self.play(ShowCreation(m))
        self.play(ShowCreation(m_label))

        kf = Line()
        kf.add_updater(lambda l:\
            l.put_start_and_end_on(
                k.get_center(),
                focus.get_center()
            ))
        self.play(ShowCreation(kf))
        self.wait()

        sub1 = CText('在切线上任取一点O')
        sub1.scale(0.3)
        sub1.to_edge(RIGHT)

        self.play(Write(sub1))
        self.wait()

        ot = ValueTracker(0.2)
        vec_kp = p.get_center() - k.get_center()

        o = Dot()
        o.plot_depth = 1
        o.set_fill(RED)
        o.add_updater(lambda m:\
            m.move_to(k.get_center() +\
                vec_kp * ot.get_value()))

        o_label = TexMobject('O').scale(0.5)
        o_label.plot_depth = 1
        o_label.add_updater(lambda m:\
            m.next_to(o, DR, buff=SMALL_BUFF))

        self.play(ShowCreation(o))
        self.play(ShowCreation(o_label))
        self.wait()

        sub2 = CText('则OM=OF')
        sub2.scale(0.3)
        sub2.to_edge(RIGHT)

        self.play(FadeOut(sub1))
        self.play(Write(sub2))
        self.wait()

        om = Line()
        om.add_updater(lambda l:\
            l.put_start_and_end_on(
                o.get_center(),
                m.get_center()
            ))
        of = Line()
        of.add_updater(lambda l:\
            l.put_start_and_end_on(
                o.get_center(),
                focus.get_center()
            ))

        self.play(ShowCreation(om), ShowCreation(of))
        self.wait()

        self.play(ot.set_value, 0.05)
        self.wait()
        self.play(ot.set_value, 0.8)
        self.wait()
        self.play(ot.set_value, 1.2)
        self.wait()
        self.play(ot.set_value, 0.6)
        self.wait(3)
예제 #10
0
    def construct(self):
        self.adjust_x_range()
        graph = self.get_graph(color=LIGHT_BROWN)
        focus = Dot().move_to(self.get_focus())
        focus.set_fill(DARK_BROWN)
        focus.plot_depth = 1
        focusLabel = TexMobject('F').scale(0.5)
        focusLabel.next_to(focus, DOWN, buff=SMALL_BUFF)
        focusLabel.plot_depth = 1

        self.play(*[ShowCreation(e) for\
            e in [graph, focus, focusLabel]])

        h_line = Line(self.coords_to_point(0, 0), ORIGIN)
        h_line.plot_depth = -1
        self.play(ShowCreation(h_line))

        a = Dot()
        a.move_to(self.coords_to_point(0, 0))
        a.plot_depth = 1
        a.set_fill(DARK_BROWN)
        a_label = TexMobject('A').scale(0.5)
        a_label.next_to(a, DL, buff=SMALL_BUFF)
        a_label.plot_depth = 1

        self.play(
            ShowCreation(a),
            Write(a_label)
        )
        self.wait()

        y_val = ValueTracker(6.5)

        p1 = Dot()
        p1.set_fill(DARK_BLUE)
        p1.plot_depth = 1
        p1.add_updater(lambda m:\
            m.move_to(self.coords_to_point(
                self.func(y_val.get_value()),
                y_val.get_value()
            )))
        p1_label = TexMobject('P_1').scale(0.5)
        p1_label.plot_depth = 1
        p1_label.add_updater(lambda m:\
            m.next_to(p1, RIGHT, buff=SMALL_BUFF))

        p2 = Dot()
        p2.set_fill(DARK_BLUE)
        p2.plot_depth = 1
        p2.add_updater(lambda m:\
            m.move_to(self.coords_to_point(
                self.func(-y_val.get_value()),
                -y_val.get_value()
            )))
        p2_label = TexMobject('P_2').scale(0.5)
        p2_label.plot_depth = 1
        p2_label.add_updater(lambda m:\
            m.next_to(p2, RIGHT, buff=SMALL_BUFF))

        p1p2 = Line()
        p1p2.add_updater(lambda m:\
            m.put_start_and_end_on(
                self.coords_to_point(
                    self.func(y_val.get_value()),
                    y_val.get_value()
                ),
                self.coords_to_point(
                    self.func(-y_val.get_value()),
                    -y_val.get_value()
            )))
        self.play(
            ShowCreation(p1),
            Write(p1_label)
        )
        self.play(ShowCreation(p1p2))
        self.play(
            ShowCreation(p2),
            Write(p2_label)
        )
        self.wait()

        n1 = Dot()
        n1.set_fill(DARK_BLUE)
        n1.plot_depth = 1
        n1.add_updater(lambda m:\
            m.move_to(p1.get_center()[0] * RIGHT))
        n1_label = TexMobject('N').scale(0.5)
        n1_label.add_updater(lambda m:\
            m.next_to(n1, DR, buff=SMALL_BUFF))
        self.play(
            ShowCreation(n1),
            Write(n1_label)
        )
        self.wait()

        q_y = ValueTracker(5)

        q = Dot()
        q.set_fill(DARK_BLUE)
        q.plot_depth = 1
        q.add_updater(lambda m:\
            m.move_to(self.coords_to_point(
                self.func(q_y.get_value()),
                q_y.get_value()
            )))
        q_label = TexMobject('Q').scale(0.5)
        q_label.plot_depth = 1
        q_label.add_updater(lambda m:\
            m.next_to(q, LEFT, buff=SMALL_BUFF))
        self.play(
            ShowCreation(q),
            Write(q_label)
        )

        self.wait()

        def get_l():
            qy = q_y.get_value()
            qx = self.func(qy)
            py = y_val.get_value()
            px = self.func(py)

            l = qy / qx * px
            return self.coords_to_point(px, l)

        l = Dot()
        l.set_fill(DARK_BLUE)
        l.plot_depth = 1
        l.add_updater(lambda m:\
            m.move_to(get_l()))
        l_label = TexMobject('L').scale(0.5)
        l_label.add_updater(lambda m:\
            m.next_to(l, RIGHT, buff=SMALL_BUFF))

        al = Line()
        al.add_updater(lambda m:\
            m.put_start_and_end_on(
                a.get_center(),
                get_l() if\
                    q_y.get_value() < y_val.get_value()\
                    else q.get_center()
            ))
        p1l = Line()
        p1l.add_updater(lambda m:\
            m.put_start_and_end_on(
                p1.get_center(),
                get_l()
            ))
        self.play(
            ShowCreation(al),
            ShowCreation(p1l))
        self.play(
            ShowCreation(l),
            Write(l_label)
        )

        self.wait()

        def get_l2():
            qy = q.get_center()[1]
            px = p1.get_center()[0]

            return px * RIGHT + qy * UP
        
        l2 = Dot()
        l2.set_fill(DARK_BLUE)
        l2.plot_depth = 1
        l2.add_updater(lambda m:\
            m.move_to(get_l2()))
        l2_label = TexMobject("L'").scale(0.5)
        l2_label.add_updater(lambda m:\
            m.next_to(l2, RIGHT, buff=SMALL_BUFF))
        
        ql2 = Line()
        ql2.add_updater(lambda m:\
            m.put_start_and_end_on(
                q.get_center(),
                get_l2()
            ))
        p1l2 = Line()
        p1l2.add_updater(lambda m:\
            m.put_start_and_end_on(
                p1.get_center(),
                get_l2()
            ))
        self.play(
            ShowCreation(ql2),
            ShowCreation(p1l2))
        self.play(
            ShowCreation(l2),
            Write(l2_label)
        )

        corollary = VGroup()

        head = CText('推论:').scale(0.25)
        head.set_fill(DARK_BLUE)
        
        crlly = TexMobject("P_1N^2=LN\\cdot L'N").scale(0.5)

        head_line = VGroup(head, crlly)
        head_line.arrange(RIGHT)

        proof = VGroup()
        proof_head = CText('证明:').scale(0.25)
        proof_head.set_fill(DARK_BLUE)
        proof.add(proof_head)

        proof_details = VGroup()
        prf1 = TexMobject("\\frac{LN}{AN}=\\frac{QN'}{AN'}")\
            .scale(0.5)

        prf2 = VGroup()
        prf2_1 = CText('又').scale(0.25)
        prf2_2 = TexMobject(
            "\\because L'N=QN'")\
            .scale(0.5)
        prf2.add(prf2_1, prf2_2)
        prf2.arrange(RIGHT, buff=SMALL_BUFF)

        prf3 = TexMobject(
            "\\therefore LN\\cdot L'N=\\frac{QN'\
                \\cdot AN}{AN'}\\cdot QN' =\
                \\frac{QN'^2\\cdot AN}{AN'}"
        ).scale(0.5)

        prf4 = VGroup()
        prf4_1 = CText('又').scale(0.25)
        prf4_2 = TexMobject(
            "\\because QN'^2=4AN'\\cdot AF")\
            .scale(0.5)
        prf4.add(prf4_1, prf4_2)
        prf4.arrange(RIGHT, buff=SMALL_BUFF)

        prf5 = TexMobject(
            "\\therefore LN\\cdot L'N=\\frac{4AN'\\cdot AF\
                \\cdot AN}{AN'} = 4AN\\cdot AF = P_1N^2"
        ).scale(0.5)

        proof_details.add(prf1, prf2, prf3,
            prf4, prf5)
        proof_details.arrange(DOWN)
        proof.add(proof_details)
        proof.arrange(RIGHT)
        proof_details.align_to(proof_head, UP)

        corollary.add(head_line)
        corollary.add(proof)
        corollary.arrange(DOWN)

        head_line.align_to(proof, LEFT)
        prf1.align_to(crlly, LEFT)
        for e in [prf2, prf3, prf4, prf5]:
            e.align_to(prf1, LEFT)

        corollary.to_edge(RIGHT)

        self.play(Write(head_line))
        self.wait()

        def get_n2():
            qx = q.get_center()[0]
            return qx * RIGHT

        n2 = Dot()
        n2.plot_depth = 1
        n2.set_fill(DARK_BLUE)
        n2.add_updater(lambda m:\
            m.move_to(get_n2()))

        n2_label = TexMobject("N'").scale(0.5)
        n2_label.add_updater(lambda m:\
            m.next_to(n2, DOWN, buff=SMALL_BUFF))
        
        qn2 = DashedLine()
        qn2.add_updater(lambda m:\
            m.put_start_and_end_on(
                q.get_center(),
                get_n2()
            ))
        self.play(ShowCreation(qn2))
        self.play(
            ShowCreation(n2),
            Write(n2_label)
        )
        self.wait()

        self.play(
            Write(proof_head),
            Write(prf1))
        self.wait(3)

        self.play(ShowCreationThenDestruction(
            Polygon(
                a.get_center(),
                n2.get_center(),
                q.get_center())
        ))
        self.wait()

        self.play(ShowCreationThenDestruction(
            Polygon(
                a.get_center(),
                n1.get_center(),
                l.get_center())
        ))

        for e in [prf2, prf3, prf4, prf5]:
            self.wait(3)
            self.play(Write(e))

        self.wait(10)

        self.play(y_val.set_value, 4)
        self.play(q_y.set_value, 8)

        self.wait(10)
예제 #11
0
    def construct(self):
        text1head = CText('高中时期的解析几何都用')
        text1body = CText('坐标系')
        text1tail = CText('进行研究')
        text1 = VGroup(text1head, text1body, text1tail, buff=SMALL_BUFF)
        text1.arrange()
        text1body.set_fill(DARK_BLUE)

        text2 = CText('计算繁杂,且不优雅')

        text3head = CText('那么,是否可以用')
        text3body = CText('纯几何')
        text3tail = CText('的方法')
        text3 = VGroup(text3head, text3body, text3tail, buff=SMALL_BUFF)
        text3body.set_fill(DARK_BLUE)
        text3.arrange()

        # text2[1].set_fill(DARK_BLUE)
        text4 = CText('来得到一些圆锥曲线的性质?')

        group = VGroup(text1, text2, text3, text4)
        group.arrange_submobjects(direction=DOWN, buff=1)
        group.scale(0.5)
        self.play(Write(text1))
        self.play(WiggleOutThenIn(text1body))
        self.wait()
        self.play(Write(text2))
        self.wait()
        self.play(Write(text3))
        self.play(WiggleOutThenIn(text3body))
        self.wait()
        self.play(Write(text4))
        self.wait(2)

        self.play(FadeOut(group))

        explan1 = CText('本系列将试图用几何方法研究圆锥曲线')
        explan2h = CText('主要参考')
        explan2t = CText('《圆锥曲线的几何性质》')
        explan2 = VGroup(explan2h, explan2t)
        explan2.arrange()
        explan2t.set_fill(DARK_BLUE)

        explan3 = CText('希望能有所帮助')

        explan = VGroup(explan1, explan2, explan3)
        explan.arrange_submobjects(direction=DOWN, buff=1)
        explan.scale(0.5)

        self.play(Write(explan1))
        self.wait()
        self.play(Write(explan2))
        self.play(WiggleOutThenIn(explan2t))
        self.wait()
        self.play(Write(explan3))
        self.wait(2)
        self.play(FadeOut(explan))

        jokeh = CText('视频使用')
        jokeb = CText('manim')
        joket = CText('制作')

        jokeb.set_fill(DARK_BLUE)

        joked = CText('边学边做,随缘更新')
        jokeT = VGroup(jokeh, jokeb, joket, buff=SMALL_BUFF)
        jokeT.arrange()

        joke = VGroup(jokeT, joked)
        joke.arrange_submobjects(direction=DOWN, buff=1)

        self.play(Write(jokeT))
        self.play(WiggleOutThenIn(jokeb))
        self.wait()
        self.play(Write(joked))
        self.wait(2)
        self.play(FadeOut(joke))

        last = CText('从抛物线开始')
        self.play(Write(last))
        self.wait()
        self.play(FadeOut(last))
예제 #12
0
    def construct(self):
        self.adjust_x_range()
        graph = self.get_graph(color=LIGHT_BROWN)
        directrix = self.get_directrix()
        focus = Dot().move_to(self.get_focus())
        focus.set_fill(DARK_BROWN)
        focus.plot_depth = 1
        focusLabel = TexMobject('F').scale(0.7)
        focusLabel.next_to(focus, RIGHT)

        self.play(*[ShowCreation(e) for\
            e in [graph, directrix, focus, focusLabel]])

        q1_y = ValueTracker(9)
        q1 = Dot()
        q1.set_fill(DARK_BLUE)
        q1.plot_depth = 1

        q1.add_updater(lambda m:\
            m.move_to(self.coords_to_point(
                self.func(q1_y.get_value()),
                q1_y.get_value()
            )))

        q1_label = TexMobject('Q_1').scale(0.5)
        q1_label.add_updater(lambda m:\
            m.next_to(q1, RIGHT, buff=SMALL_BUFF))
        
        self.play(ShowCreation(q1), ShowCreation(q1_label))

        q2 = Dot()
        q2.set_fill(DARK_BLUE)
        q2.plot_depth = 1

        q2.add_updater(lambda m:\
            m.move_to(self.get_opposite(q1)))

        q2_label = TexMobject('Q_2').scale(0.5)
        q2_label.add_updater(lambda m:\
            m.next_to(q2, RIGHT, buff=SMALL_BUFF))

        q1q2 = Line()
        q1q2.add_updater(lambda m:\
            m.put_start_and_end_on(
                q1.get_center(),
                self.get_opposite(q1)
            ))

        self.play(*[ShowCreation(e) for e in\
            [q2, q2_label, q1q2]])

        p1_y = ValueTracker(2)
        p1 = Dot()
        p1.set_fill(DARK_BLUE)
        p1.plot_depth = 1

        p1.add_updater(lambda m:\
            m.move_to(self.coords_to_point(
                self.func(p1_y.get_value()),
                p1_y.get_value()
            )))

        p1_label = TexMobject('P_1').scale(0.5)
        p1_label.add_updater(lambda m:\
            m.next_to(p1, RIGHT, buff=SMALL_BUFF))
        
        self.play(ShowCreation(p1), ShowCreation(p1_label))

        p2 = Dot()
        p2.set_fill(DARK_BLUE)
        p2.plot_depth = 1

        p2.add_updater(lambda m:\
            m.move_to(self.get_opposite(p1)))

        p2_label = TexMobject('P_2').scale(0.5)
        p2_label.add_updater(lambda m:\
            m.next_to(p2, RIGHT, buff=SMALL_BUFF))

        p1p2 = Line()
        p1p2.add_updater(lambda m:\
            m.put_start_and_end_on(
                p1.get_center(),
                self.get_opposite(p1)
            ))

        self.play(*[ShowCreation(e) for e in\
            [p2, p2_label, p1p2]])

        k1 = Dot()
        k1.set_fill(DARK_BROWN)
        k1.plot_depth = 1
        k1.add_updater(lambda m:\
            m.move_to(self.chord_to_directrix(p1, q1)))

        k1_label = TexMobject('K_1').scale(0.5)
        k1_label.add_updater(lambda m:\
            m.next_to(k1, LEFT, buff=SMALL_BUFF))

        p1q1 = Line()
        p1q1.add_updater(lambda m:\
            m.put_start_and_end_on(
                self.right(p1, q1),
                self.chord_to_directrix(p1, q1)
            ))
        p2q2 = Line()
        p2q2.add_updater(lambda m:\
            m.put_start_and_end_on(
                self.right(p2, q2),
                self.chord_to_directrix(p2, q2)
            ))

        self.play(*[ShowCreation(e) for e in \
            [k1, k1_label, p1q1, p2q2]])

        k2 = Dot()
        k2.set_fill(DARK_BROWN)
        k2.plot_depth = 1
        k2.add_updater(lambda m:\
            m.move_to(self.chord_to_directrix(p2, q1)))

        k2_label = TexMobject('K_2').scale(0.5)
        k2_label.add_updater(lambda m:\
            m.next_to(k2, LEFT, buff=SMALL_BUFF))

        p2q1 = Line()
        p2q1.add_updater(lambda m:\
            m.put_start_and_end_on(
                self.right(p2, q1),
                self.chord_to_directrix(p2, q1)
            ))
        p1q2 = Line()
        p1q2.add_updater(lambda m:\
            m.put_start_and_end_on(
                self.right(p1, q2),
                self.chord_to_directrix(p1, q2)
            ))

        self.play(*[ShowCreation(e) for e in \
            [k2, k2_label, p2q1, p1q2]])

        explain = CText('这些交点在准线上').scale(0.3)
        explain.to_edge(RIGHT)

        self.wait(2)
        self.play(Write(explain))
        self.wait(5)

        self.play(ApplyMethod(q1_y.set_value, 0.5),
            ApplyMethod(p1_y.set_value, -3))

        self.wait(3)
        self.play(ApplyMethod(q1_y.set_value, 3),
            ApplyMethod(p1_y.set_value, -9))
        self.wait(10)
예제 #13
0
    def construct(self):
        self.adjust_x_range()
        graph = self.get_graph(color=DARK_BROWN)
        directrix = self.get_directrix()
        focus = Dot().move_to(self.get_focus())
        focus.set_fill(DARK_BROWN)
        focus.plot_depth = 1

        self.play(ShowCreation(graph), ShowCreation(directrix),
                  ShowCreation(focus))

        focus_label = TexMobject('F').scale(0.5)
        focus_label.next_to(focus, DOWN, buff=SMALL_BUFF)
        self.play(Write(focus_label))

        h_line = Line()
        d_loc = directrix.get_center()[0] * RIGHT
        h_line.put_start_and_end_on(d_loc, ORIGIN)
        h_line.plot_depth = -1
        self.play(ShowCreation(h_line))

        a = Dot()
        a.set_fill(LIGHT_BROWN)
        a.plot_depth = 1
        a.move_to(self.coords_to_point(0, 0))

        a_label = TexMobject('A').scale(0.5)
        a_label.next_to(a, DL, buff=SMALL_BUFF)

        t = Dot()
        t.set_fill(LIGHT_BROWN)
        t.plot_depth = 1
        t.move_to(d_loc)

        t_label = TexMobject('T').scale(0.5)
        t_label.next_to(t, LEFT, buff=SMALL_BUFF)

        y_value = ValueTracker(9)
        p = Dot()
        p.set_fill(DARK_BLUE)
        p.plot_depth = 1

        p.add_updater(lambda m:\
            m.move_to(self.value_to_point(
                y_value.get_value())))
        p_label = TexMobject('P').scale(0.5)
        p_label.add_updater(lambda m:\
            m.next_to(p, RIGHT, buff=SMALL_BUFF))

        m = Dot()
        m.set_fill(DARK_BLUE)
        m.plot_depth = 1
        m.add_updater(lambda t:\
            t.move_to(d_loc + p.get_center()[1] * UP))
        m_label = TexMobject('M').scale(0.5)
        m_label.add_updater(lambda l:\
            l.next_to(m, LEFT, buff=SMALL_BUFF))

        n = Dot()
        n.set_fill(DARK_BLUE)
        n.plot_depth = 1
        n.add_updater(lambda m:\
            m.move_to(p.get_center()[0] * RIGHT))

        n_label = TexMobject('N').scale(0.5)
        n_label.add_updater(lambda m:\
            m.next_to(n, DOWN, buff=SMALL_BUFF))

        self.play(*[ShowCreation(e) for e in\
            [a, p, m, n, t]])

        self.play(*[ShowCreation(e) for e in\
            [a_label, t_label, p_label, m_label, n_label]])
        self.wait()

        pn = Line()
        pn.add_updater(lambda l:\
            l.put_start_and_end_on(
                p.get_center(), n.get_center()))
        pf = Line()
        pf.add_updater(lambda l:\
            l.put_start_and_end_on(
                p.get_center(), focus.get_center()))

        pm = Line()
        pm.add_updater(lambda l:\
            l.put_start_and_end_on(
                p.get_center(), m.get_center()))
        self.play(*[ShowCreation(e) for e in\
            [pn, pf, pm]])
        self.wait()

        prop = VGroup()
        prop.add(CText('性质:')\
            .scale(0.25).set_color(DARK_BLUE))
        prop.add(TexMobject('PN^2=4AF\\cdot AN')\
            .scale(0.5)).set_color(DARK_BROWN)
        prop.arrange(RIGHT)

        proof = VGroup()
        prf = CText('证明:')\
            .scale(0.25).set_color(DARK_BLUE)
        proof.add(prf)

        details = VGroup()
        line1 = TexMobject('TN^2=', '(TA+AN)^2')\
            .scale(0.5)
        details.add(line1)

        line2 = TexMobject('TN^2=PM^2=PF^2')\
            .scale(0.5)
        details.add(line2)

        line3 = TexMobject('PF^2=PN^2+NF^2')\
            .scale(0.5)
        details.add(line3)

        line4 = TexMobject(
            'PN^2+NF^2=NF^2+4 AF\\cdot AN')\
            .scale(0.5)
        details.add(line4)

        line5 = TexMobject('PN^2=4AF\\cdot AN').scale(0.5).set_color(
            DARK_BROWN)
        details.add(line5)

        proof.add(details)
        details.arrange(DOWN)

        line2.align_to(line1, LEFT)
        line3.align_to(line2, LEFT)
        line4.align_to(line3, LEFT)
        line5.align_to(line4, LEFT)

        proof.arrange(RIGHT)
        prf.align_to(details, UP)

        forms = VGroup()
        forms.add(prop)
        forms.add(proof)
        forms.arrange(DOWN)
        proof.align_to(prop, LEFT)
        forms.to_edge(RIGHT, buff=2)

        expand = TexMobject('TA',
            '^2+AN^2+2', 'TA',
            '\\cdot AN')\
            .scale(0.5)
        expand.align_to(line1[1], LEFT)
        expand.align_to(line1[1], UP)

        expand2 = TexMobject('AF',
            '^2+AN^2+2', 'AF',
            '\\cdot AN')\
            .scale(0.5)
        expand2.align_to(line1[1], LEFT)
        expand2.align_to(line1[1], UP)

        expand3 = TexMobject(
            '(AF-AN)^2+4 AF\\cdot AN')\
            .scale(0.5)
        expand3.align_to(line1[1], LEFT)
        expand3.align_to(line1[1], UP)

        expand4 = TexMobject('NF^2+4 AF\\cdot AN').scale(0.5)
        expand4.align_to(line1[1], LEFT)
        expand4.align_to(line1[1], UP)

        self.play(Write(prop))
        self.wait()

        self.play(y_value.set_value, 1)
        self.wait()
        self.play(y_value.set_value, 3)
        self.wait()

        self.play(Write(prf))
        self.play(Write(line1))
        self.wait()

        self.play(ShowCreationThenDestruction(Line(t, n).set_color(RED)))
        self.play(ShowCreationThenDestruction(Line(t, a).set_color(RED)))
        self.play(ShowCreationThenDestruction(Line(a, n).set_color(RED)))
        self.wait()

        self.play(ReplacementTransform(line1[1], expand))
        self.wait(3)

        self.play(ShowCreationThenDestruction(Line(t, a).set_color(RED)))
        self.play(ShowCreationThenDestruction(Line(a, focus).set_color(RED)))
        self.wait()
        self.play(*[Transform(
            expand[e], expand2[e]) for e in\
            [0, 2]])
        self.wait(3)

        self.play(ReplacementTransform(expand, expand3))
        self.wait(3)
        self.play(ReplacementTransform(expand3, expand4))
        self.wait(3)

        self.play(Write(line2))
        self.play(ShowCreationThenDestruction(Line(t, n).set_color(RED)))
        self.play(ShowCreationThenDestruction(Line(p, m).set_color(RED)))
        self.play(ShowCreationThenDestruction(Line(p, focus).set_color(RED)))
        self.wait(3)

        self.play(Write(line3))
        self.play(
            ShowCreationThenDestruction(
                Polygon(p.get_center(), n.get_center(),
                        focus.get_center()).set_fill(DARK_BLUE, opacity=1)))
        self.wait(3)

        self.play(WiggleOutThenIn(expand4), WiggleOutThenIn(line3))

        self.play(Write(line4))
        self.wait(3)
        self.play(Write(line5))
        self.wait(3)

        def1 = CText('AF是焦距')
        def2 = CText('AN是点P的横标线')
        def3 = CText('PN是点P的纵标线')
        defines = VGroup(def1, def2, def3)
        defines.arrange(DOWN)
        defines.scale(0.25)
        defines.next_to(proof, DOWN)

        self.play(Write(defines))
        self.wait(5)

        self.play(y_value.set_value, 8)
        self.wait(10)
예제 #14
0
    def construct(self):
        self.adjust_x_range()
        sub1 = CText('已知准线与焦点')
        sub1.scale(0.3)
        sub1.to_edge(RIGHT)
        self.play(Write(sub1))
        directrix = self.get_directrix()
        focus = Dot()
        focus.move_to(self.get_focus())
        focus.set_fill(DARK_BROWN)
        focus.plot_depth = 1
        focus_label = TexMobject('F').scale(0.5)
        focus_label.next_to(focus, RIGHT + UP,\
            buff=SMALL_BUFF)
        self.play(*[ShowCreation(e) for e in [directrix, focus, focus_label]])

        sub2 = CText('先找到顶点A')
        sub2.scale(0.3)
        sub2.to_edge(RIGHT)

        self.wait()
        self.play(FadeOut(sub1))
        self.play(Write(sub2))

        fl = Line(directrix.get_center(), focus.get_center())
        a = Dot()
        a.move_to(fl.get_center())
        a.set_fill(DARK_BROWN)
        a.plot_depth = 1
        a_label = TexMobject('A').scale(0.5)
        a_label.next_to(a, RIGHT + UP,\
            buff=SMALL_BUFF)
        self.play(ShowCreation(fl))
        self.play(ShowCreation(a))
        self.play(FadeOut(fl), ShowCreation(a_label))

        y_val = ValueTracker(4)

        sub3 = CText('在准线上任取一点')
        sub3.scale(0.3)
        sub3.to_edge(RIGHT)
        self.play(FadeOut(sub2))
        self.play(Write(sub3))

        m = Dot()
        m.set_fill(DARK_BLUE)
        m.plot_depth = 1
        m.add_updater(lambda m:\
            m.move_to(self.coords_to_point(
                -self.focus, y_val.get_value()
            )))
        m_label = TexMobject('M').scale(0.5)
        m_label.add_updater(lambda l: l.next_to(m, LEFT))
        self.play(ShowCreation(m), ShowCreation(m_label))

        self.wait()
        sub4 = CText('连接相应的点')
        sub4.scale(0.3)
        sub4.to_edge(RIGHT)
        self.play(FadeOut(sub3))
        self.play(Write(sub4))

        ma = Line()
        ma.add_updater(lambda l:\
            l.put_start_and_end_on(
                m.get_center(),
                a.get_center()
            ))

        af = Line(a.get_center(), focus.get_center() + RIGHT)

        mf = Line()
        mf.add_updater(lambda l:\
            l.put_start_and_end_on(
                m.get_center(),
                focus.get_center()
            ))

        self.play(*[ShowCreation(e) for e in [af, mf, ma]])
        self.wait()

        sub5 = CText('延长MA, MF')
        sub5.scale(0.3)
        sub5.to_edge(RIGHT)
        self.play(FadeOut(sub4))
        self.play(Write(sub5))

        def get_ma_extent():
            vec = a.get_center() - m.get_center()
            vec *= FRAME_WIDTH
            return a.get_center() + vec

        ma_extent = Line()
        ma_extent.add_updater(lambda l:\
            l.put_start_and_end_on(
                a.get_center(),
                get_ma_extent()
            ))

        def get_mf_extent():
            vec = focus.get_center() - m.get_center()
            return focus.get_center() + normalize(vec)

        mf_extent = Line()
        mf_extent.add_updater(lambda l:\
            l.put_start_and_end_on(
                focus.get_center(),
                get_mf_extent()
            ))

        self.play(ShowCreation(mf_extent), ShowCreation(ma_extent))

        self.wait()
        sub6 = CText('做对称线(相等的角)')
        sub6.scale(0.3)
        sub6.to_edge(RIGHT)
        self.play(FadeOut(sub5))
        self.play(Write(sub6))

        def get_flip():
            loc = get_mf_extent()
            f = focus.get_center()
            x = loc[0] - f[0]
            y = loc[1] - f[1]
            ang = 2 * np.arctan2(y, x)
            vec = np.cos(ang) * RIGHT + np.sin(ang) * UP
            return vec

        mf_flip = Line()
        mf_flip.add_updater(lambda l:\
            l.put_start_and_end_on(
                focus.get_center(),
                get_flip() + focus.get_center()
            ))

        self.play(ShowCreation(mf_flip))

        sub7 = CText('交MA于点P')
        sub7.scale(0.3)
        sub7.to_edge(RIGHT)
        self.play(FadeOut(sub6))
        self.play(Write(sub7))

        mf_flip_extent = Line()
        mf_flip_extent.add_updater(lambda l:\
            l.put_start_and_end_on(
                focus.get_center(),
                get_flip() * FRAME_WIDTH\
                    + focus.get_center()
            ))
        self.play(ShowCreation(mf_flip_extent))

        def get_p():
            x1 = m.get_center()[0]
            y1 = m.get_center()[1]
            x2 = a.get_center()[0]
            y2 = a.get_center()[1]
            x3 = focus.get_center()[0]
            y3 = focus.get_center()[1]
            vec = get_flip()
            x4 = x3 + vec[0]
            y4 = y3 + vec[1]

            a1 = y2 - y1
            b1 = x1 - x2
            c1 = a1 * x1 + b1 * y1

            a2 = y4 - y3
            b2 = x3 - x4
            c2 = a2 * x3 + b2 * y3

            determinant = a1 * b2 - a2 * b1

            if determinant == 0:
                return a.get_center()

            x = (b2 * c1 - b1 * c2) / determinant
            y = (a1 * c2 - a2 * c1) / determinant
            return x * RIGHT + y * UP

        p = Dot()
        p.set_fill(DARK_BLUE)
        p.plot_depth = 1
        p.add_updater(lambda m: m.move_to(get_p()))

        p_label = TexMobject('P').scale(0.5)
        p_label.add_updater(lambda m:\
            m.next_to(p, RIGHT, buff=SMALL_BUFF))
        self.play(ShowCreation(p), ShowCreation(p_label))

        self.wait(3)
        self.play(ApplyMethod(y_val.set_value, -4))

        graph = self.get_graph(color=LIGHT_BROWN)
        self.play(ShowCreation(graph))

        self.wait(3)
        self.play(ApplyMethod(y_val.set_value, -8))

        self.wait(3)
        self.play(ApplyMethod(y_val.set_value, -6))

        self.wait(3)
        self.play(ApplyMethod(y_val.set_value, 6))

        self.wait(3)
        self.play(ApplyMethod(y_val.set_value, 8))
        self.wait(10)
예제 #15
0
    def construct(self):
        self.adjust_x_range()
        graph = self.get_graph(color=LIGHT_BROWN)
        focus = Dot(self.get_focus()).set_fill(DARK_BLUE)
        directrix = self.get_directrix()
        focusLabel = TexMobject('F').scale(0.75)
        focusLabel.next_to(focus, RIGHT, buff=SMALL_BUFF)
        self.directrix = directrix
        focus.plot_depth = 1

        sub1 = CText('在抛物线上任取不同的两点P1,P2').scale(0.4)
        sub1.to_corner(RIGHT + DOWN)

        p1_y = ValueTracker(7)
        p2_y = ValueTracker(2)

        p1 = Dot()
        p1.add_updater(
            lambda m: m.move_to(self.value_to_point(p1_y.get_value())))
        p1.plot_depth = 1

        p2 = Dot()
        p2.add_updater(
            lambda m: m.move_to(self.value_to_point(p2_y.get_value())))
        p2.plot_depth = 1

        p1.set_fill(RED)
        p2.set_fill(RED)

        p1Label = TexMobject('P_1').scale(0.75)
        p2Label = TexMobject('P_2').scale(0.75)

        p1Label.add_updater(lambda m:\
            m.next_to(p1, RIGHT, buff=SMALL_BUFF))
        p2Label.add_updater(lambda m:\
            m.next_to(p2, LEFT+UP, buff=SMALL_BUFF))

        sub2 = CText('连接两点,延长交准线于点K')
        sub2.scale(0.4).to_corner(RIGHT + DOWN)

        ppLine = Line()

        ppLine.add_updater(lambda m:\
            m.put_start_and_end_on(p1.get_center(),\
            self.get_directrix_point(p1, p2)))

        k = Dot()
        k.plot_depth = 1
        k.set_fill(DARK_BLUE)
        k.add_updater(lambda m: m.move_to(ppLine.points[-1]))

        kLabel = TexMobject('K').scale(0.75)
        kLabel.add_updater(lambda m:\
            m.next_to(k, LEFT, buff=SMALL_BUFF))

        sub3 = CText('分别连接P1F, P2F')
        sub3.scale(0.4).to_corner(RIGHT + DOWN)

        p1f = Line()
        p2f = Line()
        p1f.add_updater(lambda m:\
            m.put_start_and_end_on(p1.get_center(),\
            focus.get_center()))
        p2f.add_updater(lambda m:\
            m.put_start_and_end_on(p2.get_center(),\
            focus.get_center()))

        sub4 = CText('延长P1F交准线于D')
        sub4.scale(0.4).to_corner(RIGHT + DOWN)

        p1fd = Line()
        p1fd.add_updater(lambda m:\
            m.put_start_and_end_on(\
            focus.get_center(),\
            self.get_directrix_point(p1, focus)))
        d = Dot()
        d.plot_depth = 1
        d.set_fill(DARK_BLUE)
        d.add_updater(lambda m: m.move_to(p1fd.points[-1]))
        dLabel = TexMobject('D')
        dLabel.scale(0.75)
        dLabel.add_updater(lambda m:\
            m.next_to(d, LEFT, buff=SMALL_BUFF))

        sub5 = CText('连接KF')
        sub5.scale(0.4).to_corner(RIGHT + DOWN)

        kf = Line()
        kf.add_updater(lambda m:\
            m.put_start_and_end_on\
            (k.get_center(), focus.get_center()))

        ang1 = ArcBetweenPoints(*self.get_arc_point(
            p2.get_center(), focus.get_center(), k.get_center()))
        ang1.add_updater(lambda m:\
            m.put_start_and_end_on(
                *self.get_arc_point(
                p2.get_center(),
                focus.get_center(),
                k.get_center()
            )))
        ang1Label = TexMobject('1').scale(0.5)
        ang1Label.add_updater(lambda m:\
            m.move_to(ang1.get_center()))

        ang2 = ArcBetweenPoints(*self.get_arc_point(
            k.get_center(), focus.get_center(), d.get_center()))
        ang2.add_updater(lambda m:\
            m.put_start_and_end_on(
                *self.get_arc_point(
                k.get_center(),
                focus.get_center(),
                d.get_center()
            )))
        ang2Label = TexMobject('2').scale(0.5)
        ang2Label.add_updater(lambda m:\
            m.move_to(ang2.get_center()))

        ang1Value = DecimalNumber(self.get_angle(
            p2.get_center(), focus.get_center(), k.get_center()) / DEGREES,
                                  num_decimal_places=2)
        ang1Value.add_updater(lambda m:\
            m.set_value(self.get_angle(
                p2.get_center(),
                focus.get_center(),
                k.get_center()
            ) / DEGREES))
        ang2Value = DecimalNumber(self.get_angle(
            k.get_center(), focus.get_center(), d.get_center()) / DEGREES,
                                  num_decimal_places=2)
        ang2Value.add_updater(lambda m:\
            m.set_value(self.get_angle(
                k.get_center(),
                focus.get_center(),
                d.get_center()
            ) / DEGREES))

        ang1Tail = TexMobject('^{\circ}')
        ang2Tail = TexMobject('^{\circ}')

        ang1head = TexMobject('\\angle 1=')
        ang1Text = VGroup(ang1head, ang1Value, ang1Tail)
        ang1Text.arrange(buff=SMALL_BUFF)
        ang1Tail.shift(0.15 * UP)

        ang2head = TexMobject('\\angle 2=')
        ang2Text = VGroup(ang2head, ang2Value, ang2Tail)
        ang2Text.arrange(buff=SMALL_BUFF)
        ang2Tail.shift(0.15 * UP)

        angs = VGroup(ang1Text, ang2Text)
        angs.arrange(buff=MED_SMALL_BUFF)
        angs.shift(3 * RIGHT + 2 * UP)

        m1 = Dot()
        m1.plot_depth = 1
        m1.set_fill(ORANGE)
        m1.add_updater(lambda m:\
            m.move_to(self.coords_to_point(
                -self.focus, p1_y.get_value()
            )))

        m2 = Dot()
        m2.plot_depth = 1
        m2.set_fill(ORANGE)
        m2.add_updater(lambda m:\
            m.move_to(self.coords_to_point(
                -self.focus, p2_y.get_value()
            )))

        m1Label = TexMobject('M_1').scale(0.75)
        m2Label = TexMobject('M_2').scale(0.75)
        m1Label.add_updater(lambda m:\
            m.next_to(m1, LEFT, buff=SMALL_BUFF))
        m2Label.add_updater(lambda m:\
            m.next_to(m2, LEFT, buff=SMALL_BUFF))

        m1p1 = DashedLine()
        m1p1.add_updater(lambda m:\
            m.put_start_and_end_on(
                m1.get_center(), p1.get_center()
            ))
        m2p2 = DashedLine()
        m2p2.add_updater(lambda m:\
            m.put_start_and_end_on(
                m2.get_center(), p2.get_center()
            ))

        fracs = TexMobject('{KP_2', '\\over', 'KP_1}', '=', '{M_2P_2',
                           '\\over', 'M_1P_1}', '=', '{FP_2', '\\over',
                           'FP_1}')
        fracs.shift(3 * RIGHT + 2 * UP)

        fracs2 = TexMobject('{KP_2', '\\over', 'KP_1}', '=', '{FP_2', '\\over',
                            'FP_1}')
        fracs2.move_to(fracs.get_center())
        fracs2.align_to(fracs, LEFT)

        fracs3 = TexMobject('{KP_2', '\\over', 'FP_2}', '=', '{KP_1', '\\over',
                            'FP_1}')
        fracs3.move_to(fracs2.get_center())

        explain = CText('由正弦定理').scale(0.4)
        explain.next_to(fracs3, DOWN)
        explain.align_to(fracs3, LEFT)

        fracs4 = TexMobject('{\\sin\\angle 1', '\\over', '\\sin\\angle K}',
                            '=', '{\\sin\\angle KFP_1', '\\over',
                            '\\sin\\angle K}')
        fracs4.next_to(explain, DOWN)
        fracs4.align_to(explain, LEFT)

        form = TexMobject('\\sin \\angle 1 = \\sin \\angle KFP_1')
        form.next_to(fracs4, DOWN)
        form.align_to(fracs4, LEFT)

        form2 = TexMobject('\\angle1 < \\angle KFP_1 < \\pi')
        form2.next_to(form, DOWN)
        form2.align_to(form, LEFT)

        form3 = TexMobject('\\angle1 = \pi - \\angle KFP_1 = \\angle 2')
        form3.next_to(form2, DOWN)
        form3.align_to(form2, LEFT)

        remover = Rectangle(height=FRAME_HEIGHT, width=FRAME_WIDTH)
        remover.set_color(BLACK)
        remover.set_fill(BLACK, opacity=1)
        remover.plot_depth = 2
        # kp2 = Line()
        # kp2.add_updater(lambda m:\
        #     m.put_start_and_end_on(k.get_center(),
        #     p2.get_center()))
        # kp2.set_color(YELLOW)
        ############################################
        # Animation part                           #
        ############################################
        self.play(ShowCreation(focus), ShowCreation(directrix))
        self.play(ShowCreation(graph), Write(focusLabel))

        self.play(Write(sub1))
        self.play(*[ShowCreation(e) for e in\
            [p1, p2, p1Label, p2Label]])
        self.wait()

        self.play(FadeOut(sub1))
        self.play(Write(sub2))

        self.wait()
        self.play(ShowCreation(ppLine))
        self.play(ShowCreation(k), Write(kLabel))

        self.wait()
        self.play(FadeOut(sub2))
        self.play(Write(sub3))

        self.play(*[ShowCreation(e) for e in [p1f, p2f]])

        self.wait()
        self.play(FadeOut(sub3))
        self.play(Write(sub4))

        self.play(ShowCreation(p1fd))
        self.play(*[ShowCreation(e) for e in [d, dLabel]])

        self.wait()
        self.play(FadeOut(sub4))
        self.play(Write(sub5))

        self.wait()
        self.play(ShowCreation(kf))
        self.play(ShowCreation(ang1), Write(ang1Label))
        self.play(ShowCreation(ang2), Write(ang2Label))
        self.play(FadeOut(sub5))

        self.play(Write(angs))

        self.play(*[ShowCreation(e) for e in\
            [m1, m2, m1p1, m2p2, m1Label, m2Label]])

        self.play(ApplyMethod(p2_y.set_value, -1), run_time=2)
        self.wait()
        self.play(ApplyMethod(p1_y.set_value, 5))
        self.wait()
        self.play(ApplyMethod(p1_y.set_value, 9), run_time=3)
        self.wait()
        self.play(ApplyMethod(p2_y.set_value, 3), run_time=2)

        self.play(FadeOut(angs))
        self.wait()

        self.play(Write(fracs))
        self.wait(5)
        #self.play(ReplacementTransform(fracs, fracs2))
        self.play(FadeOut(fracs[4:8]))
        self.play(*[
            ApplyMethod(fracs[i].move_to, fracs[i - 4].get_center())
            for i in range(8, 11)
        ])

        # self.play(FadeOut(fracs), FadeIn(fracs2), run_time=0.1)

        # self.wait(5)
        # self.play(ReplacementTransform(fracs2, fracs3))
        self.wait(5)
        pos1 = fracs[2].get_center()
        pos2 = fracs[8].get_center()
        self.play(ApplyMethod(fracs[2].move_to, pos2),
                  ApplyMethod(fracs[8].move_to, pos1))

        self.wait(5)
        self.play(Write(explain))
        self.wait(3)

        self.play(ShowCreationThenDestruction(
            Polygon(k.get_center(), focus.get_center(),
                    p2.get_center()).set_fill(DARK_BLUE, opacity=1)),
                  run_time=3)
        self.play(Write(fracs4[:3]))

        self.play(ShowCreationThenDestruction(
            Polygon(k.get_center(), focus.get_center(),
                    p1.get_center()).set_fill(DARK_BLUE, opacity=1)),
                  run_time=3)
        self.play(Write(fracs4[3:]))

        self.wait(3)
        self.play(Write(form))
        self.wait(3)
        self.play(Write(form2))
        self.wait(3)
        self.play(Write(form3))
        self.wait(5)

        self.play(FadeIn(remover))
예제 #16
0
    def construct(self):
        self.adjust_x_range()
        graph = self.get_graph(color=LIGHT_BROWN)
        directrix = self.get_directrix()
        focus = Dot().move_to(self.get_focus())
        focus.set_fill(DARK_BROWN)
        focus.plot_depth = 1
        focusLabel = TexMobject('F').scale(0.5)
        focusLabel.next_to(focus, RIGHT + UP)

        self.play(*[ShowCreation(e) for\
            e in [graph, directrix, focus, focusLabel]])

        h_line = self.get_horizontal()
        x = Dot()
        x.set_fill(DARK_BROWN)
        x.plot_depth = 1
        x.move_to(self.coords_to_point(-self.focus, 0))
        x_label = TexMobject('X').scale(0.5)
        x_label.next_to(x, LEFT + UP)

        self.play(ShowCreation(h_line))
        self.play(ShowCreation(x), ShowCreation(x_label))

        y_val = ValueTracker(8)
        p = Dot()
        p.set_fill(DARK_BLUE)
        p.plot_depth = 1
        p.add_updater(lambda m:\
            m.move_to(self.coords_to_point(
                self.func(y_val.get_value()),
                y_val.get_value()
            )))
        
        q = Dot()
        q.set_fill(DARK_BLUE)
        q.plot_depth = 1
        q.add_updater(lambda m:\
            m.move_to(self.coords_to_point(
                self.func(-y_val.get_value()),
                -y_val.get_value()
            )))

        t = Dot()
        t.set_fill(DARK_BLUE)
        t.plot_depth = 1
        t.add_updater(lambda m:\
            m.move_to(self.coords_to_point(
                self.func(y_val.get_value()), 0
            )))

        p_label = TexMobject('P').scale(0.5)
        p_label.add_updater(lambda m:\
            m.next_to(p, RIGHT))
        q_label = TexMobject('Q').scale(0.5)
        q_label.add_updater(lambda m:\
            m.next_to(q, RIGHT))
        t_label = TexMobject('T').scale(0.5)
        t_label.add_updater(lambda m:\
            m.next_to(t, RIGHT + UP))

        pq = Line()
        pq.add_updater(lambda m:\
            m.put_start_and_end_on(
                p.get_center(),
                self.coords_to_point(
                    self.func(-y_val.get_value()),
                    -y_val.get_value()
            )))
        pt = Line()
        pt.add_updater(lambda m:\
            m.put_start_and_end_on(
                p.get_center(),
                self.coords_to_point(
                    self.func(y_val.get_value()), 0
                )))
        self.play(ShowCreation(p), ShowCreation(p_label))
        self.play(ShowCreation(pt))
        self.play(ShowCreation(t), ShowCreation(t_label))
        label1 = CText('纵标线').scale(0.3)\
                .next_to(pt, RIGHT)
        self.play(ShowCreation(label1))
        self.wait()
        self.play(FadeOut(label1))
        self.play(ShowCreation(pq))
        self.remove(pt)
        self.play(ShowCreation(q), ShowCreation(q_label))
        label2 = CText('双纵标线').scale(0.3)\
                .next_to(t, RIGHT+DOWN)
        self.play(ShowCreation(label2))
        self.wait()
        self.play(FadeOut(label2))
        self.wait()
        
        inter = Dot()
        inter.set_fill(DARK_BLUE)
        inter.plot_depth = 1
        inter.add_updater(lambda m:\
            m.move_to(
                self.coords_to_point(
                    4*(self.focus**3)/(y_val.get_value()**2),
                    4*self.focus**2/y_val.get_value()
                ) if y_val.get_value() != 0 else
                    self.coords_to_point(0, 0)
            ))

        inter_label = TexMobject("P'").scale(0.5)
        inter_label.add_updater(lambda m:\
            m.next_to(inter, LEFT + UP, buff=SMALL_BUFF))

        px = Line()
        px.add_updater(lambda m:\
            m.put_start_and_end_on(
                self.right(p, inter),
                x.get_center()
            ))
        
        self.play(ShowCreation(px))
        self.play(ShowCreation(inter),
            ShowCreation(inter_label))
        self.wait()

        form = CText("P'Q经过焦点").shift(UP)
        form.scale(0.5)
        form.to_edge(RIGHT)
        self.play(Write(form))
        
        interq = Line()
        interq.add_updater(lambda m:\
            m.put_start_and_end_on(
                inter.get_center(),
                q.get_center()
            ))
        self.play(ShowCreation(interq))

        self.wait(2)
        self.play(ApplyMethod(y_val.set_value, 4))

        self.wait(2)
        self.play(ApplyMethod(y_val.set_value, -4))

        self.wait(2)
        self.play(ApplyMethod(y_val.set_value, -9))

        self.wait(2)
        self.play(ApplyMethod(y_val.set_value, 9))

        self.wait(10)
예제 #17
0
    def construct(self):
        self.adjust_x_range()
        graph = self.get_graph(color=LIGHT_BROWN)
        directrix = self.get_directrix()
        focus = Dot().move_to(self.get_focus())
        focus.set_fill(DARK_BROWN)
        focus.plot_depth = 1
        focusLabel = TexMobject('F').scale(0.7)
        focusLabel.next_to(focus, RIGHT)

        self.play(*[ShowCreation(e) for\
            e in [graph, directrix, focus, focusLabel]])

        y_val = ValueTracker(8)

        p1 = Dot()
        p1.set_color(DARK_BLUE)
        p1.add_updater(lambda m:\
            m.move_to(self.coords_to_point(
                self.func(y_val.get_value()),
                y_val.get_value()
            )))
        p1.plot_depth = 1

        p1Label = TexMobject('P_1').scale(0.7)
        p1Label.add_updater(lambda m:\
            m.next_to(p1, RIGHT, buff=SMALL_BUFF))

        p2 = Dot()
        p2.set_color(DARK_BLUE)
        p2.add_updater(lambda m:\
            m.move_to(self.get_opposite(p1)))
        p2.plot_depth = 1

        p2Label = TexMobject('P_2').scale(0.7)
        p2Label.add_updater(lambda m:\
            m.next_to(p2, RIGHT, buff=SMALL_BUFF))

        focus_chord = Line()
        focus_chord.add_updater(lambda m:\
            m.put_start_and_end_on(
                p1.get_center(),
                self.get_opposite(p1)
            ))

        self.play(ShowCreation(p1), ShowCreation(p1Label))
        self.play(ShowCreation(focus_chord))
        self.play(ShowCreation(p2), ShowCreation(p2Label))

        fc_def = CText('焦点弦')
        fc_def.move_to(focus_chord.get_center())
        fc_def.shift(0.2 * RIGHT + 0.1 * DOWN)
        self.play(Write(fc_def))
        self.wait(2)
        self.play(FadeOut(fc_def))
        
        q_y = ValueTracker(2)
        q = Dot()
        q.set_fill(DARK_BLUE)
        q.plot_depth = 1

        q.add_updater(lambda m:\
            m.move_to(self.coords_to_point(
                self.func(q_y.get_value()),
                q_y.get_value()
            )))

        qLabel = TexMobject('Q').scale(0.7)
        qLabel.add_updater(lambda m:\
            m.next_to(q, LEFT, buff=SMALL_BUFF))
        
        k1 = Dot()
        k1.set_fill(BLUE_E)
        k1.plot_depth = 1
        k1.add_updater(lambda m:\
            m.move_to(self.chord_to_directrix(p1, q)))

        k1Label = TexMobject('K_1').scale(0.7)
        k1Label.add_updater(lambda m:\
            m.next_to(k1, LEFT, buff=SMALL_BUFF))

        k2 = Dot()
        k2.set_fill(BLUE_E)
        k2.plot_depth = 1
        k2.add_updater(lambda m:\
            m.move_to(self.chord_to_directrix(p2, q)))

        k2Label = TexMobject('K_2').scale(0.7)
        k2Label.add_updater(lambda m:\
            m.next_to(k2, LEFT, buff=SMALL_BUFF))
        
        l1 = Line()
        l1.add_updater(lambda m:\
            m.put_start_and_end_on(
                self.right(p1, q),
                self.chord_to_directrix(p1, q)
            ))

        l2 = Line()
        l2.add_updater(lambda m:\
            m.put_start_and_end_on(
                self.right(p2, q),
                self.chord_to_directrix(p2, q)
            ))
        
        self.play(ShowCreation(q), ShowCreation(qLabel))
        self.play(ShowCreation(l1), ShowCreation(l2))
        self.play(*[ShowCreation(e) for e in [k1, k2, k1Label, k2Label]])

        k1f = Line()
        k1f.add_updater(lambda m:\
            m.put_start_and_end_on(
                k1.get_center(), focus.get_center()
            ))

        k2f = Line()
        k2f.add_updater(lambda m:\
            m.put_start_and_end_on(
                k2.get_center(), focus.get_center()
            ))

        self.play(ShowCreation(k1f), ShowCreation(k2f))

        self.wait(1)
        self.play(ApplyMethod(y_val.set_value,
            5))

        summary = TexMobject('K_1F \\perp K_2F').scale(2)
        summary.to_edge(RIGHT)

        self.wait(1)
        self.play(Write(summary))
        self.wait(5)

        qf = Line()
        qf.add_updater(lambda m:\
            m.put_start_and_end_on(q.get_center(),
                focus.get_center()))
        self.play(ShowCreation(qf))

        self.wait(1)
        self.play(ApplyMethod(q_y.set_value,
            -1))

        self.wait(1)
        self.play(ApplyMethod(y_val.set_value,
            0.5))

        self.wait(1)
        self.play(ApplyMethod(y_val.set_value,
            3),
            ApplyMethod(q_y.set_value, 0.5))
        self.wait(10)
예제 #18
0
    def construct(self):
        self.adjust_x_range()
        lineCText = CText('设有一固定直线l')
        directrix = self.get_directrix()
        self.play(Write(lineCText))
        self.play(ApplyMethod(lineCText.scale, 0.3), ShowCreation(directrix))
        self.play(
            ApplyMethod(lineCText.move_to,
                        self.coords_to_point(-self.focus + 3,
                                             self.y_max - 2)), )

        self.wait()

        focusCText = CText('有一固定点F')
        focus = Circle()\
            .move_to(self.get_focus())\
            .scale(0.1)\
            .set_fill(ORANGE, opacity=1)
        self.play(Write(focusCText))
        self.wait()
        self.play(ApplyMethod(focusCText.scale, 0.3))
        self.play(
            ApplyMethod(focusCText.move_to,
                        self.coords_to_point(self.focus + 3, 0)),
            ShowCreation(focus))
        self.wait()

        question = CText('求到直线距离l与到\n点P距离相等的点的轨迹')
        question.scale(0.4)
        question.to_edge(RIGHT)

        self.play(Write(question))
        self.wait()

        pickPoint = CText('在l上任取一点P')
        pickPoint.scale(0.4)
        pickPoint.to_edge(DOWN)

        self.play(Write(pickPoint))

        y = ValueTracker(5)
        point = Circle()\
            .scale(0.1)\
            .set_fill(ORANGE, opacity=1)\
            .move_to(self.coords_to_point(-self.focus, y.get_value()))
        self.play(ShowCreation(point))

        self.wait()
        self.play(FadeOut(pickPoint))

        connect = CText('连接FP')
        connect.scale((0.4))
        connect.to_edge(DOWN)
        fp = DashedLine(point.get_center(), focus.get_center())

        self.play(Write(connect))
        self.play(ShowCreation(fp))
        self.wait()

        midRight = CText('做FP中垂线')
        midRight.scale(0.4)
        midRight.to_edge(DOWN)
        midPoint = Circle()\
            .scale(0.1)\
            .move_to((point.get_center() + focus.get_center())/2)\
            .set_fill(DARK_BLUE, opacity=1).set_color(DARK_BLUE)

        midRightLine = DashedLine(LEFT * FRAME_WIDTH, RIGHT * FRAME_WIDTH)
        midRightLine.rotate(fp.get_angle() + np.pi / 2,
                            about_point=midRight.get_center())
        midRightLine.move_to(midPoint.get_center())

        self.play(FadeOut(connect))
        self.play(Write(midRight))
        self.play(ShowCreation(midPoint))
        self.play(ShowCreation(midRightLine))
        self.wait()

        right = CText('过P点做l的垂线')
        right.scale(0.4)
        right.to_edge(DOWN)

        rightLine = DashedLine(LEFT * FRAME_WIDTH, RIGHT * FRAME_WIDTH)
        rightLine.shift(UP * (point.get_center()[1]))

        self.play(FadeOut(midRight))
        self.play(Write(right))
        self.play(ShowCreation(rightLine))

        targetCText = CText('垂线与中垂线交点即为曲线上的点')
        targetCText.scale(0.4).to_edge(DOWN)
        target = Circle()\
            .scale(0.1)\
            .set_fill(RED, opacity=1)\
            .set_color(ORANGE)\
            .move_to(self.value_to_point(y.get_value()))

        self.play(FadeOut(right))
        self.play(Write(targetCText))
        self.play(DrawBorderThenFill(target))

        point.add_updater(lambda m: m.move_to(
            self.coords_to_point(-self.focus, y.get_value())))
        fp.add_updater(lambda m: m.put_start_and_end_on(
            point.get_center(), focus.get_center()))
        midPoint.add_updater(lambda m: m.move_to(
            (point.get_center() + focus.get_center()) / 2))
        rightLine.add_updater(lambda m: m.move_to(point.get_center()))
        target.add_updater(
            lambda m: m.move_to(self.value_to_point(y.get_value())))

        def setRight(line):
            line.put_start_and_end_on(LEFT * FRAME_WIDTH, RIGHT * FRAME_WIDTH)
            line.rotate(fp.get_angle() + np.pi / 2,
                        about_point=midRight.get_center())
            line.move_to(midPoint.get_center())

        midRightLine.add_updater(setRight)

        self.play(ApplyMethod(y.set_value, -2))

        graph = self.get_graph(color=LIGHT_BROWN)
        self.play(ApplyMethod(y.set_value, -8), ShowCreation(graph))
        self.wait()
        self.play(ApplyMethod(y.set_value, 8, run_time=2))
        self.wait()

        self.play(ApplyMethod(y.set_value, 2, run_time=2))

        directDef = CText('直线l称为准线')
        directDef.scale(0.4)
        directDef.to_edge(DOWN)

        dire = CText('准线')
        dire.scale(0.3).move_to(lineCText.get_center())
        dire.align_to(lineCText, LEFT)

        self.play(FadeOut(targetCText))
        self.play(Write(directDef))
        self.play(Transform(lineCText, dire))

        self.wait()
        self.play(FadeOut(directDef))

        focDef = CText('点F称为焦点')
        focDef.scale(0.4).to_edge(DOWN)
        foc = CText('焦点')
        foc.scale(0.3).move_to(focusCText.get_center())\
            .align_to(focusCText, LEFT)

        self.play(Write(focDef))
        self.play(Transform(focusCText, foc))
        self.wait(3)

        self.play(ShowCreation(self.get_horizontal()))
        self.play(Write(CText('轴')\
            .scale(0.3).move_to(self.coords_to_point(5, 0.5))))
        self.play(ShowCreation(
            Circle()\
                .scale(0.1)\
                .set_color(DARK_BLUE)\
                .set_fill(DARK_BLUE, opacity=1)\
                .move_to(self.coords_to_point(0, 0))
        ))
        self.play(Write(CText('顶点')\
            .scale(0.3).move_to(self.coords_to_point(0.5, 0.5))))
        self.wait(3)
예제 #19
0
    def construct(self):
        self.adjust_x_range()
        graph = self.get_graph(color=LIGHT_BROWN)
        directrix = self.get_directrix()
        focus = Dot().move_to(self.get_focus())
        focus.set_fill(DARK_BROWN)
        focus.plot_depth = 1
        focusLabel = TexMobject('F').scale(0.5)
        focusLabel.next_to(focus, DOWN, buff=SMALL_BUFF)

        self.play(*[ShowCreation(e) for\
            e in [graph, directrix, focus, focusLabel]])

        y_val = ValueTracker(8)

        p1 = Dot()
        p1.set_color(DARK_BLUE)
        p1.add_updater(lambda m:\
            m.move_to(self.coords_to_point(
                self.func(y_val.get_value()),
                y_val.get_value()
            )))
        p1.plot_depth = 1

        p1_label = TexMobject('P_1').scale(0.5)
        p1_label.plot_depth = 1
        p1_label.add_updater(lambda m:\
            m.next_to(p1, RIGHT, buff=SMALL_BUFF))

        p2 = Dot()
        p2.plot_depth = 1
        p2.set_color(DARK_BLUE)
        p2.add_updater(lambda m:\
            m.move_to(self.coords_to_point(
                self.func(-y_val.get_value()),
                -y_val.get_value()
            )))

        p2_label = TexMobject('P_2').scale(0.5)
        p2_label.plot_depth = 1
        p2_label.add_updater(lambda m:\
            m.next_to(p2, RIGHT, buff=SMALL_BUFF))

        a = Dot()
        a.set_color(DARK_BLUE)
        a.plot_depth = 1
        a.move_to(self.coords_to_point(0, 0))

        a_label = TexMobject('A').scale(0.5)
        a_label.next_to(a, DL, buff=SMALL_BUFF)

        h_line = Line(LEFT*6, RIGHT*2)

        self.play(*[ShowCreation(e) for e in\
            [h_line, a, a_label]])
        self.wait()

        sub1 = CText('取任意双纵标线P1P2')\
            .scale(0.3).to_edge(RIGHT)
        self.play(Write(sub1))
        self.wait()
        self.play(*[ShowCreation(e) for e in\
            [p1, p1_label, p2, p2_label]])

        p1p2 = Line()
        p1p2.add_updater(lambda l:\
            l.put_start_and_end_on(
                p1.get_center(), p2.get_center()
            ))
        self.play(ShowCreation(p1p2))
        self.wait()

        n = Dot()
        n.set_color(DARK_BLUE)
        n.plot_depth = 1
        n.add_updater(lambda m:\
            m.move_to(self.coords_to_point(
                self.func(y_val.get_value()), 0
            )))
        n_label = TexMobject('N').scale(0.5)
        n_label.plot_depth = 1
        n_label.add_updater(lambda m:\
            m.next_to(n, DR, buff=SMALL_BUFF))
        self.play(
            ShowCreation(n),
            ShowCreation(n_label)
        )
        self.wait()

        sub2 = CText('做P1、P2、A的外接圆')\
            .scale(0.3).to_edge(RIGHT)
        self.play(FadeOut(sub1))
        self.play(Write(sub2))

        def set_circle(c):
            pos1 = a.get_center()
            pos2 = p1.get_center()
            pos3 = p2.get_center()

            p = self.focus
            y = y_val.get_value()
            o = self.coords_to_point(
                (16*p*p+y*y)/(8*p), 0
            )

            r = o[0] - pos1[0]
            c.move_to(o)
            c.stretch_to_fit_height(2 * r)
            c.stretch_to_fit_width(2 * r)
            
        circle = Circle()
        circle.set_color(MAROON_E)
        circle.add_updater(lambda m: set_circle(m))
        self.play(ShowCreation(circle))

        self.wait()

        sub3 = CText('交轴于点Q')\
            .scale(0.3).to_edge(RIGHT)
        self.play(FadeOut(sub2))
        self.play(Write(sub3))

        q = Dot()
        q.set_fill(DARK_BLUE)
        q.plot_depth = 1
        q.add_updater(lambda m:\
            m.move_to(n.get_center() +\
            4 * (focus.get_center() - a.get_center())))
        
        q_label = TexMobject('Q').scale(0.5)
        q_label.plot_depth = 1
        q_label.add_updater(lambda m:\
            m.next_to(q, DR, buff=SMALL_BUFF))
        
        self.play(
            ShowCreation(q),
            ShowCreation(q_label)
        )
        self.wait()

        corollary = VGroup()

        head = CText('推论:').scale(0.25)
        head.set_fill(DARK_BLUE)
        
        crlly = TexMobject('NQ=4AF').scale(0.5)

        head_line = VGroup(head, crlly)
        head_line.arrange(RIGHT)

        proof = VGroup()
        proof_head = CText('证明:').scale(0.25)
        proof_head.set_fill(DARK_BLUE)
        proof.add(proof_head)

        proof_details = VGroup()
        prf1 = CText('在直角三角形AQP1中')\
            .scale(0.25)
        prf2 = TexMobject('P_1N^2=AN\\cdot NQ')\
            .scale(0.5)
        prf3 = VGroup()
        prf3_1 = CText('又').scale(0.25)
        prf3_2 = TexMobject(
            '\\because P_1N^2=4AF\\cdot AN')\
            .scale(0.5)
        prf3.add(prf3_1, prf3_2)
        prf3.arrange(RIGHT, buff=SMALL_BUFF)

        prf4 = TexMobject(
            '\\therefore AN\\cdot NQ=4AF\\cdot AN'
        ).scale(0.5)

        prf5 = TexMobject(
            '\\therefore NQ=4AF'
        ).scale(0.5)

        proof_details.add(prf1, prf2, prf3,
            prf4, prf5)
        proof_details.arrange(DOWN)
        proof.add(proof_details)
        proof.arrange(RIGHT)
        proof_details.align_to(proof_head, UP)
        for e in [prf2, prf3, prf4, prf5]:
            e.align_to(prf1, LEFT)

        corollary.add(head_line)
        corollary.add(proof)
        corollary.arrange(DOWN)
        head_line.align_to(proof, LEFT)
        corollary.to_edge(RIGHT)

        self.play(FadeOut(sub3))
        self.play(ShowCreation(head_line))
        self.play(Write(proof_head))
        self.wait(5)

        self.play(Write(prf1))

        ap1 = DashedLine()
        ap1.add_updater(lambda l:\
            l.put_start_and_end_on(
                a.get_center(), p1.get_center()
            ))

        qp1 = DashedLine()
        qp1.add_updater(lambda l:\
            l.put_start_and_end_on(
                q.get_center(), p1.get_center()
            ))
        self.play(
            ShowCreation(ap1),
            ShowCreation(qp1)
        )
        self.play(ShowCreationThenDestruction(
            Polygon(
                a.get_center(),
                q.get_center(),
                p1.get_center()
            ).set_fill(ORANGE, opacity=1)
        ))
        self.wait(5)
        self.play(Write(prf2))

        self.wait(5)
        self.play(Write(prf3))

        self.wait(3)
        self.play(Write(prf4))
        self.wait(3)
        self.play(Write(prf5))
        self.wait(5)

        self.play(y_val.set_value, 4)
        self.wait(3)
        self.play(y_val.set_value, 2)
        self.wait(10)