Merge pull request #379 from 3b1b/lkevinzc-fixes

Change imports to manimlib, remove unused imports, formatting
This commit is contained in:
Devin Neal 2018-12-27 12:21:06 -06:00 committed by GitHub
commit c71879a159
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
53 changed files with 77 additions and 138 deletions

View file

@ -1,4 +1,3 @@
import itertools as it
import warnings import warnings
import numpy as np import numpy as np
@ -104,8 +103,7 @@ class Succession(Animation):
self.scene_mobjects_at_time = [None for i in range(self.num_anims + 1)] self.scene_mobjects_at_time = [None for i in range(self.num_anims + 1)]
self.scene_mobjects_at_time[0] = Group() self.scene_mobjects_at_time[0] = Group()
for i in range(self.num_anims): for i in range(self.num_anims):
self.scene_mobjects_at_time[i + self.scene_mobjects_at_time[i + 1] = self.scene_mobjects_at_time[i].copy()
1] = self.scene_mobjects_at_time[i].copy()
self.animations[i].clean_up(self.scene_mobjects_at_time[i + 1]) self.animations[i].clean_up(self.scene_mobjects_at_time[i + 1])
self.current_alpha = 0 self.current_alpha = 0
@ -154,7 +152,7 @@ class Succession(Animation):
# self.critical_alphas (which is also 1.0) # self.critical_alphas (which is also 1.0)
if not abs(alpha - 1) < 0.001: if not abs(alpha - 1) < 0.001:
warnings.warn( warnings.warn(
"Rounding error not near alpha=1 in Succession.update_mobject," + "Rounding error not near alpha=1 in Succession.update_mobject,"
"instead alpha = %f" % alpha "instead alpha = %f" % alpha
) )
print(self.critical_alphas, alpha) print(self.critical_alphas, alpha)

View file

@ -1,5 +1,3 @@
import numpy as np
from manimlib.animation.composition import LaggedStart from manimlib.animation.composition import LaggedStart
from manimlib.animation.transform import ApplyMethod from manimlib.animation.transform import ApplyMethod
from manimlib.constants import * from manimlib.constants import *

View file

@ -118,7 +118,7 @@ class ApplyMethod(Transform):
""" """
if not inspect.ismethod(method): if not inspect.ismethod(method):
raise Exception( raise Exception(
"Whoops, looks like you accidentally invoked " + "Whoops, looks like you accidentally invoked "
"the method you want to animate" "the method you want to animate"
) )
assert(isinstance(method.__self__, Mobject)) assert(isinstance(method.__self__, Mobject))

View file

@ -36,8 +36,6 @@ class MaintainPositionRelativeTo(Animation):
Animation.__init__(self, mobject, **kwargs) Animation.__init__(self, mobject, **kwargs)
def update_mobject(self, alpha): def update_mobject(self, alpha):
self.mobject.shift( target = self.tracked_mobject.get_critical_point(self.tracked_critical_point)
self.tracked_mobject.get_critical_point(self.tracked_critical_point) - location = self.mobject.get_critical_point(self.tracked_critical_point)
self.mobject.get_critical_point(self.tracked_critical_point) + self.mobject.shift(target - location + self.diff)
self.diff
)

View file

@ -1,4 +1,3 @@
from functools import reduce from functools import reduce
import itertools as it import itertools as it
import operator as op import operator as op
@ -15,7 +14,6 @@ from manimlib.mobject.mobject import Mobject
from manimlib.mobject.types.point_cloud_mobject import PMobject from manimlib.mobject.types.point_cloud_mobject import PMobject
from manimlib.mobject.types.vectorized_mobject import VMobject from manimlib.mobject.types.vectorized_mobject import VMobject
from manimlib.utils.color import color_to_int_rgba from manimlib.utils.color import color_to_int_rgba
from manimlib.utils.color import rgb_to_hex
from manimlib.utils.config_ops import digest_config from manimlib.utils.config_ops import digest_config
from manimlib.utils.images import get_full_raster_image_path from manimlib.utils.images import get_full_raster_image_path
from manimlib.utils.iterables import batch_by_property from manimlib.utils.iterables import batch_by_property

