Skip to content

Commit

Permalink
add change_sinewave_factor file
Browse files Browse the repository at this point in the history
  • Loading branch information
rhaos68 committed Sep 30, 2020
1 parent 1289410 commit 1a16444
Showing 1 changed file with 340 additions and 0 deletions.
340 changes: 340 additions & 0 deletions change_sinewave_factors.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,340 @@
from manimlib.imports import *

class Amplitude_Change(Scene):
def construct(self):
self.draw_axis()
self.draw_wave_changing_amp()
self.wait()

def draw_axis(self):
MIN_X, MAX_X = -6, 6
MIN_Y, MAX_Y = -3,3
#1. axis
x_start = np.array([MIN_X, 0, 0])
x_end = np.array([MAX_X, 0, 0])

y_start = np.array([-2, MIN_Y, 0])
y_end = np.array([-2, MAX_Y, 0])

x_axis = Line(x_start, x_end, color=BLUE, stroke_width=5)
y_axis = Line(y_start, y_end, color=BLUE, stroke_width=5)

self.add(x_axis, y_axis)

# 2. labels
x_labels = [
TexMobject(r"-\pi"),
TexMobject(r"-\frac {\pi} {2}"), TexMobject(r"0"),
TexMobject(r"\frac {\pi} {2}"), TexMobject(r"\pi"),
TexMobject(r"\frac {3 \pi} {2}"), TexMobject(r"2 \pi"),
TexMobject(r"\frac {5 \pi} {2}"), TexMobject(r"3 \pi} "),
TexMobject(r"\frac {7 \pi} {2}"),
]

y_labels =[
TexMobject(r"-2"),TexMobject(r"-1"),TexMobject(r"0"),
TexMobject(r"1"), TexMobject(r"2"),
]

#i: 0 1 2 3 4
#x:-4 5
for i in range(len(x_labels)):
x_labels[i].scale(0.6)
x_labels[i].next_to(np.array([i-4, 0, 0]), DOWN)
self.add(x_labels[i])
x_labels[2].shift(RIGHT*0.1) #zero label

#i: 0 1 2 ...
#y:-2 -1 0
for i in range(len(y_labels)):
if i == 2: continue
y_labels[i].scale(0.6)
y_labels[i].next_to(np.array([-2, i-2, 0]), LEFT)
self.add(y_labels[i])

#3. grid
def get_line(x1,y1,x2,y2):
return Line(np.array([x1,y1,0]), np.array([x2,y2,0]), stroke_color=BLUE_D, stroke_width=2,stroke_opacity=1)

def get_s_line(x1,y1,x2,y2): #small grid
return Line(np.array([x1, y1, 0]), np.array([x2, y2, 0]), stroke_color=BLUE_D, stroke_width=1,
stroke_opacity=0.7)

x1, y1, x2, y2 = MIN_X, MAX_Y, MAX_X, MIN_Y
v_lines = [get_line(x,y1,x,y2) for x in range(MIN_X,MAX_X+1)]
h_lines = [get_line(x1,y,x2,y) for y in range(MIN_Y,MAX_Y+1)]
self.add(*v_lines, *h_lines)

sv_lines = [get_s_line(x,y1,x,y2) for x in np.arange(MIN_X+0.5,MAX_X,1)]
sh_lines = [get_s_line(x1,y,x2,y) for y in np.arange(MIN_Y+0.5,MAX_Y+1)]
self.add(*sv_lines, *sh_lines)

self.MIN_X, self.MAX_X = MIN_X, MAX_X
self.MIN_Y, self.MAX_Y = MIN_Y, MAX_Y

def draw_wave_changing_amp(self):
def get_wave(amp):
return FunctionGraph(
lambda t: amp * np.sin(t * PI / 2),
x_min=self.MIN_X,
x_max=self.MAX_X,
)

wave = get_wave(1)

text = TextMobject("Amplitude: ", color=YELLOW)
text.next_to(np.array([self.MIN_X, self.MAX_Y,0]), UP, aligned_edge=LEFT)

num = DecimalNumber(1.0, num_decimal_places=2)
num.next_to(text, RIGHT)

self.add(wave, text, num)

# ani
vt = ValueTracker(10)

def update_wave(mob):
new_wave = get_wave(vt.get_value() / 10.0)
mob.become(new_wave)

def update_num(mob):
num.set_value(vt.get_value() / 10.0)

wave.add_updater(update_wave)
num.add_updater(update_num)

