def construct(self): self.force_skipping() conversation = Conversation(self) conversation.add_bubble("A co sjednotit všechny ordinály?") self.revert_to_original_skipping_status() forti_pic = ImageMobject("BuraliForti1.jpg", use_cache = False) forti_pic.scale(0.43) forti_pic.to_corner(UP+LEFT) ordinal_class = OrdinalClass(color = BLUE).shift(UP) ordinal_class.next_to(forti_pic, coor_mask = X_MASK) num = 7 subordinals = VGroup([ordinal_class.copy() for _ in range(num)]) for subord, x in zip(subordinals, np.linspace(0.3, 1, num)): i = int(x*len(subord.line)) subord.line.remove(*subord.line[i:]) lines_dest = VGroup([subord.line for subord in subordinals]).copy() bars_dest = VGroup([subord.bars for subord in subordinals]).copy() subordinals.arrange_submobjects(UP, False, coor_mask = Y_MASK) subordinals.next_to(conversation.dialog, UP, coor_mask = Y_MASK) lines = VGroup([subord.line for subord in subordinals]) bars = VGroup([subord.bars for subord in subordinals]) self.wait_to(3) self.play(FadeIn(subordinals)) self.wait_to(4.5) self.play( Transform(lines, lines_dest), Transform(bars, bars_dest), ) self.remove(subordinals) self.add(ordinal_class) self.wait_to(6) conversation.add_bubble("Cesare Burali-Forti paradox") next_bar = ordinal_class.bars[0][0].copy().next_to(ordinal_class) next_bar.highlight(YELLOW) self.wait_to(9) self.play(ShowCreation(next_bar)) brace = BraceText(VGroup(ordinal_class, next_bar), "Nový ordinál", UP) self.wait_to(15) self.play(brace.creation_anim()) picture = VGroup(ordinal_class, brace, next_bar) picture.save_state() picture.next_to(forti_pic, coor_mask = X_MASK) self.wait_to(29) self.play(FadeIn(forti_pic)) self.wait_to(49) self.play(*map(FadeOut, [ picture, conversation.dialog, forti_pic, ]))
def construct(self): negatives = VGroup(*[self.number_tex(-n) for n in range(9)]) positives = VGroup(*[self.number_tex(n) for n in range(9)]) negatives.shift(UP) neg_brace = BraceDesc(negatives, "\\aleph_0", UP) pos_brace = BraceDesc(positives, "\\aleph_0", DOWN) self.play(ShowCreation(negatives)) self.play(neg_brace.creation_anim()) self.dither() self.play(ShowCreation(positives)) self.play(pos_brace.creation_anim()) self.dither() self.play( positives.shift, UP, pos_brace.shift, UP, ) self.remove(positives[0]) self.play( FadeOut(pos_brace), neg_brace.shift_brace, VGroup(negatives, negatives[-1].copy().move_to(positives[-1])), ) self.dither() return conversation = Conversation(self) conversation.add_bubble("Hey, what happened to the merged zero?") self.dither() conversation.add_bubble("The size is still countable infinite.") self.dither()
def construct(self): self.h_space = 2 self.colors = color_gradient( [YELLOW, GREEN, BLUE, DARK_BLUE, DARK_GRAY], 20) numbers = self.make_numbers() self.play( ShowCreation(numbers[0]), ShowCreation(numbers[1]), ) brace = BraceDesc(numbers[0], "\\aleph_0", DOWN) brace.next_to(numbers[1], DOWN, coor_mask=Y_MASK, buff=0.3) self.play(brace.creation_anim()) skip = False denominator = 2 parts = [] while True: parts.append(numbers[0].copy()) self.add(parts[-1]) self.play(VGroup(numbers, brace).shift, 0.9 * DOWN) self.remove(numbers) if denominator == 6: break numbers = self.make_numbers(denominator, numbers) ori_numbers = self.make_numbers(denominator - 1, numbers) if skip: offset = (len(ori_numbers[1]) // 2 + 1) % 2 for label in ori_numbers[1][offset::2]: label.set_fill(opacity=0) if denominator == 4: skip = True if skip: offset = (len(numbers[1]) // 2 + 1) % 2 for label in numbers[1][offset::2]: label.set_fill(opacity=0) self.play(ReplacementTransform(ori_numbers, numbers)) denominator += 1 self.dither() self.remove(brace, numbers) while denominator < len(self.colors) + 1: part = self.make_dots(denominator) part.move_to(parts[-1]) part.shift(0.5 * DOWN) parts.append(part) denominator += 1 parts.reverse() parts = VGroup(*parts) parts_dest = parts.copy() for part in parts_dest: part.center() self.play(Transform(parts, parts_dest), run_time=2) self.dither() rationals = TexMobject('|', "\\text{Rational Numbers}", "| = \\aleph_0") rationals.shift(0.5 * DOWN - rationals[1].get_edge_center(UP)) self.play(Write(rationals[1])) self.dither() dots7 = self.make_dots(7) dots7.shift(2 * DOWN) center = len(dots7) // 2 pi_dot = dots7[center + 22] pi_label = TexMobject("\\frac{22}{7}") pi_label.next_to(pi_dot, DOWN) self.play(Write(pi_label)) self.dither() self.play(ShowCreation(dots7)) self.play(FocusOn2(pi_dot, scale=3)) dots7.remove(pi_dot) self.play(FadeOut(dots7)) self.play(VGroup(pi_dot, pi_label).shift, 2 * UP) self.dither() self.play(FadeOut(VGroup(pi_dot, pi_label))) self.play(Write(VGroup(rationals[0], rationals[2]))) conversation1 = Conversation(self) conversation1.add_bubble("Are all sets countable?") self.dither() conversation2 = Conversation(self, start_answer=True) conversation2.add_bubble("Of course not.") self.dither() self.prepare_overall_picture() self.overall_picture.to_edge(UP, buff=0.4) self.overall_picture.remove(self.uncountable_brace) self.play(FadeIn(self.overall_picture)) self.dither() self.play(self.uncountable_brace.creation_anim()) self.dither() real_size = TexMobject("|\\mathbb R|") real_size.set_color(GREEN) real_size.next_to(self.sizes, buff=1) self.play(Write(real_size)) self.dither()
def construct(self): # self.force_skipping() # left-closed, right-open, two intervals interval1 = SemiOpen() interval2 = interval1.copy() VGroup(interval1, interval2).arrange_submobjects(buff=1) self.play( FadeIn(interval1), FadeIn(interval2), ) self.wait_to(11) self.play( interval1.move_to, LEFT, interval2.move_to, RIGHT, ) self.remove(interval1.second_point) self.play(interval2.first_point.scale_in_place, 0) interval = SemiOpen(2 * LEFT, 2 * RIGHT) self.remove(interval1, interval2) self.add(interval) self.dither() interval_dest = SemiOpen(LEFT, RIGHT) self.play(Transform(interval, interval_dest)) self.wait_to(22) self.play(FadeOut(interval)) interval1 = SemiOpen() interval2 = interval1.copy() VGroup(interval1, interval2).arrange_submobjects(buff=1) for interval in [interval1, interval2]: interval.stretch_in_place(-1, 0) # left-open, right-closed, two intervals self.play( FadeIn(interval1), FadeIn(interval2), ) self.play( interval2.move_to, RIGHT, interval1.move_to, LEFT, ) self.remove(interval2.second_point) self.play(interval1.first_point.scale_in_place, 0) interval = SemiOpen(2 * RIGHT, 2 * LEFT) self.remove(interval1, interval2) self.add(interval) interval_dest = SemiOpen(RIGHT, LEFT) self.play(Transform(interval, interval_dest)) self.wait_to(27.5) # left-open, right-closed, omega omega = OrdinalOmega() omega.highlight(DARK_GREY) interval_copies = [] for bar in omega: interval_copy = SemiOpen(RIGHT * bar.x1, RIGHT * bar.x0, dot_radius=0.1 * bar.height) interval_copies.append(interval_copy) final_interval = SemiOpen(RIGHT * omega.x0, RIGHT * omega.x1) interval_copies.reverse() interval_copies = VGroup(interval_copies) VGroup(omega, interval_copies, final_interval).shift(UP) self.play( FadeIn(omega), interval.shift, 0.8 * DOWN, ) interval_copies_src = interval_copies.copy() for interval_copy in interval_copies_src: interval_copy.scale_in_place(0) self.play(ReplacementTransform(interval_copies_src, interval_copies)) to_shrink = [] for interval_copy in interval_copies: self.remove(interval_copy.second_point) to_shrink.append(interval_copy.first_point) self.add(interval_copies[-1].second_point) to_shrink = VGroup(to_shrink) to_shrink_ori = to_shrink.copy() shrinked = to_shrink.copy() for dot in shrinked: dot.scale_in_place(0) self.play( Transform(to_shrink, shrinked), UnapplyMethod(final_interval.second_point.scale_in_place, 0), run_time=0.5, ) self.remove(interval_copies) self.add(final_interval.line, interval_copies[-1].second_point) self.add_foreground_mobjects(final_interval.second_point) self.wait_to(42) # left-closed, right-open, omega self.play(Rotate(interval, in_place=True)) # 43 self.dither() # 44 self.play( Transform(to_shrink, to_shrink_ori), run_time=0.5, ) # 44.5 interval_copies_dest = interval_copies.copy() bg, bg_dest, fg, fg_dest = [], [], [], [] for interval_copy_dest in interval_copies_dest: interval_copy_dest.scale_in_place(-1) bg_dest += [ interval_copy_dest.line, interval_copy_dest.second_point ] fg_dest.append(interval_copy_dest.first_point) for interval_copy in interval_copies: bg += [interval_copy.line, interval_copy.second_point] fg.append(interval_copy.first_point) bg, bg_dest, fg, fg_dest = map(VGroup, (bg, bg_dest, fg, fg_dest)) self.remove(final_interval) self.add_foreground_mobjects(final_interval.second_point) self.play( Transform(bg, bg_dest, path_arc=np.pi), Transform(fg, fg_dest, path_arc=np.pi), ) self.remove(bg) self.add(final_interval) shrinked = to_shrink.copy() for dot in shrinked: dot.scale_in_place(0) self.play( Transform(to_shrink, shrinked), run_time=0.5, ) # left-closed, right-open, omega*2 interval_template = interval # some renaming interval = final_interval omega_cdot_2 = OrdinalFiniteProd(OrdinalOmega, 2) omega_cdot_2.set_color(DARK_GREY) intervals2 = [ SemiOpen(RIGHT * ordinal.x0, RIGHT * ordinal.x1) for ordinal in omega_cdot_2[0], omega_cdot_2[1][0], omega_cdot_2[1] [1], omega_cdot_2 ] intervals2.append( SemiOpen(RIGHT * omega_cdot_2.x0, RIGHT * omega_cdot_2[1][1].x1)) VGroup(omega_cdot_2, intervals2).shift(UP) self.wait_to(50) self.play( ReplacementTransform(omega, omega_cdot_2[0]), Transform(interval, intervals2[0]), ) self.revert_to_original_skipping_status() self.wait_to(52.5) self.remove_foreground_mobjects(interval.second_point) interval2_1_src = intervals2[1].copy() interval2_1_src.set_color(BLACK).shift(RIGHT) self.play(ShowCreation(omega_cdot_2[1][0]), Animation(interval), ReplacementTransform(interval2_1_src, intervals2[1])) self.remove(interval.second_point) interval.line.scale_about_point(1.1, interval.line.get_edge_center(LEFT)) self.play(intervals2[1].first_point.scale_in_place, 0, run_time=0.5) self.wait_to(54.5) interval2_2_src = intervals2[2].copy() interval2_2_src.set_color(BLACK).shift(RIGHT) self.play(ShowCreation(omega_cdot_2[1][1]), Animation(intervals2[1]), ReplacementTransform(interval2_2_src, intervals2[2])) self.remove(interval, intervals2[1], intervals2[2]) interval = intervals2[4] self.add(interval) self.play(intervals2[2].first_point.scale_in_place, 0, run_time=0.5) self.remove(intervals2[2].first_point) self.wait_to(56) self.play( FadeIn(VGroup(omega_cdot_2[1][2:]), submobject_mode="lagged_start"), Transform(interval, intervals2[3]), ) self.wait_to(60 + 7) conversation = Conversation(self) conversation.add_bubble( "Neměl by být výsledek delší než první činitel?") self.wait_to(60 + 20.5) conversation.add_bubble("Intervaly nejsou dobře uspořádané.") self.wait_to(60 + 49) self.play(FadeOut(VGroup(omega_cdot_2, interval, conversation.dialog)))
def construct(self, fast_play=False): #self.force_skipping() omega = OrdinalOmega() omega_plus_5 = OrdinalSum(OrdinalOmega, 0.75, lambda **kwargs: OrdinalFinite(5, **kwargs)) omega_times_3 = OrdinalFiniteProd(OrdinalOmega, 3) omega_pow_3 = make_ordinal_power(3, q=(0.7, 0.84, 0.84)) ordinals = VGroup(omega, omega_plus_5, omega_times_3, omega_pow_3) ordinals.stretch(0.4, 1) ordinals.arrange_submobjects(DOWN, aligned_edge=LEFT, center=False) ordinals.shift(-Y_MASK * ordinals.get_center()) dots = TexMobject("\\vdots") dots.next_to(ordinals, DOWN) if fast_play: self.add(ordinals, dots) else: self.play(ShowCreation(omega)) self.wait_to(6) self.play(ShowCreation(omega_plus_5)) self.wait_to(7.3) self.play(ShowCreation(omega_times_3)) self.wait_to(8.7) self.play(ShowCreation(omega_pow_3)) self.play(FadeIn(dots)) result = OrdinalFiniteProd(OrdinalOmega, 5, x1=8) result_stretched = result.copy() result_stretched.stretch( omega[0].get_height() / result_stretched[0][0].get_height(), 1) al_omega = result_stretched[0].copy() al_omega.shift(omega[0].get_center() - al_omega[0].get_center()) al_omega_plus_5 = VGroup(result_stretched[0].copy()) al_omega_plus_5.shift(omega_plus_5[0][0].get_center() - al_omega_plus_5[0][0].get_center()) al_five = omega_plus_5[1].copy() for bar, dest in zip(al_five, result[1]): bar.move_to(dest, coor_mask=X_MASK) al_omega_plus_5.add(al_five) al_omega_times_3 = VGroup(*result_stretched[:3]).copy() al_omega_times_3.shift(omega_times_3[0][0].get_center() - al_omega_times_3[0][0].get_center()) result_in_pow_3 = result_stretched.copy() result_in_pow_3.shift(omega_pow_3[0][0][0].get_center() - result_in_pow_3[0][0].get_center()) al_omega_pow_3 = omega_pow_3.copy() al_omega_pow_3.next_to(result_in_pow_3, buff=0) al_omega_pow_3[0].add_to_back(*result_in_pow_3.submobjects) al_ordinals = VGroup(al_omega, al_omega_plus_5, al_omega_times_3, al_omega_pow_3) if not fast_play: self.wait_to(17.5) self.play(ReplacementTransform(ordinals, al_ordinals)) al_ordinals.remove(al_omega_pow_3) al_ordinals.add(result_in_pow_3) result_bottom = result.copy() result_bottom.stretch(0, 1) result_bottom = VGroup(*[result_bottom.copy() for _ in range(5)]) result_bottom.arrange_submobjects(DOWN, buff=0.3, center=False) result_bottom.to_edge(DOWN, buff=0) al_ordinals.add(result_bottom) mrg_omega = result[0].copy() mrg_omega_plus_5 = VGroup(result[0], VGroup(*result[1][:5])).copy() mrg_omega_times_3 = VGroup(*result[:3]).copy() mrg_ordinals = VGroup( mrg_omega, mrg_omega_plus_5, mrg_omega_times_3, result.copy(), VGroup(result.copy()), ) if not fast_play: self.wait_to(19) self.play( FadeOut(dots), ReplacementTransform(al_ordinals, mrg_ordinals), ) self.remove(mrg_ordinals) self.add(result) if fast_play: return result brace = BraceDesc(result, "\\omega_1", UP) self.wait_to(20.2) self.play(brace.creation_anim()) self.wait_to(22) conversation = Conversation(self) conversation.add_bubble( "Ale podle kapitoly 5 si nemůžeme vzít všechny ordinály.") self.wait_to(29.5) conversation.add_bubble("To ne, ale všechny spočetné můžeme.") self.wait_to(39) self.add_foreground_mobjects(conversation.dialog) self.play(FadeOut(VGroup(brace, result))) omega = OrdinalOmega() omega.shift(2 * UP) self.play(ShowCreation(omega)) self.wait_to(48.5) self.play(FadeOut(conversation.dialog))
def construct(self): conversation = Conversation(self, start_answer=True) conversation.add_bubble("Existuje množina všech množin?") conversation.add_bubble("Jasně, proč by neměla?") self.dither() conversation.add_bubble( "A co množina všech množin, které neobsahují samy sebe?") self.dither(2) conversation.add_bubble("Tak z té první některé vyhodíme.") self.dither() conversation.add_bubble("Obsahuje taková množina samu sebe?") conversation.add_bubble("Jejda...") self.wait_to(12.5)
def construct(self): num = 5 ordinals_cnt_base = OrdinalFiniteProd(OrdinalOmega, num, x1=-4 + num * 2.5) ordinals_cnt = VGroup( [VGroup(ordinals_cnt_base[:i]).copy() for i in range(1, num + 1)]) ordinals_cnt.save_state() ordinals_cnt.arrange_submobjects(DOWN, center=False, coor_mask=Y_MASK) ordinals_cnt.to_edge(UP) self.play(ShowCreation(ordinals_cnt)) #self.wait_to(7) self.dither() self.play(ordinals_cnt.restore) self.remove(ordinals_cnt) self.add(ordinals_cnt_base) omega1 = Omega1() brace = BraceDesc(omega1, "\\omega_1", DOWN) omega1.line.save_state() omega1.line.behind_edge(RIGHT) omega1_bars_src = make_ordinal_power(2) omega1_bars_src.next_to(ordinals_cnt_base) omega1_bars_src.add_to_back(*ordinals_cnt_base) brace.desc.highlight(BLUE) brace.save_state() brace.shift_brace(omega1_bars_src) brace.highlight(BLACK) self.play( brace.restore, omega1.line.restore, ReplacementTransform(omega1_bars_src, omega1.bars), ) #self.wait_to(11) self.dither() aleph1 = TexMobject("\\aleph_1", "=|", "\omega_1", "|") aleph1[2].highlight(BLUE) aleph1[0].highlight(RED) aleph1.shift(brace.desc.get_center() - aleph1[2].get_center()) aleph1.remove(aleph1[2]) self.play(Write(aleph1)) #self.wait_to(15) self.dither() ordinals_a1 = VGroup([omega1.copy() for _ in range(num)]) aleph1[0].save_state() aleph1[0].next_to(omega1, LEFT, coor_mask=X_MASK) self.play( omega1.to_edge, UP, FadeOut(VGroup(brace, aleph1[1:])), MoveFromSaved(aleph1[0]), ) #self.wait_to(18.5) self.dither() aleph1 = aleph1[0] scale_center = np.array(ordinals_a1[0].line.get_start()) for i, o in enumerate(ordinals_a1): o.line.scale(1 + i * 0.2, about_point=scale_center) ordinals_a1_lines_dest = VGroup([o.line for o in ordinals_a1]).copy() ordinals_a1_bars_dest = VGroup([o.bars for o in ordinals_a1]).copy() ordinals_a1.arrange_submobjects(DOWN, False, coor_mask=Y_MASK) ordinals_a1.to_edge(UP) ordinals_a1_lines = VGroup([o.line for o in ordinals_a1]) ordinals_a1_bars = VGroup([o.bars for o in ordinals_a1]) self.remove(omega1) self.add(ordinals_a1[0]) self.play(FadeIn(VGroup(ordinals_a1[1:]))) self.play( Transform(ordinals_a1_lines, ordinals_a1_lines_dest), Transform(ordinals_a1_bars, ordinals_a1_bars_dest), ) self.remove(*ordinals_a1[:-1]) omega2_src = ordinals_a1[-1] omega2 = LongOrdinal(ordinal_end=0.3, line_start=0.2) brace = BraceDesc(omega2, "\\omega_2", DOWN) brace.desc.highlight(BLUE) brace.save_state() brace.shift_brace(omega2_src) brace.highlight(BLACK) self.play( brace.restore, ReplacementTransform(omega2_src, omega2), ) #self.wait_to(24.5) self.dither() aleph2 = TexMobject("\\aleph_2", "=|", "\omega_2", "|") aleph2[2].highlight(BLUE) aleph2[0].highlight(RED) aleph2.shift(brace.desc.get_center() - aleph2[2].get_center()) aleph2.remove(aleph2[2]) self.play(Write(aleph2)) #self.wait_to(28) self.dither() ordinal_fin = OrdinalFinite(7, x1=SPACE_WIDTH + 1).highlight(BLUE) ord_labels = VGroup([ TexMobject("\\omega_{}".format(i + 1)).highlight(BLUE).next_to( bar, UP) for i, bar in enumerate(ordinal_fin[:4]) ]) card_labels = VGroup([ TexMobject("\\aleph_{}".format(i + 1)).highlight(RED).next_to( bar, DOWN) for i, bar in enumerate(ordinal_fin[:4]) ]) self.play( FadeOut(VGroup(aleph2[1:], brace, omega2)), ReplacementTransform(aleph1, card_labels[0]), ReplacementTransform(aleph2[0], card_labels[1]), ) for i, t in enumerate((29, 31, 35.5, 38)): #self.wait_to(t) self.play(FadeIn(ord_labels[i]), ShowCreation(ordinal_fin[i])) if i >= 2: self.play(FadeIn(card_labels[i])) #self.wait_to(41) self.play(ShowCreation(VGroup(ordinal_fin[4:], rate_func=rush_into))) omega = OrdinalOmega().highlight(BLUE) omega_src = omega.copy() omega_src.next_to(ordinal_fin, buff=1) omega_src.add_to_back(*ordinal_fin) label1 = VGroup(ord_labels[0], card_labels[0]) labels_to_fade = VGroup(list(zip(ord_labels[1:], card_labels[1:]))) labels_to_fade.save_state() for l, bar in zip(labels_to_fade, omega[1:4]): l.move_to(bar, coor_mask=X_MASK) l.highlight(BLACK) limit_bar = omega[0].copy().next_to(omega) limit_lord = TexMobject("\\omega_\\omega").highlight(BLUE).next_to( limit_bar, UP) limit_lcard = TexMobject("\\aleph_\\omega").highlight(RED).next_to( limit_bar, DOWN) limit_g = VGroup(limit_bar, limit_lord, limit_lcard) limit_g.next_to(omega, coor_mask=X_MASK) limit_g.save_state() limit_g.next_to(omega_src, coor_mask=X_MASK) self.play( MoveFromSaved(labels_to_fade), ReplacementTransform(omega_src, omega), Animation(label1), limit_g.restore, ) self.remove(labels_to_fade) #self.wait_to(52) plus1_bar = limit_bar.copy() plus1_label = TexMobject("\\omega_{\\omega+1}").highlight( BLUE).next_to(plus1_bar, UP) plus1_g = VGroup(plus1_bar, plus1_label) plus1_g.next_to(limit_g, coor_mask=X_MASK, buff=0.5) self.play(FadeIn(plus1_label), ShowCreation(plus1_bar)) #self.wait_to(55) omega_pow = make_ordinal_power(2, q=(0.8, 0.9, 0.9)).highlight(BLUE) omega_pow_src = omega_pow.copy() omega_pow_src.behind_edge(RIGHT) omega_pow_src[0].add_to_back(limit_bar, plus1_bar) omega_pow_src.add_to_back(omega) limit_g.remove(limit_bar) limit_g.save_state() plus1_label.save_state() limit_g.move_to(omega_pow[1][0], coor_mask=X_MASK) plus1_label.move_to(omega_pow[1][1], coor_mask=X_MASK).highlight(BLACK) pow_bar = limit_bar.copy() pow_label = TexMobject("\\omega_{\\omega\\cdot\\omega}").highlight( BLUE).next_to(pow_bar, UP) pow_g = VGroup(pow_bar, pow_label) pow_g.next_to(omega_pow, coor_mask=X_MASK, buff=-.2) pow_g.save_state() pow_g.next_to(omega_pow_src, coor_mask=X_MASK) self.play( MoveFromSaved(plus1_label), ReplacementTransform(omega_pow_src, omega_pow), MoveFromSaved(limit_g), pow_g.restore, ) self.remove(plus1_label) #self.wait_to(59) self.dither() labels_to_fade = VGroup(label1, limit_g, pow_label) labels_to_fade.save_state() labels_to_fade.highlight(BLACK) omega1 = Omega1(color=BLUE) omega1_bar = pow_bar.copy() omega1_label = TexMobject("\\omega_{\\omega_1}").highlight( BLUE).next_to(omega1_bar, UP) omega1_g = VGroup(omega1_bar, omega1_label) omega1_g.shift(omega1.line.get_end() - omega1_bar.get_center()) omega1_g.add(omega1.line) omega1_g.save_state() omega1_g.behind_edge(RIGHT) limit_g.move_to(omega1.bars[1][0], coor_mask=X_MASK) pow_label.move_to(omega1.bars[-1], coor_mask=X_MASK) pow_bar.save_state() pow_bar.scale(0) pow_bar.set_stroke(width=0) pow_bar.move_to(omega1.bars[-1]) self.play( MoveFromSaved(labels_to_fade, remover=True), omega1_g.restore, MoveFromSaved(pow_bar, remover=True), ReplacementTransform(omega_pow, omega1.bars), ) #self.wait_to(60+7.5) self.dither() ordinal_fin = OrdinalFinite(6, x1=SPACE_WIDTH + 1).highlight(BLUE) omega1.save_state() omega1.stretch_about_point(0, 0, ordinal_fin[0].get_center()) labels = VGroup([ TexMobject((i + 1) * "\\omega_{" + "\\omega_1" + (i + 1) * "}").next_to(bar, UP) for i, bar in enumerate(ordinal_fin[:3]) ]) labels.highlight(BLUE) next_bar = VGroup(labels[1], ordinal_fin[1]) next_bar.save_state() next_bar.shift(8 * RIGHT) self.play( MoveFromSaved(omega1, remover=True), next_bar.restore, ReplacementTransform(omega1_label, labels[0]), ReplacementTransform(omega1_bar, ordinal_fin[0]), ) #self.wait_to(60+11) self.play(FadeIn(labels[2]), ShowCreation(ordinal_fin[2])) #self.wait_to(60+13) self.play(ShowCreation(VGroup(ordinal_fin[3:]), rate_func=rush_into)) #self.wait_to(60+21.5) self.dither(2) conversation = Conversation(self) conversation.add_bubble("What about the union of all the ordinals?") self.play(FadeOut(VGroup(labels, ordinal_fin)), Animation(conversation.dialog))
def construct(self): conversation = Conversation(self, start_answer=True) conversation.add_bubble("Is there a set of all sets?") conversation.add_bubble("Sure, why shouldn't be?") self.dither() conversation.add_bubble( "What about the set of all sets not containing themselves?") self.dither() conversation.add_bubble( "Just discard some elements of the previous one?") self.dither() conversation.add_bubble("Does such a set contain itself?") conversation.add_bubble("Oops...")