mirror of
https://github.com/3b1b/manim.git
synced 2025-08-05 16:49:03 +00:00
Make it sound that Polygon.round_corners leaves it with evenly distributed anchors
This commit is contained in:
parent
6e99da9def
commit
18de4c5404
1 changed files with 23 additions and 17 deletions
|
@ -404,13 +404,19 @@ class Line(TipableVMobject):
|
|||
def account_for_buff(self):
|
||||
if self.buff == 0:
|
||||
return
|
||||
#
|
||||
if self.path_arc == 0:
|
||||
length = self.get_length()
|
||||
else:
|
||||
length = self.get_arc_length()
|
||||
#
|
||||
if length < 2 * self.buff:
|
||||
return
|
||||
buff_proportion = self.buff / length
|
||||
self.pointwise_become_partial(
|
||||
self, buff_proportion, 1 - buff_proportion
|
||||
)
|
||||
return self
|
||||
|
||||
def set_start_and_end_attrs(self, start, end):
|
||||
# If either start or end are Mobjects, this
|
||||
|
@ -437,18 +443,6 @@ class Line(TipableVMobject):
|
|||
start, end = self.get_start_and_end()
|
||||
return get_norm(start - end)
|
||||
|
||||
def get_arc_length(self):
|
||||
if self.path_arc:
|
||||
points = np.array([
|
||||
self.point_from_proportion(a)
|
||||
for a in np.linspace(0, 1, 100)
|
||||
])
|
||||
diffs = points[1:] - points[:-1]
|
||||
norms = np.apply_along_axis(get_norm, 1, diffs)
|
||||
return np.sum(norms)
|
||||
else:
|
||||
return self.get_length()
|
||||
|
||||
def get_vector(self):
|
||||
return self.get_end() - self.get_start()
|
||||
|
||||
|
@ -658,28 +652,40 @@ class Polygon(VMobject):
|
|||
cut_off_length = radius * np.tan(angle / 2)
|
||||
# Determines counterclockwise vs. clockwise
|
||||
sign = np.sign(np.cross(vect1, vect2)[2])
|
||||
arcs.append(ArcBetweenPoints(
|
||||
arc = ArcBetweenPoints(
|
||||
v2 - unit_vect1 * cut_off_length,
|
||||
v2 + unit_vect2 * cut_off_length,
|
||||
angle=sign * angle
|
||||
))
|
||||
)
|
||||
arcs.append(arc)
|
||||
|
||||
self.clear_points()
|
||||
# To ensure that we loop through starting with last
|
||||
arcs = [arcs[-1], *arcs[:-1]]
|
||||
for arc1, arc2 in adjacent_pairs(arcs):
|
||||
self.append_points(arc1.points)
|
||||
self.add_line_to(arc2.get_start())
|
||||
line = Line(arc1.get_end(), arc2.get_start())
|
||||
# Make sure anchors are evenly distributed
|
||||
len_ratio = line.get_length() / arc1.get_arc_length()
|
||||
line.insert_n_curves(
|
||||
int(arc1.get_num_curves() * len_ratio)
|
||||
)
|
||||
self.append_points(line.get_points())
|
||||
return self
|
||||
|
||||
|
||||
class RegularPolygon(Polygon):
|
||||
CONFIG = {
|
||||
"start_angle": 0
|
||||
"start_angle": None,
|
||||
}
|
||||
|
||||
def __init__(self, n=6, **kwargs):
|
||||
digest_config(self, kwargs, locals())
|
||||
if self.start_angle is None:
|
||||
if n % 2 == 0:
|
||||
self.start_angle = 0
|
||||
else:
|
||||
self.start_angle = 90 * DEGREES
|
||||
start_vect = rotate_vector(RIGHT, self.start_angle)
|
||||
vertices = compass_directions(n, start_vect)
|
||||
Polygon.__init__(self, *vertices, **kwargs)
|
||||
|
|
Loading…
Add table
Reference in a new issue