self.play(vt.set_value, 25, rate_func=linear, run_time=5)
self.play(vt.set_value, 5, rate_func=linear, run_time=5)
self.play(vt.set_value, 10, rate_func=linear, run_time=3)


class Phase_Change(Scene):
def construct(self):
self.draw_axis()
self.draw_wave_changing_phase()
self.wait()

def draw_axis(self):
MIN_X, MAX_X = -6, 6
MIN_Y, MAX_Y = -3, 3
# 1. axis
x_start = np.array([MIN_X, 0, 0])
x_end = np.array([MAX_X, 0, 0])

y_start = np.array([-2, MIN_Y, 0])
y_end = np.array([-2, MAX_Y, 0])

x_axis = Line(x_start, x_end, color=BLUE, stroke_width=5)
y_axis = Line(y_start, y_end, color=BLUE, stroke_width=5)

self.add(x_axis, y_axis)

# 2. labels
x_labels = [
TexMobject(r"-\pi"),
TexMobject(r"-\frac {\pi} {2}"), TexMobject(r"0"),
TexMobject(r"\frac {\pi} {2}"), TexMobject(r"\pi"),
TexMobject(r"\frac {3 \pi} {2}"), TexMobject(r"2 \pi"),
TexMobject(r"\frac {5 \pi} {2}"), TexMobject(r"3 \pi} "),
TexMobject(r"\frac {7 \pi} {2}"),
]

y_labels = [
TexMobject(r"-2"), TexMobject(r"-1"), TexMobject(r"0"),
TexMobject(r"1"), TexMobject(r"2"),
]

# i: 0 1 2 3 4
# x:-4 5
for i in range(len(x_labels)):
x_labels[i].scale(0.6)
x_labels[i].next_to(np.array([i - 4, 0, 0]), DOWN)
self.add(x_labels[i])
x_labels[2].shift(RIGHT * 0.1) # zero label

# i: 0 1 2 ...
# y:-2 -1 0
for i in range(len(y_labels)):
if i == 2: continue
y_labels[i].scale(0.6)
y_labels[i].next_to(np.array([-2, i - 2, 0]), LEFT)
self.add(y_labels[i])

# 3. grid
def get_line(x1, y1, x2, y2):
return Line(np.array([x1, y1, 0]), np.array([x2, y2, 0]), stroke_color=BLUE_D, stroke_width=2,
stroke_opacity=1)

def get_s_line(x1, y1, x2, y2): # small grid
return Line(np.array([x1, y1, 0]), np.array([x2, y2, 0]), stroke_color=BLUE_D, stroke_width=1,
stroke_opacity=0.7)

x1, y1, x2, y2 = MIN_X, MAX_Y, MAX_X, MIN_Y
v_lines = [get_line(x, y1, x, y2) for x in range(MIN_X, MAX_X + 1)]
h_lines = [get_line(x1, y, x2, y) for y in range(MIN_Y, MAX_Y + 1)]
self.add(*v_lines, *h_lines)

sv_lines = [get_s_line(x, y1, x, y2) for x in np.arange(MIN_X + 0.5, MAX_X, 1)]
sh_lines = [get_s_line(x1, y, x2, y) for y in np.arange(MIN_Y + 0.5, MAX_Y + 1)]
self.add(*sv_lines, *sh_lines)

self.MIN_X, self.MAX_X = MIN_X, MAX_X
self.MIN_Y, self.MAX_Y = MIN_Y, MAX_Y
self.ORIGIN = np.array([-2,0,0])

def draw_wave_changing_phase(self):
def get_wave(phase): # unit: degree
return FunctionGraph(
lambda t: np.sin(t * PI / 2 - phase * PI / 180),
x_min=self.MIN_X,
x_max=self.MAX_X,
)

wave = get_wave(0) # 0도

text = TextMobject("Phase: ", color=YELLOW)
text.next_to(np.array([self.MIN_X, self.MAX_Y, 0]), UP, aligned_edge=LEFT)

num = DecimalNumber(1, num_decimal_places=0)
num.next_to(text, RIGHT)

dot = Dot(color=RED)
dot.move_to(self.ORIGIN)

self.add(wave, dot, text, num)

# ani
vt = ValueTracker(0)

def update_wave(mob):
new_wave = get_wave(vt.get_value() )
mob.become(new_wave)

def update_num(mob):
num.set_value(vt.get_value())

# phase: 0 1 2 ... 90...180
# dot : 0 1 2
# x : -2 -1 0
def update_dot(mob):
val = vt.get_value()
dot.move_to(np.array([val/90.0 - 2,0,0]))

