ต่อจาก
บทที่ ๑๐
บทนี้จะเป็นเรื่องของการใช้ฟังก์ชันต่างๆเพื่อทำการแปลงรูปร่างของวัตถุอย่างอิสระตามที่ต้องการ
เมธอด .apply_function()
เมธอด .apply_function ใช้ปรับตำแหน่งจุดโดยคำนวณจากตำแหน่งเดิม
การใช้นั้นให้สร้างฟังก์ชันซึ่งจะรับค่าอาเรย์ที่มีตัวเลข ๓ ค่า คือพิกัดแกน xyz และให้คืนค่าเป็น 3 ตัว แต่ในที่นี้พิจารณาสองมิติจึงใช้แค่ x กับ y ส่วน z จะใส่ค่าอะไรลงไปก็ได้
เมื่อใช้กับ .animate เป็น .animate.apply_function ก็จะเป็นการทำภาพเคลื่อนไหว
ตัวอย่างการใช้งาน
import manimlib as mnm
import math
def func(p):
return p[0],2/(2+p[1])-2,p[2]
class Manimala(mnm.Scene):
def construct(self):
text = mnm.Text('แมงมุมแล้วไง\n\nข้องใจเหรอคะ?',color='#d0adff',size=2)
self.play(
text.animate.apply_function(func),
run_time=1
)
ต่อไปขอลองยกตัวอย่างอื่นๆโดยเปลี่ยนฟังก์ชันเป็นแบบอื่นๆไปเรื่อยๆแล้วลองรันโค้ดเดิมใหม่เพื่อดูเป็นตัวอย่างให้เห็นภาพการใช้งานเพิ่มเติม
def func(p):
return p[0],0.1*p[1]*p[0]**2,p[2]
def func(p):
return p[0],p[1]/(1+p[0]**2),p[2]
def func(p):
return p[0]*1.5,p[1]+0.25*p[0]**2-2,p[2]
def func(p):
return p[1]*2,p[0]*0.5,p[2]
def func(p):
return p[0],p[1]*1.2**p[0],p[2]
def func(p):
s = math.sin((p[0]+p[1])*5)*0.06
return p[0]+s,p[1]+s,p[2]
def func(p):
r = 2.5-p[1]/2
theta = (p[0]*0.2-0.5)*math.pi
x = r*math.cos(theta)*1.8
y = r*math.sin(theta)
return x,y,p[2]
ApplyPointwiseFunction
การทำภาพเคลื่อนไหวด้วย animate.apply_function() นั้นอาจสามารถเขียนแทนด้วยคลาส ApplyPointwiseFunction ได้ ซึ่งจะให้ผลเหมือนกัน แค่เปลี่ยนวิธีการเขียน
ตัวอย่างการเขียนโดยใช้ ApplyPointwiseFunction แทน
import manimlib as mnm
import math
def func(p):
s = math.sin(p[0]*2)
return p[0]+s*0.3,p[1]*(s+1.8),p[2]
class Manimala(mnm.Scene):
def construct(self):
text = mnm.Text('มานีกับมาลี',color='#adffd0',size=4)
self.play(
mnm.ApplyPointwiseFunction(func,text),
run_time=1
)
เมธอด .apply_complex_function()
อีกวิธีหนึ่งที่ใช้ในการปรับตำแหน่งจุดก็คือ .apply_complex_function ซึ่งจะคล้ายกับ .apply_function แต่ข้อแตกต่างคือวิธีนี้จะพิจารณาค่าแกน x และ y เป็นระนาบเชิงซ้อน โดย x เป็นจำนวนจริง y เป็นจำนวนจินตภาพ
ฟังก์ชันที่จะใช้ใน .apply_complex_function จะรับค่าจำนวนเชิงซ้อน และทำการคำนวณบางอย่างเพื่อคืนค่าจำนวนเชิงซ้อนตัวใหม่ออกมา
สำหรับการคำนวณจำนวนเชิงซ้อนนั้นอาจใช้มอดูล cmath ช่วย หรืออาจใช้ numpy ก็ได้เหมือนกัน (เกี่ยวกับ cmath และเรื่องของจำนวนเชิงซ้อนอ่านได้ใน
https://phyblas.hinaboshi.com/20160608)
ตัวอย่างการใช้
import manimlib as mnm
import cmath
def cf(p):
return cmath.sinh((p-1j)*0.5)+2j
class Manimala(mnm.Scene):
def construct(self):
text = mnm.Text('ระนาบเชิงซ้อน\n\nแล้วไง ข้องใจเรอะ?',color='#ffade3',size=1.8)
self.play(
text.animate.apply_complex_function(cf),
run_time=1
)
ApplyComplexFunction
การทำภาพเคลื่อนไหวด้วย animate.apply_complex_function() สามารถแทนได้โดยใช้คลาส ApplyComplexFunction ซึ่งจะให้ผลเหมือนกัน แค่เปลี่ยนวิธีการเขียนเป็นอีกแบบ
ตัวอย่างการใช้ ApplyComplexFunction
import manimlib as mnm
import cmath
def cf(p):
return cmath.sin(p*0.4)*5
class Manimala(mnm.Scene):
def construct(self):
text = mnm.Text('ระนาบเชิงซ้อนแล้วไง\n\n ข้องใจตรงไหนกัน?',color='#fff1ad',size=1.7)
self.play(
mnm.ApplyComplexFunction(cf,text),
run_time=1
)
อ่านบทถัดไป >>
บทที่ ๑๒