概要
wslでmanimやってみた。
練習問題やってみた。
練習問題
ハノイの塔を図解せよ。
方針
- 再帰を使う。
成果物
サンプルコード
from manim import *
class test(Scene):
def hanoi(self, disk: int, src: str, dest: str, support: str):
if disk < 1:
return
self.hanoi(disk - 1, src, support, dest)
print(f'move {disk} from {src} to {dest}')
self.move(disk, src, dest)
self.hanoi(disk - 1, support, dest, src)
def move(self, disk, src, dest):
v = 0
di = self.disk1
point1 = np.array([-3, -3, 0])
point2 = np.array([-3, -3, 0])
if disk == 1:
di = self.disk1
elif disk == 2:
di = self.disk2
elif disk == 3:
di = self.disk3
if src == 'A':
point1 = np.array([-3, 1, 0])
self.a = self.a - 1
elif src == 'B':
point1 = np.array([1, 1, 0])
self.b = self.b - 1
elif src == 'C':
point1 = np.array([5, 1, 0])
self.c = self.c - 1
di.move_to(point1)
self.play(Write(di))
self.wait()
if dest == 'A':
point2 = np.array([-3, -3, 0])
di.move_to(point2 + UP * 4)
self.a = self.a + 1
v = self.a
elif dest == 'B':
point2 = np.array([1, -3, 0])
di.move_to(point2 + UP * 4)
self.b = self.b + 1
v = self.b
elif dest == 'C':
point2 = np.array([5, -3, 0])
di.move_to(point2 + UP * 4)
self.c = self.c + 1
v = self.c
self.play(Write(di))
self.wait()
di.move_to(point2 + UP * (v - 1) * 0.6)
self.play(Write(di))
self.wait()
def construct(self):
self.a = 3
self.b = 0
self.c = 0
self.disk1 = Rectangle(width = 1, height = 0.5, color = BLUE)
self.disk2 = Rectangle(width = 2, height = 0.5, color = GREEN)
self.disk3 = Rectangle(width = 3, height = 0.5, color = RED)
rod1 = Line(start = [-3, 0, 0], end = [-3, 4, 0])
rod2 = Line(start = [0, 0, 0], end = [0, 4, 0])
rod3 = Line(start = [3, 0, 0], end = [3, 4, 0])
start_pos = np.array([-3, -3, 0])
self.disk1.move_to(start_pos + UP * 1.2)
self.disk2.move_to(start_pos + UP * 0.6)
self.disk3.move_to(start_pos)
rod1.move_to(start_pos + UP * 1.6)
rod2.move_to(start_pos + RIGHT * 4 + UP * 1.6)
rod3.move_to(start_pos + RIGHT * 8 + UP * 1.6)
self.add(self.disk1, self.disk2, self.disk3, rod1, rod2, rod3)
self.hanoi(3, "A", "C", "B")
self.wait()
以上。