wave.add_updater(update_wave)
num.add_updater(update_num)
dot.add_updater(update_dot)

self.play(vt.set_value, 180, rate_func=there_and_back, run_time=10)
self.wait()
self.play(vt.set_value, -180, rate_func=there_and_back, run_time=10)
self.wait()


class Frequency_Change(Scene):
def construct(self):
self.draw_axis()
self.draw_wave_changing_freq()
self.wait()

def draw_axis(self):
MIN_X, MAX_X = -6, 6
MIN_Y, MAX_Y = -3,3
#1. axis
x_start = np.array([MIN_X, 0, 0])
x_end = np.array([MAX_X, 0, 0])

y_start = np.array([-2, MIN_Y, 0])
y_end = np.array([-2, MAX_Y, 0])

x_axis = Line(x_start, x_end, color=BLUE, stroke_width=5)
y_axis = Line(y_start, y_end, color=BLUE, stroke_width=5)

self.add(x_axis, y_axis)

# 2. labels
x_labels = [
TexMobject(r"-\pi"),
TexMobject(r"-\frac {\pi} {2}"), TexMobject(r"0"),
TexMobject(r"\frac {\pi} {2}"), TexMobject(r"\pi"),
TexMobject(r"\frac {3 \pi} {2}"), TexMobject(r"2 \pi"),
TexMobject(r"\frac {5 \pi} {2}"), TexMobject(r"3 \pi} "),
TexMobject(r"\frac {7 \pi} {2}"),
]

y_labels =[
TexMobject(r"-2"),TexMobject(r"-1"),TexMobject(r"0"),
TexMobject(r"1"), TexMobject(r"2"),
]

#i: 0 1 2 3 4
#x:-4 5
for i in range(len(x_labels)):
x_labels[i].scale(0.6)
x_labels[i].next_to(np.array([i-4, 0, 0]), DOWN)
self.add(x_labels[i])
x_labels[2].shift(RIGHT*0.1) #zero label

#i: 0 1 2 ...
#y:-2 -1 0
for i in range(len(y_labels)):
if i == 2: continue
y_labels[i].scale(0.6)
y_labels[i].next_to(np.array([-2, i-2, 0]), LEFT)
self.add(y_labels[i])

#3. grid
def get_line(x1,y1,x2,y2):
return Line(np.array([x1,y1,0]), np.array([x2,y2,0]), stroke_color=BLUE_D, stroke_width=2,stroke_opacity=1)

def get_s_line(x1,y1,x2,y2): #small grid
return Line(np.array([x1, y1, 0]), np.array([x2, y2, 0]), stroke_color=BLUE_D, stroke_width=1,
stroke_opacity=0.7)

x1, y1, x2, y2 = MIN_X, MAX_Y, MAX_X, MIN_Y
v_lines = [get_line(x,y1,x,y2) for x in range(MIN_X,MAX_X+1)]
h_lines = [get_line(x1,y,x2,y) for y in range(MIN_Y,MAX_Y+1)]
self.add(*v_lines, *h_lines)

sv_lines = [get_s_line(x,y1,x,y2) for x in np.arange(MIN_X+0.5,MAX_X,1)]
sh_lines = [get_s_line(x1,y,x2,y) for y in np.arange(MIN_Y+0.5,MAX_Y+1)]
self.add(*sv_lines, *sh_lines)

self.MIN_X, self.MAX_X = MIN_X, MAX_X
self.MIN_Y, self.MAX_Y = MIN_Y, MAX_Y

def draw_wave_changing_freq(self):
def get_wave(freq):
return FunctionGraph(
lambda t: np.sin(freq * t * PI / 2),
x_min=self.MIN_X,
x_max=self.MAX_X,
)

wave = get_wave(1)

text = TextMobject("Frequency: ", color=YELLOW)
text.next_to(np.array([self.MIN_X, self.MAX_Y,0]), UP, aligned_edge=LEFT)

num = DecimalNumber(1, num_decimal_places=0)
num.next_to(text, RIGHT)

self.add(wave, text, num)

# ani
vt = ValueTracker(1)

def update_wave(mob):
new_wave = get_wave(vt.get_value() )
mob.become(new_wave)

def update_num(mob):
num.set_value(vt.get_value() )

wave.add_updater(update_wave)
num.add_updater(update_num)

self.play(vt.set_value, 20, rate_func=there_and_back, run_time=10)
self.wait()



0 comments on commit 1a16444

Please sign in to comment.