View file

@ -35,6 +35,7 @@ class MappingCamera(Camera):
excluded_mobjects=None, excluded_mobjects=None,
) )
# Note: This allows layering of multiple cameras onto the same portion of the pixel array, # Note: This allows layering of multiple cameras onto the same portion of the pixel array,
# the later cameras overwriting the former # the later cameras overwriting the former
# #
@ -42,7 +43,6 @@ class MappingCamera(Camera):
# CameraPlusOverlay class) # CameraPlusOverlay class)
# TODO, the classes below should likely be deleted # TODO, the classes below should likely be deleted
class OldMultiCamera(Camera): class OldMultiCamera(Camera):
def __init__(self, *cameras_with_start_positions, **kwargs): def __init__(self, *cameras_with_start_positions, **kwargs):
self.shifted_cameras = [ self.shifted_cameras = [

View file

@ -5,7 +5,6 @@ from manimlib.constants import ORIGIN
from manimlib.constants import WHITE from manimlib.constants import WHITE
from manimlib.mobject.frame import ScreenRectangle from manimlib.mobject.frame import ScreenRectangle
from manimlib.mobject.types.vectorized_mobject import VGroup from manimlib.mobject.types.vectorized_mobject import VGroup
from manimlib.mobject.types.vectorized_mobject import VectorizedPoint
from manimlib.utils.config_ops import digest_config from manimlib.utils.config_ops import digest_config

View file

@ -7,7 +7,6 @@ from manimlib.mobject.three_d_utils import get_3d_vmob_end_corner_unit_normal
from manimlib.mobject.three_d_utils import get_3d_vmob_start_corner from manimlib.mobject.three_d_utils import get_3d_vmob_start_corner
from manimlib.mobject.three_d_utils import get_3d_vmob_start_corner_unit_normal from manimlib.mobject.three_d_utils import get_3d_vmob_start_corner_unit_normal
from manimlib.mobject.types.point_cloud_mobject import Point from manimlib.mobject.types.point_cloud_mobject import Point
from manimlib.mobject.types.vectorized_mobject import VMobject
from manimlib.mobject.value_tracker import ValueTracker from manimlib.mobject.value_tracker import ValueTracker
from manimlib.utils.color import get_shaded_rgb from manimlib.utils.color import get_shaded_rgb
from manimlib.utils.simple_functions import clip_in_place from manimlib.utils.simple_functions import clip_in_place

View file

@ -1 +0,0 @@

View file

@ -42,8 +42,7 @@ class ContinualAnimation(object):
dt *= float(self.external_time) / self.start_up_time dt *= float(self.external_time) / self.start_up_time
elif self.external_time > self.end_time - self.wind_down_time: elif self.external_time > self.end_time - self.wind_down_time:
dt *= np.clip( dt *= np.clip(
float(self.end_time - self.external_time) / float(self.end_time - self.external_time) / self.wind_down_time,
self.wind_down_time,
0, 1 0, 1
) )
self.internal_time += dt self.internal_time += dt

View file

@ -1,5 +1,3 @@
from manimlib.continual_animation.continual_animation import ContinualAnimation from manimlib.continual_animation.continual_animation import ContinualAnimation

View file

@ -1,5 +1,3 @@
from manimlib.animation.numbers import ChangingDecimal from manimlib.animation.numbers import ChangingDecimal
from manimlib.continual_animation.from_animation import NormalAnimationAsContinualAnimation from manimlib.continual_animation.from_animation import NormalAnimationAsContinualAnimation

View file

@ -1,5 +1,3 @@
from manimlib.animation.update import MaintainPositionRelativeTo from manimlib.animation.update import MaintainPositionRelativeTo
from manimlib.continual_animation.continual_animation import ContinualAnimation from manimlib.continual_animation.continual_animation import ContinualAnimation
from manimlib.mobject.value_tracker import ValueTracker from manimlib.mobject.value_tracker import ValueTracker

View file

@ -1,7 +1,7 @@
import importlib
import inspect import inspect
import itertools as it import itertools as it
import os import os
import platform
import subprocess as sp import subprocess as sp
import sys import sys
import traceback import traceback
@ -13,7 +13,6 @@ import manimlib.constants
def handle_scene(scene, **config): def handle_scene(scene, **config):
import platform
if config["quiet"]: if config["quiet"]:
curr_stdout = sys.stdout curr_stdout = sys.stdout
sys.stdout = open(os.devnull, "w") sys.stdout = open(os.devnull, "w")

View file

@ -1,7 +1,5 @@
import random import random
import string
from manimlib.animation.animation import Animation
from manimlib.animation.composition import LaggedStart from manimlib.animation.composition import LaggedStart
from manimlib.animation.creation import DrawBorderThenFill from manimlib.animation.creation import DrawBorderThenFill
from manimlib.animation.creation import FadeIn from manimlib.animation.creation import FadeIn

View file

@ -1,15 +1,12 @@
import warnings
import numpy as np
from manimlib.constants import * from manimlib.constants import *
from manimlib.for_3b1b_videos.pi_creature import PiCreature from manimlib.for_3b1b_videos.pi_creature import PiCreature
from manimlib.mobject.types.vectorized_mobject import VGroup from manimlib.mobject.types.vectorized_mobject import VGroup
class PiCreatureClass(VGroup): class PiCreatureClass(VGroup):
CONFIG = { CONFIG = {
"width" : 3, "width": 3,
"height" : 2 "height": 2
} }
def __init__(self, **kwargs): def __init__(self, **kwargs):
@ -17,7 +14,5 @@ class PiCreatureClass(VGroup):
for i in range(self.width): for i in range(self.width):
for j in range(self.height): for j in range(self.height):
pi = PiCreature().scale(0.3) pi = PiCreature().scale(0.3)
pi.move_to(i*DOWN + j* RIGHT) pi.move_to(i * DOWN + j * RIGHT)
self.add(pi) self.add(pi)

View file

@ -12,8 +12,6 @@ from manimlib.mobject.svg.tex_mobject import TextMobject
from manimlib.mobject.types.vectorized_mobject import VGroup from manimlib.mobject.types.vectorized_mobject import VGroup
from manimlib.mobject.types.vectorized_mobject import VMobject from manimlib.mobject.types.vectorized_mobject import VMobject
from manimlib.utils.config_ops import digest_config from manimlib.utils.config_ops import digest_config
from manimlib.utils.rate_functions import squish_rate_func
from manimlib.utils.rate_functions import there_and_back
from manimlib.utils.space_ops import get_norm from manimlib.utils.space_ops import get_norm
pi_creature_dir_maybe = os.path.join(MEDIA_DIR, "designs", "PiCreature") pi_creature_dir_maybe = os.path.join(MEDIA_DIR, "designs", "PiCreature")
@ -60,7 +58,7 @@ class PiCreature(SVGMobject):
"%s_%s.svg" % (self.file_name_prefix, mode) "%s_%s.svg" % (self.file_name_prefix, mode)
) )
SVGMobject.__init__(self, file_name=svg_file, **kwargs) SVGMobject.__init__(self, file_name=svg_file, **kwargs)
except: except Exception:
warnings.warn("No %s design with mode %s" % warnings.warn("No %s design with mode %s" %
(self.file_name_prefix, mode)) (self.file_name_prefix, mode))
svg_file = os.path.join( svg_file = os.path.join(

View file

@ -100,44 +100,23 @@ class RemovePiCreatureBubble(AnimationGroup):
surrounding_scene.add(self.pi_creature) surrounding_scene.add(self.pi_creature)
class FlashThroughClass(Animation): class FlashThroughClass(Animation):
CONFIG = { CONFIG = {
"highlight_color" : GREEN, "highlight_color": GREEN,
} }
def __init__(self, mobject, mode = "linear", **kwargs): def __init__(self, mobject, mode="linear", **kwargs):
if not isinstance(mobject, PiCreatureClass): if not isinstance(mobject, PiCreatureClass):
raise Exception("FlashThroughClass mobject must be a PiCreatureClass") raise Exception("FlashThroughClass mobject must be a PiCreatureClass")
digest_config(self, kwargs) digest_config(self, kwargs)
self.indices = list(range(mobject.height * mobject.width)) self.indices = list(range(mobject.height * mobject.width))
if mode == "random": if mode == "random":
np.random.shuffle(self.indices) np.random.shuffle(self.indices)
Animation.__init__(self, mobject, **kwargs) Animation.__init__(self, mobject, **kwargs)
def update_mobject(self, alpha): def update_mobject(self, alpha):
index = int(np.floor(alpha * self.mobject.height * self.mobject.width)) index = int(np.floor(alpha * self.mobject.height * self.mobject.width))
for pi in self.mobject: for pi in self.mobject:
pi.set_color(BLUE_E) pi.set_color(BLUE_E)
if index < self.mobject.height * self.mobject.width: if index < self.mobject.height * self.mobject.width:
self.mobject[self.indices[index]].set_color(self.highlight_color) self.mobject[self.indices[index]].set_color(self.highlight_color)

View file

@ -1,8 +1,6 @@
import itertools as it import itertools as it
import random import random
import numpy as np
from manimlib.animation.transform import ApplyMethod from manimlib.animation.transform import ApplyMethod
from manimlib.animation.transform import ReplacementTransform from manimlib.animation.transform import ReplacementTransform
from manimlib.animation.transform import Transform from manimlib.animation.transform import Transform

View file

@ -19,7 +19,6 @@ from manimlib.utils.iterables import remove_list_redundancies
from manimlib.utils.paths import straight_path from manimlib.utils.paths import straight_path
from manimlib.utils.simple_functions import get_num_args from manimlib.utils.simple_functions import get_num_args
from manimlib.utils.space_ops import angle_of_vector from manimlib.utils.space_ops import angle_of_vector
from manimlib.utils.space_ops import complex_to_R3
from manimlib.utils.space_ops import get_norm from manimlib.utils.space_ops import get_norm
from manimlib.utils.space_ops import rotation_matrix from manimlib.utils.space_ops import rotation_matrix
@ -102,7 +101,7 @@ class Mobject(Container):
def get_image(self, camera=None): def get_image(self, camera=None):
if camera is None: if camera is None:
from camera.camera import Camera from manimlib.camera.camera import Camera
camera = Camera() camera = Camera()
camera.capture_mobject(self) camera.capture_mobject(self)
return camera.get_image() return camera.get_image()
@ -530,7 +529,7 @@ class Mobject(Container):
def add_background_rectangle(self, color=BLACK, opacity=0.75, **kwargs): def add_background_rectangle(self, color=BLACK, opacity=0.75, **kwargs):
# TODO, this does not behave well when the mobject has points, # TODO, this does not behave well when the mobject has points,
# since it gets displayed on top # since it gets displayed on top
from mobject.shape_matchers import BackgroundRectangle from manimlib.mobject.shape_matchers import BackgroundRectangle
self.background_rectangle = BackgroundRectangle( self.background_rectangle = BackgroundRectangle(
self, color=color, self, color=color,
fill_opacity=opacity, fill_opacity=opacity,

View file

@ -544,7 +544,7 @@ class Car(SVGMobject):
self.set_stroke(color=WHITE, width=0) self.set_stroke(color=WHITE, width=0)
self.set_fill(self.color, opacity=1) self.set_fill(self.color, opacity=1)
from for_3b1b_videos.pi_creature import Randolph from manimlib.for_3b1b_videos.pi_creature import Randolph
randy = Randolph(mode="happy") randy = Randolph(mode="happy")
randy.set_height(0.6 * self.get_height()) randy.set_height(0.6 * self.get_height())
randy.stretch(0.8, 0) randy.stretch(0.8, 0)

View file

@ -520,8 +520,8 @@ class VMobject(Mobject):
# Each element of index_allocation is like a bucket, # Each element of index_allocation is like a bucket,
# and its value tells you the appropriate index of # and its value tells you the appropriate index of
# the smaller curve. # the smaller curve.
index_allocation = (np.arange(curr + n - 1) * index_allocation = (
num_curves) // (curr + n - 1) np.arange(curr + n - 1) * num_curves) // (curr + n - 1)
for index in range(num_curves): for index in range(num_curves):
curr_bezier_points = self.points[3 * index:3 * index + 4] curr_bezier_points = self.points[3 * index:3 * index + 4]
num_inter_curves = sum(index_allocation == index) num_inter_curves = sum(index_allocation == index)

View file

@ -66,9 +66,7 @@ class RearrangeEquation(Scene):
""" """
num_start_terms = len(start_terms) num_start_terms = len(start_terms)
all_mobs = np.array( all_mobs = np.array(
TexMobject(start_terms).split() + TexMobject(start_terms).split() + TexMobject(end_terms).split())
TexMobject(end_terms).split()
)
all_terms = np.array(start_terms + end_terms) all_terms = np.array(start_terms + end_terms)
for term in set(all_terms): for term in set(all_terms):
matches = all_terms == term matches = all_terms == term

View file

@ -7,10 +7,11 @@ from manimlib.utils.simple_functions import choose
DEFAULT_COUNT_NUM_OFFSET = (FRAME_X_RADIUS - 1, FRAME_Y_RADIUS - 1, 0) DEFAULT_COUNT_NUM_OFFSET = (FRAME_X_RADIUS - 1, FRAME_Y_RADIUS - 1, 0)
DEFAULT_COUNT_RUN_TIME = 5.0 DEFAULT_COUNT_RUN_TIME = 5.0
class CountingScene(Scene): class CountingScene(Scene):
def count(self, items, item_type = "mobject", *args, **kwargs): def count(self, items, item_type="mobject", *args, **kwargs):
if item_type == "mobject": if item_type == "mobject":
self.count_mobjects(items, *args, **kwargs) self.count_mobjects(items, *args, **kwargs)
elif item_type == "region": elif item_type == "region":
@ -20,18 +21,19 @@ class CountingScene(Scene):
return self return self
def count_mobjects( def count_mobjects(
self, mobjects, mode = "highlight", self, mobjects, mode="highlight",
color = "red", color="red",
display_numbers = True, display_numbers=True,
num_offset = DEFAULT_COUNT_NUM_OFFSET, num_offset=DEFAULT_COUNT_NUM_OFFSET,
run_time = DEFAULT_COUNT_RUN_TIME): run_time=DEFAULT_COUNT_RUN_TIME,
):
""" """
Note, leaves final number mobject as "number" attribute Note, leaves final number mobject as "number" attribute
mode can be "highlight", "show_creation" or "show", otherwise mode can be "highlight", "show_creation" or "show", otherwise
a warning is given and nothing is animating during the count a warning is given and nothing is animating during the count
""" """
if len(mobjects) > 50: #TODO if len(mobjects) > 50: # TODO
raise Exception("I don't know if you should be counting \ raise Exception("I don't know if you should be counting \
too many mobjects...") too many mobjects...")
if len(mobjects) == 0: if len(mobjects) == 0:
@ -52,7 +54,7 @@ class CountingScene(Scene):
self.wait(frame_time) self.wait(frame_time)
mob.set_color(original_color) mob.set_color(original_color)
if mode == "show_creation": if mode == "show_creation":
self.play(ShowCreation(mob, run_time = frame_time)) self.play(ShowCreation(mob, run_time=frame_time))
if mode == "show": if mode == "show":
self.add(mob) self.add(mob)
self.wait(frame_time) self.wait(frame_time)
@ -63,10 +65,10 @@ class CountingScene(Scene):
self.number = num_mob self.number = num_mob
return self return self
def count_regions(self, regions, def count_regions(self, regions,
mode = "one_at_a_time", mode="one_at_a_time",
num_offset = DEFAULT_COUNT_NUM_OFFSET, num_offset=DEFAULT_COUNT_NUM_OFFSET,
run_time = DEFAULT_COUNT_RUN_TIME, run_time=DEFAULT_COUNT_RUN_TIME,
**unused_kwargsn): **unused_kwargsn):
if mode not in ["one_at_a_time", "show_all"]: if mode not in ["one_at_a_time", "show_all"]:
raise Warning("Unknown mode") raise Warning("Unknown mode")
@ -84,34 +86,34 @@ class CountingScene(Scene):
self.number = num_mob self.number = num_mob
return self return self
def combinationMobject(n,k):
return Integer(choose(n,k)) def combinationMobject(n, k):
return Integer(choose(n, k))
class GeneralizedPascalsTriangle(VMobject): class GeneralizedPascalsTriangle(VMobject):
CONFIG = { CONFIG = {
"nrows" : 7, "nrows": 7,
"height" : FRAME_HEIGHT - 1, "height": FRAME_HEIGHT - 1,
"width" : 1.5*FRAME_X_RADIUS, "width": 1.5 * FRAME_X_RADIUS,
"portion_to_fill" : 0.7, "portion_to_fill": 0.7,
"submob_class" : combinationMobject, "submob_class": combinationMobject,
} }
def generate_points(self): def generate_points(self):
self.cell_height = float(self.height) / self.nrows self.cell_height = float(self.height) / self.nrows
self.cell_width = float(self.width) / self.nrows self.cell_width = float(self.width) / self.nrows
self.bottom_left = (self.cell_width * self.nrows / 2.0)*LEFT + \ self.bottom_left = (self.cell_width * self.nrows / 2.0) * LEFT + \
(self.cell_height * self.nrows / 2.0)*DOWN (self.cell_height * self.nrows / 2.0) * DOWN
num_to_num_mob = {}
self.coords_to_mobs = {} self.coords_to_mobs = {}
self.coords = [ self.coords = [
(n, k) (n, k)
for n in range(self.nrows) for n in range(self.nrows)
for k in range(n+1) for k in range(n + 1)
] ]
for n, k in self.coords: for n, k in self.coords:
num = choose(n, k)
center = self.coords_to_center(n, k) center = self.coords_to_center(n, k)
num_mob = self.submob_class(n,k) #TexMobject(str(num)) num_mob = self.submob_class(n, k) # TexMobject(str(num))
scale_factor = min( scale_factor = min(
1, 1,
self.portion_to_fill * self.cell_height / num_mob.get_height(), self.portion_to_fill * self.cell_height / num_mob.get_height(),
@ -122,20 +124,20 @@ class GeneralizedPascalsTriangle(VMobject):
self.coords_to_mobs[n] = {} self.coords_to_mobs[n] = {}
self.coords_to_mobs[n][k] = num_mob self.coords_to_mobs[n][k] = num_mob
self.add(*[ self.add(*[
self.coords_to_mobs[n][k] self.coords_to_mobs[n][k]
for n, k in self.coords for n, k in self.coords
]) ])
return self return self
def coords_to_center(self, n, k): def coords_to_center(self, n, k):
x_offset = self.cell_width * (k+self.nrows/2.0 - n/2.0) x_offset = self.cell_width * (k + self.nrows / 2.0 - n / 2.0)
y_offset = self.cell_height * (self.nrows - n) y_offset = self.cell_height * (self.nrows - n)
return self.bottom_left + x_offset*RIGHT + y_offset*UP return self.bottom_left + x_offset * RIGHT + y_offset * UP
def generate_n_choose_k_mobs(self): def generate_n_choose_k_mobs(self):
self.coords_to_n_choose_k = {} self.coords_to_n_choose_k = {}
for n, k in self.coords: for n, k in self.coords:
nck_mob = TexMobject(r"{%d \choose %d}"%(n, k)) nck_mob = TexMobject(r"{%d \choose %d}" % (n, k))
scale_factor = min( scale_factor = min(
1, 1,
self.portion_to_fill * self.cell_height / nck_mob.get_height(), self.portion_to_fill * self.cell_height / nck_mob.get_height(),
@ -162,8 +164,8 @@ class GeneralizedPascalsTriangle(VMobject):
zero = TexMobject("0") zero = TexMobject("0")
self.sea_of_zeros = [] self.sea_of_zeros = []
for n in range(self.nrows): for n in range(self.nrows):
for a in range((self.nrows - n)/2 + 1): for a in range((self.nrows - n) / 2 + 1):
for k in (n + a + 1, -a -1): for k in (n + a + 1, -a - 1):
self.coords.append((n, k)) self.coords.append((n, k))
mob = zero.copy() mob = zero.copy()
mob.shift(self.coords_to_center(n, k)) mob.shift(self.coords_to_center(n, k))
@ -175,20 +177,12 @@ class GeneralizedPascalsTriangle(VMobject):
n = self.nrows - 1 n = self.nrows - 1
lowest_row = VGroup(*[ lowest_row = VGroup(*[
self.coords_to_mobs[n][k] self.coords_to_mobs[n][k]
for k in range(n+1) for k in range(n + 1)
]) ])
return lowest_row return lowest_row
class PascalsTriangle(GeneralizedPascalsTriangle): class PascalsTriangle(GeneralizedPascalsTriangle):
CONFIG = { CONFIG = {
"submob_class" : combinationMobject, "submob_class": combinationMobject,
} }

View file

@ -296,8 +296,8 @@ class JaggedCurvePiece(VMobject):
if self.get_num_anchor_points() == 0: if self.get_num_anchor_points() == 0:
self.points = np.zeros((1, 3)) self.points = np.zeros((1, 3))
anchors = self.get_anchors() anchors = self.get_anchors()
indices = np.linspace(0, len(anchors) - 1, n + indices = np.linspace(0, len(anchors) - 1, n + len(anchors)) \
len(anchors)).astype('int') .astype('int')
self.set_points_as_corners(anchors[indices]) self.set_points_as_corners(anchors[indices])

View file

@ -13,13 +13,13 @@ from manimlib.utils.space_ops import center_of_mass
class Graph(): class Graph():
def __init__(self): def __init__(self):
# List of points in R^3 # List of points in R^3
vertices = [] # vertices = []
# List of pairs of indices of vertices # List of pairs of indices of vertices
edges = [] # edges = []
# List of tuples of indices of vertices. The last should # List of tuples of indices of vertices. The last should
# be a cycle whose interior is the entire graph, and when # be a cycle whose interior is the entire graph, and when
# regions are computed its complement will be taken. # regions are computed its complement will be taken.
region_cycles = [] # region_cycles = []
self.construct() self.construct()
@ -275,7 +275,7 @@ class DiscreteGraphScene(Scene):
]) ])
def trace_cycle(self, cycle=None, color="yellow", run_time=2.0): def trace_cycle(self, cycle=None, color="yellow", run_time=2.0):
if cycle == None: if cycle is None:
cycle = self.graph.region_cycles[0] cycle = self.graph.region_cycles[0]
time_per_edge = run_time / len(cycle) time_per_edge = run_time / len(cycle)
next_in_cycle = it.cycle(cycle) next_in_cycle = it.cycle(cycle)
@ -385,8 +385,7 @@ class DiscreteGraphScene(Scene):
Dot(point).set_color("green") Dot(point).set_color("green")
for point in self.dual_points for point in self.dual_points
] ]
self.dual_vertices[-1] = Circle().scale(FRAME_X_RADIUS + self.dual_vertices[-1] = Circle().scale(FRAME_X_RADIUS + FRAME_Y_RADIUS)
FRAME_Y_RADIUS)
self.dual_points[-1] = point_at_infinity self.dual_points[-1] = point_at_infinity
self.dual_edges = [] self.dual_edges = []

View file

@ -242,7 +242,7 @@ class Spotlight(VMobject):
projected_screen_points = list(map(self.project, screen_points)) projected_screen_points = list(map(self.project, screen_points))
viewing_angles = np.array(list(map(self.viewing_angle_of_point, viewing_angles = np.array(list(map(self.viewing_angle_of_point,
projected_screen_points))) projected_screen_points)))
lower_angle = upper_angle = 0 lower_angle = upper_angle = 0
if len(viewing_angles) != 0: if len(viewing_angles) != 0:
@ -420,7 +420,7 @@ class LightSource(VMobject):
else: else:
# Note: See below # Note: See below
index = self.submobjects.index(self.spotlight) index = self.submobjects.index(self.spotlight)
camera_mob = self.spotlight.camera_mob # camera_mob = self.spotlight.camera_mob
self.remove(self.spotlight) self.remove(self.spotlight)
self.spotlight = Spotlight( self.spotlight = Spotlight(
source_point=VectorizedPoint(location=self.get_source_point()), source_point=VectorizedPoint(location=self.get_source_point()),

View file

@ -99,7 +99,7 @@ def plane_partition(*lines, **kwargs):
def plane_partition_from_points(*points, **kwargs): def plane_partition_from_points(*points, **kwargs):
""" """
Returns list of regions cut out by the complete graph Returns list of regions cut out by the complete graph
with points from the argument as vertices. with points from the argument as vertices.
Each point comes in the form (x, y) Each point comes in the form (x, y)
""" """

View file

@ -1 +0,0 @@

View file

@ -440,7 +440,7 @@ class GraphScene(Scene):
triangle.move_to(self.coords_to_point(x_val, 0), UP) triangle.move_to(self.coords_to_point(x_val, 0), UP)
triangle.set_fill(color, 1) triangle.set_fill(color, 1)
triangle.set_stroke(width=0) triangle.set_stroke(width=0)
if label == None: if label is None:
T_label = TexMobject(self.variable_point_label, fill_color=color) T_label = TexMobject(self.variable_point_label, fill_color=color)
else: else:
T_label = TexMobject(label, fill_color=color) T_label = TexMobject(label, fill_color=color)

View file

@ -2,7 +2,6 @@ from time import sleep
import _thread as thread import _thread as thread
import datetime import datetime
import inspect import inspect
import itertools as it
import os import os
import random import random
import shutil import shutil
@ -26,6 +25,7 @@ from manimlib.utils.output_directory_getters import add_extension_if_not_present
from manimlib.utils.output_directory_getters import get_image_output_directory from manimlib.utils.output_directory_getters import get_image_output_directory
from manimlib.utils.output_directory_getters import get_movie_output_directory from manimlib.utils.output_directory_getters import get_movie_output_directory
class Scene(Container): class Scene(Container):
CONFIG = { CONFIG = {
"camera_class": Camera, "camera_class": Camera,
@ -274,8 +274,9 @@ class Scene(Container):
for list_name in "mobjects", "foreground_mobjects": for list_name in "mobjects", "foreground_mobjects":
self.restructure_mobjects(mobjects, list_name, False) self.restructure_mobjects(mobjects, list_name, False)
self.continual_animations = [ca for ca in self.continual_animations if ca not in continual_animations and self.continual_animations = [
ca.mobject not in to_remove] ca for ca in self.continual_animations if ca not in
continual_animations and ca.mobject not in to_remove]
return self return self
def restructure_mobjects( def restructure_mobjects(
@ -676,7 +677,7 @@ class Scene(Container):
anims = [] anims = []
anims.append(Write(eq)) anims.append(Write(eq))
for mobject in self.mobjects: for mobject in self.mobjects:
anims.append(ApplyMethod(mobject.shift,2*UP)) anims.append(ApplyMethod(mobject.shift, 2 * UP))
self.play(*anims) self.play(*anims)