φυβλαςのβλογ
phyblasのブログ



manim บทที่ ๑๑: การแปลงตำแหน่งจุดต่างๆของวัตถุโดยใช้ฟังก์ชัน
เขียนเมื่อ 2021/03/12 00:11
แก้ไขล่าสุด 2021/09/28 16:42
manim บทที่ ๑๑: การแปลงตำแหน่งจุดต่างๆของวัตถุโดยใช้ฟังก์ชัน

ต่อจาก บทที่ ๑๐

บทนี้จะเป็นเรื่องของการใช้ฟังก์ชันต่างๆเพื่อทำการแปลงรูปร่างของวัตถุอย่างอิสระตามที่ต้องการ




เมธอด .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
        )





อ่านบทถัดไป >> บทที่ ๑๒




-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python >> manim

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

目次

日本による名言集
モジュール
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
機械学習
-- ニューラル
     ネットワーク
ภาษา javascript
ภาษา mongol
言語学
maya
確率論
日本での日記
中国での日記
-- 北京での日記
-- 香港での日記
-- 澳門での日記
台灣での日記
北欧での日記
他の国での日記
qiita
その他の記事

記事の類別



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  記事を検索

  おすすめの記事

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

ไทย

日本語

中文