Improved VectorSpaceScene.get_vector_label

This commit is contained in:
Grant Sanderson 2018-04-27 13:50:39 -07:00
parent 9dbf4e4b89
commit bc03093c81

View file

@ -10,6 +10,7 @@ from animation.creation import Write
from animation.transform import ApplyFunction from animation.transform import ApplyFunction
from animation.transform import ApplyPointwiseFunction from animation.transform import ApplyPointwiseFunction
from animation.creation import FadeOut from animation.creation import FadeOut
from animation.creation import GrowArrow
from animation.transform import Transform from animation.transform import Transform
from mobject.mobject import Mobject from mobject.mobject import Mobject
from mobject.svg.tex_mobject import TexMobject from mobject.svg.tex_mobject import TexMobject
@ -83,7 +84,7 @@ class VectorScene(Scene):
if not isinstance(vector, Arrow): if not isinstance(vector, Arrow):
vector = Vector(vector, color=color, **kwargs) vector = Vector(vector, color=color, **kwargs)
if animate: if animate:
self.play(ShowCreation(vector)) self.play(GrowArrow(vector))
self.add(vector) self.add(vector)
return vector return vector
@ -120,6 +121,7 @@ class VectorScene(Scene):
]) ])
def get_vector_label(self, vector, label, def get_vector_label(self, vector, label,
at_tip=False,
direction="left", direction="left",
rotate=False, rotate=False,
color=None, color=None,
@ -134,15 +136,20 @@ class VectorScene(Scene):
label.scale(label_scale_factor) label.scale(label_scale_factor)
label.add_background_rectangle() label.add_background_rectangle()
angle = vector.get_angle() if at_tip:
if not rotate: vect = vector.get_vector()
label.rotate(-angle, about_point=ORIGIN) vect /= np.linalg.norm(vect)
if direction is "left": label.next_to(vector.get_end(), vect, buff=SMALL_BUFF)
label.shift(-label.get_bottom() + 0.1 * UP)
else: else:
label.shift(-label.get_top() + 0.1 * DOWN) angle = vector.get_angle()
label.rotate(angle, about_point=ORIGIN) if not rotate:
label.shift((vector.get_end() - vector.get_start()) / 2) label.rotate(-angle, about_point=ORIGIN)
if direction is "left":
label.shift(-label.get_bottom() + 0.1 * UP)
else:
label.shift(-label.get_top() + 0.1 * DOWN)
label.rotate(angle, about_point=ORIGIN)
label.shift((vector.get_end() - vector.get_start()) / 2)
return label return label
def label_vector(self, vector, label, animate=True, **kwargs): def label_vector(self, vector, label, animate=True, **kwargs):
@ -373,12 +380,19 @@ class LinearTransformationScene(VectorScene):
self.add_foreground_mobject(coords) self.add_foreground_mobject(coords)
return coords return coords
def add_transformable_label(self, vector, label, new_label=None, **kwargs): def add_transformable_label(
self, vector, label,
transformation_name="L",
new_label=None,
**kwargs):
label_mob = self.label_vector(vector, label, **kwargs) label_mob = self.label_vector(vector, label, **kwargs)
if new_label: if new_label:
label_mob.target_text = new_label label_mob.target_text = new_label
else: else:
label_mob.target_text = "L(%s)" % label_mob.get_tex_string() label_mob.target_text = "%s(%s)" % (
transformation_name,
label_mob.get_tex_string()
)
label_mob.vector = vector label_mob.vector = vector
label_mob.kwargs = kwargs label_mob.kwargs = kwargs
if "animate" in label_mob.kwargs: if "animate" in label_mob.kwargs: