mirror of
https://github.com/3b1b/manim.git
synced 2025-07-30 13:34:19 +08:00
Various add_smooth_curve_to functions
This commit is contained in:
@ -396,12 +396,12 @@ class VMobject(Mobject):
|
|||||||
else:
|
else:
|
||||||
self.append_points(quadratic_approx)
|
self.append_points(quadratic_approx)
|
||||||
|
|
||||||
def add_quadratic_bezier_curve_to(handle, anchor):
|
def add_quadratic_bezier_curve_to(self, handle, anchor):
|
||||||
self.throw_error_if_no_points()
|
self.throw_error_if_no_points()
|
||||||
if self.has_new_path_started():
|
if self.has_new_path_started():
|
||||||
self.append_points([handle, anchors])
|
self.append_points([handle, anchor])
|
||||||
else:
|
else:
|
||||||
self.append_points([self.points[-1], handle, anchors])
|
self.append_points([self.points[-1], handle, anchor])
|
||||||
|
|
||||||
def add_line_to(self, point):
|
def add_line_to(self, point):
|
||||||
nppc = self.n_points_per_curve
|
nppc = self.n_points_per_curve
|
||||||
@ -414,41 +414,29 @@ class VMobject(Mobject):
|
|||||||
self.append_points(points)
|
self.append_points(points)
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def add_smooth_curve_to(self, *points):
|
def add_smooth_curve_to(self, point):
|
||||||
"""
|
|
||||||
If two points are passed in, the first is intepretted
|
|
||||||
as a handle, the second as an anchor
|
|
||||||
"""
|
|
||||||
if len(points) == 1:
|
|
||||||
handle = None
|
|
||||||
anchor = points[0]
|
|
||||||
elif len(points) == 2:
|
|
||||||
handle, anchor = points
|
|
||||||
else:
|
|
||||||
name = sys._getframe(0).f_code.co_name
|
|
||||||
raise Exception(f"Only call {name} with 1 or 2 points")
|
|
||||||
|
|
||||||
if self.has_new_path_started():
|
if self.has_new_path_started():
|
||||||
self.add_line_to(anchor)
|
self.add_line_to(anchor)
|
||||||
else:
|
else:
|
||||||
self.throw_error_if_no_points()
|
self.throw_error_if_no_points()
|
||||||
if handle is None:
|
new_handle = self.get_reflection_of_last_handle()
|
||||||
has_h, last_a = self.points[-2:]
|
self.add_quadratic_bezier_curve_to(new_handle, point)
|
||||||
last_tangent = normalize(last_a - has_h)
|
|
||||||
from_last = (anchor - last_a)
|
|
||||||
theta = angle_between_vectors(from_last, last_tangent)
|
|
||||||
cos_theta = max(np.cos(theta), 0.1)
|
|
||||||
dist = get_norm(from_last) / cos_theta / 2
|
|
||||||
handle = last_a + dist * last_tangent
|
|
||||||
self.append_points([last_a, handle, anchor])
|
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
def add_smooth_cubic_curve_to(self, handle, point):
|
||||||
|
self.throw_error_if_no_points()
|
||||||
|
new_handle = self.get_reflection_of_last_handle()
|
||||||
|
self.add_cubic_bezier_curve_to(new_handle, handle, point)
|
||||||
|
|
||||||
def has_new_path_started(self):
|
def has_new_path_started(self):
|
||||||
return len(self.points) % self.n_points_per_curve == 1
|
return len(self.points) % self.n_points_per_curve == 1
|
||||||
|
|
||||||
def get_last_point(self):
|
def get_last_point(self):
|
||||||
return self.points[-1]
|
return self.points[-1]
|
||||||
|
|
||||||
|
def get_reflection_of_last_handle(self):
|
||||||
|
return 2 * self.points[-1] - self.points[-2]
|
||||||
|
|
||||||
def is_closed(self):
|
def is_closed(self):
|
||||||
return self.consider_points_equals(
|
return self.consider_points_equals(
|
||||||
self.points[0], self.points[-1]
|
self.points[0], self.points[-1]
|
||||||
|
Reference in New Issue
Block a user