mirror of
https://github.com/3b1b/manim.git
synced 2025-08-02 11:03:03 +08:00
Factor out partial results from point_from_proportion
This commit is contained in:
@ -791,12 +791,14 @@ class VMobject(Mobject):
|
|||||||
curve_func = self.get_nth_curve_function(n)
|
curve_func = self.get_nth_curve_function(n)
|
||||||
return curve_func(residue)
|
return curve_func(residue)
|
||||||
|
|
||||||
def point_from_proportion(self, alpha: float) -> Vect3:
|
def curve_and_prop_of_partial_point(self, alpha) -> Tuple[int, float]:
|
||||||
if alpha <= 0:
|
"""
|
||||||
return self.get_start()
|
If you want a point a proportion alpha along the curve, this
|
||||||
elif alpha >= 1:
|
gives you the index of the appropriate bezier curve, together
|
||||||
return self.get_end()
|
with the proportion along that curve you'd need to travel
|
||||||
|
"""
|
||||||
|
if alpha == 0:
|
||||||
|
return (0, 0.0)
|
||||||
partials: list[float] = [0]
|
partials: list[float] = [0]
|
||||||
for tup in self.get_bezier_tuples():
|
for tup in self.get_bezier_tuples():
|
||||||
if self.consider_points_equal(tup[0], tup[1]):
|
if self.consider_points_equal(tup[0], tup[1]):
|
||||||
@ -808,14 +810,24 @@ class VMobject(Mobject):
|
|||||||
partials.append(partials[-1] + arclen)
|
partials.append(partials[-1] + arclen)
|
||||||
full = partials[-1]
|
full = partials[-1]
|
||||||
if full == 0:
|
if full == 0:
|
||||||
return self.get_start()
|
return len(partials), 1.0
|
||||||
# First index where the partial length is more than alpha times the full length
|
# First index where the partial length is more than alpha times the full length
|
||||||
i = next(
|
index = next(
|
||||||
(i for i, x in enumerate(partials) if x >= full * alpha),
|
(i for i, x in enumerate(partials) if x >= full * alpha),
|
||||||
len(partials) # Default
|
len(partials) - 1 # Default
|
||||||
)
|
)
|
||||||
residue = float(inverse_interpolate(partials[i - 1] / full, partials[i] / full, alpha))
|
residue = float(inverse_interpolate(
|
||||||
return self.get_nth_curve_function(i - 1)(residue)
|
partials[index - 1] / full, partials[index] / full, alpha
|
||||||
|
))
|
||||||
|
return index - 1, residue
|
||||||
|
|
||||||
|
def point_from_proportion(self, alpha: float) -> Vect3:
|
||||||
|
if alpha <= 0:
|
||||||
|
return self.get_start()
|
||||||
|
elif alpha >= 1:
|
||||||
|
return self.get_end()
|
||||||
|
index, residue = self.curve_and_prop_of_partial_point(alpha)
|
||||||
|
return self.get_nth_curve_function(index)(residue)
|
||||||
|
|
||||||
def get_anchors_and_handles(self) -> list[Vect3]:
|
def get_anchors_and_handles(self) -> list[Vect3]:
|
||||||
"""
|
"""
|
||||||
|
Reference in New Issue
Block a user