0
0

wslでmanim その26

Last updated at Posted at 2024-09-16

概要

wslでmanimやってみた。
練習問題やってみた。

練習問題

ハノイの塔を図解せよ。

方針

  • 再帰を使う。

成果物

test_ManimCE_v0.18.1.gif

サンプルコード



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()





以上。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0