0
0

wslでmanim その9

Posted at

概要

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

練習問題

sin,cosをわかりやすく、説明せよ。

成果物

SineCosine_Curve_ManimCE_v0.18.1.gif

サンプルコード

from manim import *

class SineCosine_Curve(Scene):
	def construct(self):
		self.show_axis()
		self.show_circle()
		self.move_dot_and_draw_curve()
		self.wait()
	def show_axis(self):
		x_start = np.array([-6, 2, 0])
		x_end = np.array([3, 2, 0])
		y_start = np.array([-4, -3, 0])
		y_end = np.array([-4, 3.5, 0])
		x_axis = Line(x_start, x_end)
		y_axis = Line(y_start, y_end)
		self.add(x_axis, y_axis)
		self.add_xy_labels()
		self.orgin_point = np.array([-4, 2, 0])
		self.curve_start = np.array([-3, 2, 0])
	def add_xy_labels(self):
		x_labels = [Text("\pi"), Text("2 \pi"), Text("3 \pi"), Text("4 \pi"),]
		y_labels = [Text("\pi"), Text("2 \pi"), Text("3 \pi"), Text("4 \pi"),]
		for i in range(len(x_labels)):
			x_labels[i].scale(0.6)
			x_labels[i].next_to(np.array([-2 + i, 2, 0]), DOWN)
			self.add(x_labels[i])
		for i in range(len(y_labels)):
			y_labels[i].scale(0.6)
			y_labels[i].rotate(-PI/2)
			y_labels[i].next_to(np.array([-4, 1 - i, 0]), LEFT)
			self.add(y_labels[i])
	def show_circle(self):
		circle = Circle(radius = 1)
		circle.move_to(self.orgin_point)
		self.add(circle)
		self.circle = circle
	def move_dot_and_draw_curve(self):
		orbit = self.circle
		orgin_point = self.orgin_point
		dot = Dot(radius = 0.08, color = YELLOW)
		dot.move_to(orbit.point_from_proportion(0))
		self.t_offset = 0
		rate = 0.25
		def go_around_circle(mob, dt):
			self.t_offset += (dt * rate)
			mob.move_to(orbit.point_from_proportion(self.t_offset % 1))
		def get_line_to_circle():
			return Line(orgin_point, dot.get_center(), color=BLUE)
		def get_line_to_sine():
			x = self.curve_start[0] + self.t_offset * 2
			y = dot.get_center()[1]
			return Line(dot.get_center(), np.array([x, y, 0]), color = YELLOW_A, stroke_width = 2)
		self.sine_curve = VGroup()
		self.sine_curve.add(Line(self.curve_start,self.curve_start))
		def get_sine_curve():
			last_line = self.sine_curve[-1]
			x = self.curve_start[0] + self.t_offset * 2
			y = dot.get_center()[1]
			new_line = Line(last_line.get_end(),np.array([x, y, 0]), color = YELLOW_D)
			self.sine_curve.add(new_line)
			return self.sine_curve
		def get_line_to_cosine():
			x = dot.get_center()[0]
			y = self.curve_start[1] - self.t_offset * 2
			return Line(dot.get_center(), np.array([x, y, 0]), color = YELLOW_A, stroke_width = 2)
		self.cosine_curve = VGroup()
		self.cosine_curve.add(Line(self.curve_start, self.curve_start))
		def get_cosine_curve():
			last_line = self.cosine_curve[-1]
			x = dot.get_center()[0]
			y = self.curve_start[1] - self.t_offset * 2
			new_line = Line(last_line.get_end(), np.array([x, y, 0]), color = YELLOW_D)
			self.cosine_curve.add(new_line)
			return self.cosine_curve
		dot.add_updater(go_around_circle)
		origin_to_circle_line = always_redraw(get_line_to_circle)
		dot_to_sine_line = always_redraw(get_line_to_sine)
		sine_curve_line = always_redraw(get_sine_curve)
		dot_to_cosine_line = always_redraw(get_line_to_cosine)
		cosine_curve_line = always_redraw(get_cosine_curve)
		self.add(dot, orbit)
		self.add(origin_to_circle_line, dot_to_sine_line, sine_curve_line, dot_to_cosine_line, cosine_curve_line, )
		self.wait(8.5)
		dot.remove_updater(go_around_circle)





以上。

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