ManimCommunity / ManimCommunity/manim

Add_tip shifts the line

Open
#4,444 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
40.9k
Forks
3.1k
Avg merge
3d 12h
Merged PRs (30d)
25

Description

## Description of bug / unexpected behavior

I wanted to use a tikz-equivalent of `-|` in manim to simply write the equivalent of the tikz code:
```
\draw[rounded corners,-Stealth] (0,0) -| (1,-1);
```
to obtain something like

Image

but it turned out that the equivalent manim code is a huge mess:

```
import manim.mobject.geometry.tips as tips
class ellbowarrow(Scene):
def construct(self):
def add_tip(
line,
shorten=True,
tip_shape: type[tips.ArrowTip] | None = None,
tip_length: float | None = None,
tip_width: float | None = None,
):
tip = line.get_unpositioned_tip(
tip_length=tip_length,
tip_shape = tip_shape,
tip_width = tip_width,
)
tipangle = Line(tip.base, tip.tip_point).get_angle()
angle = Line(line.point_from_proportion(0.999),line.point_from_proportion(1.0)).get_angle()
tip.rotate(angle-tipangle,about_point=tip.base)
tip.shift(line.get_end()-tip.tip_point)
if shorten==True:
points = line.get_all_points()
points[-1]=tip.base
line.set_points(points)
line.add(tip)
return line
Line.add_tip = add_tip

grid = NumberPlane().add_coordinates()
self.add(grid)

p1 = Dot([-4,2,0],color=RED)
p2 = Dot([4,-1,0],color=BLUE)

c1 = Dot(p1.get_center()*UP+p2.get_center()*RIGHT-0.5*RIGHT, color=YELLOW)
c2 = Dot(p2.get_center()*RIGHT+p1.get_center()*UP-0.5*UP, color=TEAL)
self.add(p1,p2,c1,c2)
line1 = Line().set_points_as_corners(
[p1.get_center(), p1.get_center()*UP+p2.get_center()*RIGHT-0.5*RIGHT]
)
line1.add_cubic_bezier_curve(
p1.get_center()*UP+p2.get_center()*RIGHT-0.5*RIGHT,
p2.get_center()*RIGHT+p1.get_center()*UP,
p2.get_center()*RIGHT+p1.get_center()*UP,
p2.get_center()*RIGHT+p1.get_center()*UP-.5*UP
)
line1.add_line_to(p2.get_center())
line1.add_tip(shorten=False, tip_length=0.5)

self.play(Create(line1))
self.wait()
```

(thanks uwezi for the help)

One issue is the lack of `rounded corners` (see https://github.com/ManimCommunity/manim/issues/4443), but the other issue is that `Line.add_tip` is broken as discussed in https://discord.com/channels/581738731934056449/1370706466541011055/1370728872416514141:

Indeed, the naive code:
```
from manim import *

class Terminology(Scene):
def construct(self):
# Grid
grid = NumberPlane()
grid.add_coordinates()
self.add(grid)

plainText = Text("Plaintext", font_size=30, color=YELLOW)
plainText.to_edge(LEFT, buff=0.8)
plainTextRect = SurroundingRectangle(plainText, color=YELLOW, buff=0.3)

self.play(Write(plainText))
self.play(Write(plainTextRect))

encryptionAlgorithm = Text("Encryption\nAlgorithm", font_size=30, color=BLUE)
encryptionAlgorithm.move_to(UP*2)
encryptionAlgorithmRect = SurroundingRectangle(encryptionAlgorithm, color=BLUE)
self.play(Write(encryptionAlgorithm))
self.play(Write(encryptionAlgorithmRect))

line1 = Line()
line1.set_points_as_corners([
plainTextRect.get_top(),
[plainTextRect.get_center()[0], 2, 0],
encryptionAlgorithmRect.get_left()
]).add_tip(tip_length=0.15)

self.play(Write(line1))

cipher = Text("Cipher", font_size=30, color=RED)
cipher.to_edge(RIGHT, buff=0.8)
cipherRect = SurroundingRectangle(cipher, color=RED, buff=0.3)

line2 = Line()
line2.set_points_as_corners([
encryptionAlgorithmRect.get_right(),
[cipherRect.get_center()[0], 2, 0],
cipherRect.get_top()
]).add_tip(tip_length=0.15)

self.play(Write(line2))

self.play(Write(cipher))
self.play(Write(cipherRect))

self.wait()
```
produces

Image

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the multi-segment Line example and inspect manim.mobject.geometry.tips together with Line.add_tip, focusing on how the tip is positioned and how the line points are shortened. The fix is complete when adding a tip does not shift the line unexpectedly and the arrowhead remains aligned with the final segment in the demonstrated cases.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
computer-graphics
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.