Allow bound graphs to track discontinuities

This commit is contained in:
Grant Sanderson 2022-11-18 09:08:30 -08:00
parent d8e4c1d698
commit 004b7427f5

View file

@ -4,8 +4,9 @@ from abc import ABC, abstractmethod
import numbers import numbers
import numpy as np import numpy as np
import itertools as it
from manimlib.constants import BLACK, BLUE, BLUE_D, GREEN, GREY_A, WHITE, RED from manimlib.constants import BLACK, BLUE, BLUE_D, BLUE_E, GREEN, GREY_A, WHITE, RED
from manimlib.constants import DEGREES, PI from manimlib.constants import DEGREES, PI
from manimlib.constants import DL, UL, DOWN, DR, LEFT, ORIGIN, OUT, RIGHT, UP from manimlib.constants import DL, UL, DOWN, DR, LEFT, ORIGIN, OUT, RIGHT, UP
from manimlib.constants import FRAME_HEIGHT, FRAME_WIDTH from manimlib.constants import FRAME_HEIGHT, FRAME_WIDTH
@ -18,14 +19,16 @@ from manimlib.mobject.geometry import Line
from manimlib.mobject.geometry import Rectangle from manimlib.mobject.geometry import Rectangle
from manimlib.mobject.number_line import NumberLine from manimlib.mobject.number_line import NumberLine
from manimlib.mobject.svg.tex_mobject import Tex from manimlib.mobject.svg.tex_mobject import Tex
from manimlib.mobject.types.vectorized_mobject import VGroup
from manimlib.mobject.types.dot_cloud import DotCloud from manimlib.mobject.types.dot_cloud import DotCloud
from manimlib.mobject.types.surface import ParametricSurface
from manimlib.mobject.types.vectorized_mobject import VGroup
from manimlib.utils.config_ops import digest_config from manimlib.utils.config_ops import digest_config
from manimlib.utils.config_ops import merge_dicts_recursively from manimlib.utils.config_ops import merge_dicts_recursively
from manimlib.utils.simple_functions import binary_search from manimlib.utils.simple_functions import binary_search
from manimlib.utils.space_ops import angle_of_vector from manimlib.utils.space_ops import angle_of_vector
from manimlib.utils.space_ops import get_norm from manimlib.utils.space_ops import get_norm
from manimlib.utils.space_ops import rotate_vector from manimlib.utils.space_ops import rotate_vector
from manimlib.utils.space_ops import normalize
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
@ -234,16 +237,27 @@ class CoordinateSystem(ABC):
""" """
return self.input_to_graph_point(x, graph) return self.input_to_graph_point(x, graph)
def bind_graph_to_func(self, graph, func, jagged=False): def bind_graph_to_func(self, graph, func, jagged=False, get_discontinuities=None):
""" """
Use for graphing functions which might change over time, or change with Use for graphing functions which might change over time, or change with
conditions conditions
""" """
graph.x_values = [self.x_axis.p2n(p) for p in graph.get_points()] x_values = [self.x_axis.p2n(p) for p in graph.get_points()]
graph.add_updater(lambda g: g.set_points([self.c2p(x, func(x)) for x in g.x_values]))
if jagged: def get_x_values():
graph.add_updater(lambda g: g.make_jagged()) if get_discontinuities:
else: ds = get_discontinuities()
ep = 1e-6
added_xs = it.chain(*((d - ep, d + ep) for d in ds))
return sorted([*x_values, *added_xs])[:len(x_values)]
else:
return x_values
graph.add_updater(lambda g: g.set_points_as_corners([
self.c2p(x, func(x))
for x in get_x_values()
]))
if not jagged:
graph.add_updater(lambda g: g.make_approximately_smooth()) graph.add_updater(lambda g: g.make_approximately_smooth())
return graph return graph