From 99cb5a019f6e22af70c70ef74ff3ddd8057a2ab9 Mon Sep 17 00:00:00 2001 From: Nikhil Iyer Date: Wed, 29 May 2024 00:19:18 -0400 Subject: [PATCH 1/5] Make `Line::set_points_by_ends` behavior consistent with constructor --- manim/mobject/geometry/line.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/manim/mobject/geometry/line.py b/manim/mobject/geometry/line.py index 2989dcb44a..3a078b1492 100644 --- a/manim/mobject/geometry/line.py +++ b/manim/mobject/geometry/line.py @@ -41,8 +41,8 @@ class Line(TipableVMobject): def __init__( self, - start: Point3D = LEFT, - end: Point3D = RIGHT, + start: Point3D | Mobject = LEFT, + end: Point3D | Mobject = RIGHT, buff: float = 0, path_arc: float | None = None, **kwargs, @@ -63,16 +63,32 @@ def generate_points(self) -> None: def set_points_by_ends( self, - start: Point3D, - end: Point3D, + start: Point3D | Mobject, + end: Point3D | Mobject, buff: float = 0, path_arc: float = 0, ) -> None: + """Sets the points of the line based on its start and end points. + Unlike :meth:`put_start_and_end_on`, this method respects `self.buff` and + Mobject bounding boxes. + + Parameters + ---------- + start : Point3D | Mobject + The start point or Mobject of the line. + end : Point3D | Mobject + The end point or Mobject of the line. + buff : float, optional + The empty space between start and end and the line, by default 0 + path_arc : float, optional + The angle of a circle spanned by this arc, by default 0 which is a straight line. + """ + self._set_start_and_end_attrs(start, end) if path_arc: arc = ArcBetweenPoints(self.start, self.end, angle=self.path_arc) self.set_points(arc.points) else: - self.set_points_as_corners([start, end]) + self.set_points_as_corners([self.start, self.end]) self._account_for_buff(buff) @@ -93,7 +109,7 @@ def _account_for_buff(self, buff: float) -> Self: self.pointwise_become_partial(self, buff_proportion, 1 - buff_proportion) return self - def _set_start_and_end_attrs(self, start: Point3D, end: Point3D) -> None: + def _set_start_and_end_attrs(self, start: Point3D | Mobject, end: Point3D | Mobject) -> None: # If either start or end are Mobjects, this # gives their centers rough_start = self._pointify(start) From d5d9b575ddb04d92113b885d1c443fafbd707417 Mon Sep 17 00:00:00 2001 From: Nikhil Iyer Date: Wed, 29 May 2024 00:20:31 -0400 Subject: [PATCH 2/5] Use `Line::set_points_by_ends` in edge updaters --- manim/mobject/graph.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/manim/mobject/graph.py b/manim/mobject/graph.py index 53d7ed464a..424f49f380 100644 --- a/manim/mobject/graph.py +++ b/manim/mobject/graph.py @@ -1558,7 +1558,12 @@ def _populate_edge_dict( def update_edges(self, graph): for (u, v), edge in graph.edges.items(): # Undirected graph has a Line edge - edge.put_start_and_end_on(graph[u].get_center(), graph[v].get_center()) + edge.set_points_by_ends( + graph[u], + graph[v], + buff=self._edge_config.get("buff", 0), + path_arc=self._edge_config.get("path_arc", 0) + ) def __repr__(self: Graph) -> str: return f"Undirected graph on {len(self.vertices)} vertices and {len(self.edges)} edges" @@ -1767,10 +1772,13 @@ def update_edges(self, graph): deformed. """ for (u, v), edge in graph.edges.items(): - edge_type = type(edge) tip = edge.pop_tips()[0] - new_edge = edge_type(self[u], self[v], **self._edge_config[(u, v)]) - edge.become(new_edge) + edge.set_points_by_ends( + graph[u], + graph[v], + buff=self._edge_config.get("buff", 0), + path_arc=self._edge_config.get("path_arc", 0) + ) edge.add_tip(tip) def __repr__(self: DiGraph) -> str: From fd521198921627f05a5bb224e413c1511e48790c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 29 May 2024 04:29:16 +0000 Subject: [PATCH 3/5] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/mobject/geometry/line.py | 4 +++- manim/mobject/graph.py | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/manim/mobject/geometry/line.py b/manim/mobject/geometry/line.py index 3a078b1492..404edb4019 100644 --- a/manim/mobject/geometry/line.py +++ b/manim/mobject/geometry/line.py @@ -109,7 +109,9 @@ def _account_for_buff(self, buff: float) -> Self: self.pointwise_become_partial(self, buff_proportion, 1 - buff_proportion) return self - def _set_start_and_end_attrs(self, start: Point3D | Mobject, end: Point3D | Mobject) -> None: + def _set_start_and_end_attrs( + self, start: Point3D | Mobject, end: Point3D | Mobject + ) -> None: # If either start or end are Mobjects, this # gives their centers rough_start = self._pointify(start) diff --git a/manim/mobject/graph.py b/manim/mobject/graph.py index 424f49f380..d11e624032 100644 --- a/manim/mobject/graph.py +++ b/manim/mobject/graph.py @@ -1562,7 +1562,7 @@ def update_edges(self, graph): graph[u], graph[v], buff=self._edge_config.get("buff", 0), - path_arc=self._edge_config.get("path_arc", 0) + path_arc=self._edge_config.get("path_arc", 0), ) def __repr__(self: Graph) -> str: @@ -1777,7 +1777,7 @@ def update_edges(self, graph): graph[u], graph[v], buff=self._edge_config.get("buff", 0), - path_arc=self._edge_config.get("path_arc", 0) + path_arc=self._edge_config.get("path_arc", 0), ) edge.add_tip(tip) From 39bc97174621a54058e49e69d78b5ae0aad9360c Mon Sep 17 00:00:00 2001 From: Nikhil Iyer Date: Wed, 29 May 2024 00:54:24 -0400 Subject: [PATCH 4/5] Undo unnecessary change to Graph --- manim/mobject/graph.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/manim/mobject/graph.py b/manim/mobject/graph.py index d11e624032..42efa0f315 100644 --- a/manim/mobject/graph.py +++ b/manim/mobject/graph.py @@ -560,6 +560,7 @@ class GenericGraph(VMobject, metaclass=ConvertToOpenGL): all other configuration options for a vertex. edge_type The mobject class used for displaying edges in the scene. + Must be a subclass of :class:`~.Line` for default updaters to work. edge_config Either a dictionary containing keyword arguments to be passed to the class specified via ``edge_type``, or a dictionary whose @@ -1559,8 +1560,8 @@ def update_edges(self, graph): for (u, v), edge in graph.edges.items(): # Undirected graph has a Line edge edge.set_points_by_ends( - graph[u], - graph[v], + graph[u].get_center(), + graph[v].get_center(), buff=self._edge_config.get("buff", 0), path_arc=self._edge_config.get("path_arc", 0), ) @@ -1773,6 +1774,8 @@ def update_edges(self, graph): """ for (u, v), edge in graph.edges.items(): tip = edge.pop_tips()[0] + # Passing the Mobject instead of the vertex makes the tip + # stop on the bounding box of the vertex. edge.set_points_by_ends( graph[u], graph[v], From 431e8298214a202dc4f8c11aa0ff4839c7214dae Mon Sep 17 00:00:00 2001 From: Nikhil Iyer Date: Fri, 21 Jun 2024 21:12:47 -0400 Subject: [PATCH 5/5] Update manim/mobject/geometry/line.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Francisco ManrĂ­quez Novoa <49853152+chopan050@users.noreply.github.com> --- manim/mobject/geometry/line.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/manim/mobject/geometry/line.py b/manim/mobject/geometry/line.py index 404edb4019..50d63c1190 100644 --- a/manim/mobject/geometry/line.py +++ b/manim/mobject/geometry/line.py @@ -74,13 +74,13 @@ def set_points_by_ends( Parameters ---------- - start : Point3D | Mobject + start The start point or Mobject of the line. - end : Point3D | Mobject + end The end point or Mobject of the line. - buff : float, optional - The empty space between start and end and the line, by default 0 - path_arc : float, optional + buff + The empty space between the start and end of the line, by default 0. + path_arc The angle of a circle spanned by this arc, by default 0 which is a straight line. """ self._set_start_and_end_attrs(start, end)