Skip to content

Instantly share code, notes, and snippets.

@uwezi
Last active May 24, 2024 08:10
Show Gist options
  • Save uwezi/c4023d892b13b5873caf6d7fc282507f to your computer and use it in GitHub Desktop.
Save uwezi/c4023d892b13b5873caf6d7fc282507f to your computer and use it in GitHub Desktop.
[arc in 3D] placing an arc/angle between lines in 3D. #manim #3D #angle #arc
from manim import *
# https://discord.com/channels/581738731934056449/1096718885606150154/1096718885606150154
class arc3d(VMobject):
def __init__(self, A=None, B=None, center=None, radius=1, segments=40, **kwargs):
super().__init__(**kwargs)
start = center + (A-center)*radius/np.linalg.norm(A-center)
end = center + (B-center)*radius/np.linalg.norm(B-center)
self.set_points([start])
for i in np.linspace(0,1,segments,endpoint=True):
dotonline = start + i*(end-start)
radline = dotonline-center
dotonarc = center + radline/np.linalg.norm(radline)*radius
self.add_smooth_curve_to(dotonarc)
class threeDarcTestCube(ThreeDScene):
def construct(self):
cs = ThreeDAxes()
self.add(cs)
corners = np.array([[0,0,0],[1,0,0],[1,1,0],[0,1,0],[0,0,1],[1,0,1],[1,1,1],[0,1,1]])*3-np.array([1,1,1])
cube = VGroup(
*[Line(corners[i],corners[(i+1)%4]) for i in range(4)],
*[Line(corners[4+i],corners[4+(i+1)%4]) for i in range(4)],
*[Line(corners[i],corners[i+4]) for i in range(4)],
*[Dot3D(corners[i]) for i in range(8)]
)
self.move_camera(phi=75 * DEGREES, theta=25 * DEGREES)
self.play(Create(cube))
line1 = Line(corners[1],corners[7]).set_color(RED)
line2 = Line(corners[3],corners[5]).set_color(BLUE)
self.play(Create(line1),Create(line2))
self.wait()
arc1 = arc3d(A=corners[1],B=corners[3],center=cube.get_center(),radius=1,segments=30).set_color(YELLOW)
arc2 = arc3d(A=corners[1],B=corners[5],center=cube.get_center(),radius=1.3,segments=30).set_color(TEAL)
self.play(Create(arc1))
self.play(Create(arc2))
self.wait()
arc3 = arc3d(A=corners[1],B=corners[3],center=corners[5],radius=1,segments=30).set_color(ORANGE)
arc4 = arc3d(A=corners[7],B=corners[3],center=corners[1],radius=0.7,segments=30).set_color(GREEN)
line4 = DashedLine(corners[1],corners[3])
self.play(Create(arc3))
self.play(Create(arc4))
self.play(Create(line4))
self.wait()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment