φυβλαςのβλογ
บล็อกของ phyblas



manim บทที่ ๑๕: การใส่ลูกศร
เขียนเมื่อ 2021/03/12 00:15

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

บทนี้จะเป็นเรื่องของการสร้างรูปลูกศรขึ้นมาในภาพ




การวาดลูกศร

ลูกศรสามารถสร้างขึ้นได้จากคลาส Arrow โดยวิธีการใช้จะคล้ายกับคลาส Line ที่ใช้วาดเส้น(ในบทที่ ๑๒) คือให้ใส่ตำแหน่งจุดต้นและจุดปลาย

ตัวอย่าง ลองกำหนดจุดหัวและหางลูกศรขึ้นมาแล้ววาดลูกศรขึ้นที่จุดหัวและหางที่กำหนดนั้น
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        p1 = np.array([-6,2,0]) # หางลูกศร
        p2 = np.array([6,-2,0]) # หัวลูกศร
        lukson = mnm.Arrow(p1,p2,fill_color='#efa5c4')
        self.add(mnm.Dot(p1),
                 mnm.Dot(p2))
        self.play(
            mnm.Write(lukson),
            run_time=1
        )
        self.wait(0.5)



จะเห็นว่าโดยค่าตั้งต้นแล้วลูกศรจะถูกวาดให้ทั้งหัวและหางไม่ลากไปจนถึงจุดที่กำหนด ซึ่งระยะตรงนี้กำหนดได้โดยคีย์เวิร์ด buff หากต้องการให้หัวและหางลูกศรอยู่ที่จุดพอดีให้ใช้ buff=0

ตัวอย่างลองเปรียบเทียบลูกศรที่ค่า buff ต่างกัน
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        p1 = np.array([-6,0,0])
        p2 = np.array([6,0,0])
        lukson = mnm.VGroup(*[mnm.Arrow(p1,p2,buff=i*0.25,fill_color='#a76fe0') for i in range(11)])
        lukson.arrange(mnm.UP)
        self.play(
            mnm.Write(lukson),
            run_time=1.5
        )






การปรับความโค้งของลูกศร

ลูกศรสามารถสร้างให้เป็นเส้นโค้งส่วนของวงกลมได้ด้วยการใส่ค่าความโค้ง (หน่วยเรเดียน) ที่คีย์เวิร์ด path_arc

ตัวอย่าง ลองสร้างลูกศรที่ความโค้งต่างๆกันขึ้นมา
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        p1 = np.array([-6,3,0])
        p2 = np.array([6,-3,0])
        lukson = mnm.VGroup(*[mnm.Arrow(p1,p2,
                                        buff=0,
                                        color='#a5c1ef',
                                        fill_opacity=0,
                                        stroke_width=5,
                                        path_arc=np.radians(-90+i*30))
                                        for i in range(7)])
        self.add(mnm.Dot(p1),
                 mnm.Dot(p2))
        self.play(
            mnm.Write(lukson),
            run_time=1.5
        )





การปรับตำแหน่งจุดปลายลูกศร

จุดปลายลูกศรทั้งหัวลูกศรและหางลูกศรสามารถเปลี่ยนแปลงภายหลังได้โดยใช้เมธอด .set_points_by_ends() ซึ่งสามารถใช้กับ .animate เพื่อทำเป็นภาพเคลื่อนไหวได้

ตัวอย่าง ลองทำภาพเคลื่อนไหวที่ย้ายตำแหน่งหัวลูกศร
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        p1 = np.array([-5,-2,0]) # จุดหางลูกศร
        p2 = np.array([5,3,0]) # จุดหัวลูกศร
        p3 = np.array([3,-3,0]) # จุดหัวลูกศรจุดใหม่
        lukson = mnm.Arrow(p1,p2,buff=0,fill_color='#c4efa5')
        # วาดจุด
        self.add(mnm.Dot(p1),
                 mnm.Dot(p2),
                 mnm.Dot(p3))
        self.play(
            lukson.animate.set_points_by_ends(p1,p3),
            run_time=1.5
        )






การปรับความหนาของลูกศร

ความหนาของลูกศรกำหนดได้โดยคีย์เวิร์ด thickness และสามารถปรับค่าภายหลังได้ด้วยเมธอด .set_thickness() ซึ่งใช้กับ .animate ทำให้เคลื่อนไหวได้

ตัวอย่าง ลองกำหนดความหนาให้เริ่มจาก 0.01 แล้วค่อยๆเพิ่มขึ้น
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        p1 = np.array([-6,3,0]) # จุดหางลูกศร
        p2 = np.array([5,-2,0]) # จุดหัวลูกศร
        lukson = mnm.Arrow(p1,p2,buff=0,fill_color='#efa5b1',thickness=0.01)
        self.play(
            lukson.animate.set_thickness(1),
            run_time=1.5
        )



จะเห็นว่าการปรับความหนาของลูกศรนั้นจะทำให้ขนาดหัวลูกศรเปลี่ยนตามไปด้วย เพราะสัดส่วนความกว้างหัวลูกศรกับความหนาถูกกำหนดตายตัวด้วยอีกค่าหนึ่ง




การปรับหัวลูกศร

สัดส่วนความกว้างหัวลูกศรต่อความหนาของลูกศรกำหนดได้ที่คีย์เวิร์ด tip_width_ratio

ตัวอย่าง ลองสร้างลูกศรที่ค่า tip_width_ratio ต่างๆเปรียบเทียบกัน
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        p1 = np.array([-6,0,0]) # จุดหางลูกศร
        p2 = np.array([6,0,0]) # จุดหัวลูกศร
        lukson = mnm.VGroup(*[mnm.Arrow(p1,p2,buff=0,tip_width_ratio=i*2+1,fill_color='#9eb2c8') for i in range(10)])
        lukson.arrange(mnm.DOWN)
        self.play(
            mnm.Write(lukson),
            run_time=1
        )
        self.wait(0.5)



อีกค่าหนึ่งของหัวลูกศรที่ปรับได้ก็คือขนาดมุมหัวลูกศร กำหนดได้โดยคีย์เวิร์ด tip_angle

ตัวอย่าง สร้างลูกศรที่ tip_angle ค่าต่างๆเปรียบเทียบกัน
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        p1 = np.array([-6,0,0]) # จุดหางลูกศร
        p2 = np.array([6,0,0]) # จุดหัวลูกศร
        lukson = mnm.VGroup(*[mnm.Arrow(p1,p2,
                                        buff=0,
                                        tip_angle=np.radians(5+i*10),
                                        fill_color='#c89eb8')
                              for i in range(14)])
        lukson.arrange(mnm.DOWN)
        self.play(
            mnm.Write(lukson),
            run_time=1
        )
        self.wait(0.5)





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




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

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

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

หมวดหมู่

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

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

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
maya
javascript
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
เรียนภาษาจีน
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



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

  ค้นหาบทความ

  บทความแนะนำ

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

ไทย

日本語

中文