This commit is contained in:
xiao-ming-hub 2025-01-08 11:58:07 -05:00 committed by GitHub
commit 5b988959a0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -6,7 +6,7 @@ import copy
import numpy as np import numpy as np
from manimlib.constants import DEFAULT_MOBJECT_TO_MOBJECT_BUFF, SMALL_BUFF from manimlib.constants import DEFAULT_MOBJECT_TO_MOBJECT_BUFF, SMALL_BUFF
from manimlib.constants import DOWN, LEFT, ORIGIN, RIGHT, DL, DR, UL from manimlib.constants import UP, DOWN, ORIGIN, RIGHT, UL, UR, DR
from manimlib.constants import PI from manimlib.constants import PI
from manimlib.animation.composition import AnimationGroup from manimlib.animation.composition import AnimationGroup
from manimlib.animation.fading import FadeIn from manimlib.animation.fading import FadeIn
@ -29,41 +29,46 @@ if TYPE_CHECKING:
from manimlib.typing import Vect3 from manimlib.typing import Vect3
class Brace(Tex): class Brace(Text):
def __init__( def __init__(
self, self,
mobject: Mobject, mobject: Mobject,
direction: Vect3 = DOWN, direction: Vect3 = DOWN,
buff: float = 0.2, buff: float = 0.2,
tex_string: str = R"\underbrace{\qquad}", # position of the tip
ratio: float = 0.5,
# This depends on font that you choose.
# Used to align different parts of the brace
extend_offset: float = .0085,
**kwargs **kwargs
): ):
super().__init__(tex_string, **kwargs) # \u's are different parts of the brace
super().__init__("\u23AB\n\u23AA\n\u23AC\n\u23AA\n\u23AD", **kwargs)
angle = -math.atan2(*direction[:2]) + PI angle = PI / 2 - math.atan2(*direction[:2])
mobject.rotate(-angle, about_point=ORIGIN) mobject.rotate(-angle, about_point=ORIGIN)
left = mobject.get_corner(DL) up = mobject.get_corner(UR)
right = mobject.get_corner(DR) down = mobject.get_corner(DR)
target_width = right[0] - left[0] target_height = up[1] - down[1]
self.tip_point_index = np.argmin(self.get_all_points()[:, 1]) self.extend_offset = extend_offset
self.set_initial_width(target_width) self.ratio = ratio
self.shift(left - self.get_corner(UL) + buff * DOWN) self.tip_point_index = np.argmax(self.get_all_points()[:, 0])
self.set_initial_height(target_height)
self.shift(up - self.get_corner(UL) + buff * RIGHT)
for mob in mobject, self: for mob in mobject, self:
mob.rotate(angle, about_point=ORIGIN) mob.rotate(angle, about_point=ORIGIN)
def set_initial_width(self, width: float): def set_initial_height(self, height: float):
width_diff = width - self.get_width() h0 = sum([self[i].get_height() for i in [0,2,4]])
if width_diff > 0: extend_height = max(height - h0, 0)
for tip, rect, vect in [(self[0], self[1], RIGHT), (self[5], self[4], LEFT)]: self[1].set_height(extend_height * self.ratio, True)
rect.set_width( self[3].set_height(extend_height * (1 - self.ratio), True)
width_diff / 2 + rect.get_width(), for extend in self[1::2]:
about_edge=vect, stretch=True extend.shift(RIGHT * self.extend_offset)
) self.arrange(DOWN, buff=0, coor_mask=UP)
tip.shift(-width_diff / 2 * vect) if extend_height == 0:
else: self.set_height(height, True)
self.set_width(width, stretch=True)
return self
def put_at_tip( def put_at_tip(
self, self,