φυβλαςのβλογ
phyblas的博客



manim บทที่ ๑๓: การใส่วงกลมและส่วนของวงกลม
เขียนเมื่อ 2021/03/12 00:13
แก้ไขล่าสุด 2021/09/28 16:42

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

บทนี้จะเป็นเรื่องของการวาดรูปวงกลมและส่วนประกอบต่างๆของวงกลม




การวาดวงกลม (Circle)

คลาส Circle ใช้สร้างวัตถุวงกลม

รัศมีกำหนด้วยคีย์เวิร์ด radius จุดกึ่งกลางวงกลมกำหนดที่คีย์เวิร์ด arc_center

สีของเส้นขอบกำหนดโดยคีย์เวิร์ด stroke_color หรือ color ความหนาของเส้นขอบกำหนดได้โดยคีย์เวิร์ด stroke_width

ตัวอย่าง
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        p = np.array([3,0,0])
        wongklom = mnm.Circle(arc_center=p,
                              radius=3,
                              stroke_width=12,
                              color='#aaffaa')
        self.play(
            mnm.Write(wongklom),
            run_time=1
        )
        self.wait(0.5)






การกำหนดสีและความทึบแสงของพื้นและขอบ

หากต้องการระบายสีพื้นวงกลมให้ใส่คีย์เวิร์ด fill_opacity เพื่อปรับความทึบแสงของสีพื้น โดยที่ค่าตั้งต้นคือ 0 คือเท่ากับไม่ใส่พื้น

หากใส่แค่ค่า color หรือ stroke_color แล้ว สีพื้นจะตรงกับสีขอบ แต่หากต้องการสีพื้นที่ต่างไปก็กำหนดได้โดยคีย์เวิร์ด fill_color

สีและความทึบแสงของพื้นสามารถปรับได้ด้วยเมธอด .set_fill() ซึ่งใช้กับ .animation เพื่อทำภาพเคลื่อนไหวได้

หากต้องการปรับคุณสมบัติของขอบก็ทำได้โดยเมธอด .set_stroke() เช่นเดียวกับกรณีของเส้นตรง

แต่หากต้องการปรับทั้งเส้นขอบและพื้นอาจใช้เมธอด .set_style()

ตัวอย่าง สร้างวงกลมที่มีสีพื้นแล้วใช้เมธอดต่างๆเพื่อปรับขอบและพื้นไปเรื่อยๆ
import manimlib as mnm

class Manimala(mnm.Scene):
    def construct(self):
        wongklom = mnm.Circle(radius=3,
                              stroke_width=14,
                              color='#fffb99',
                              fill_opacity=0.5,
                              fill_color='#b64a9b')
        self.play(
            wongklom.animate.set_fill(color='#2eab75',
                                      opacity=1),
            run_time=1
        )
        self.play(
            wongklom.animate.set_style(stroke_color='#7ccbd4',
                                       stroke_width=30,
                                       fill_color='#ab7b2e',
                                       fill_opacity=0.7),
            run_time=1
        )
        self.play(
            wongklom.animate.set_stroke(color='#be7cd4',
                                        width=1),
            run_time=1
        )






การสร้างวงรี (Ellipse)

คลาส Ellipse ใช้สร้างวงรี ซึ่งส่วนประกอบและคุณสมบัติต่างๆจะคล้ายกับวงกลม (คลาส Ellipse เป็นคลาสย่อยของ Circle) แต่จะต่างตรงที่กำหนดความกว้าง width และความสูง height แทนที่จะเป็นรัศมี radius

ตัวอย่าง ลองสร้างวงรีขึ้นมาแล้วทำภาพเคลื่อนไหวปรับความกว้างกับความสูง
import manimlib as mnm

class Manimala(mnm.Scene):
    def construct(self):
        wongri = mnm.Ellipse(width=7,
                             height=4,
                             color='#c1d9ad',
                             fill_opacity=1,
                             fill_color='#937cd4')
        self.play(
            wongri.animate.set_width(12,stretch=True),
            run_time=1
        )
        self.play(
            wongri.animate.set_height(6,stretch=True),
            run_time=1
        )






การสร้างจุด (Dot)

คลาส Dot เอาไว้วาดจุดลงบนตำแหน่งที่กำหนด โดยจริงๆแล้ว Dot เป็นคลาสย่อยของ Circle แต่จะได้เป็นวงกลมที่มีพื้นแต่ไม่มีเส้นขอบ

ตัวอย่าง ลองสร้างจุดขึ้นมา ๑๑ ตัวโดยไล่ขนาด แล้วให้ค่อยๆโผล่ขึ้นมาทีละตัว
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        list_chut = []
        for i in range(11):
            xy = np.array([i-6,(i-9)/3,0]) # ตำแหน่งจุด
            r = 0.2+0.02*i**2 # รัศมี เพิ่มขึ้นเรื่อยๆ
            chut = mnm.Dot(xy,radius=r,color='#c1d9ad')
            list_chut.append(chut)
        # นำมาจัดรวมกลุ่ม
        vg = mnm.VGroup(*list_chut)
        self.play(
            mnm.Write(vg),
            run_time=1.5
        )






การสร้างเส้นโค้งส่วนของวงกลม (Arc)

คลาส Arc ใช้สร้างเส้นโค้งส่วนของวงกลม โดยใส่ค่ามุมกวาดเริ่มต้น ตามด้วยมุมกวาดรวม (มุมกวาดสุดท้าย-มุมกวาดเริ่มต้น)

ส่วนรัศมีกำหนดโดยคีย์เวิร์ด radius เช่นเดียวกับวงกลม จุดกึ่งกลางก็กำหนดโดยคีย์เวิร์ด arc_center

ตัวอย่าง
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        p = np.array([2,-2,0])
        arc = mnm.Arc(np.radians(30),
                      np.radians(160),
                      radius=4,
                      arc_center=p,
                      color='#eeaaaa',
                      stroke_width=20)
        self.play(
            mnm.Write(arc),
            run_time=1.5
        )






ArcBetweenPoints

อีกคลาสที่ใช้สร้างเส้นโค้งส่วนของวงกลมได้คือ ArcBetweenPoints ผลที่ได้จะเหมือน Arc เพียงแต่สร้างโดยกำหนดจุดต้นจุดปลายและมุมกวาด ซึ่งจะคล้ายกับการสร้างเส้นโค้งด้วยคลาส Line แต่ผลที่ได้จะเป็นวัตถุต่างชนิดกัน

ตัวอย่าง
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        p1 = np.array([-5,0,0]) # จุดเริ่ม
        p2 = np.array([5,-1,0]) # จุดปลาย
        # วาดหลายเส้นให้มีจุดต้นจุดปลายที่เดียวกันแต่มุมกวาดต่างกัน
        lis_arc = []
        for i in range(12):
            a = np.radians(120-i*25)
            arc = mnm.ArcBetweenPoints(p1,p2,
                                       angle=a,
                                       color='#bbeeaa',
                                       stroke_width=15)
            lis_arc.append(arc)
        # รวมเส้นทั้งหมดเข้าไว้ในกลุ่ม
        vg = mnm.VGroup(*lis_arc)
        # ใส่จุดเริ่มกับจุดปลายไว้ก่อน
        self.add(mnm.Dot(p1),mnm.Dot(p2))
        # ทำการวาดเส้นโค้ง
        self.play(
            mnm.Write(vg),
            run_time=1.5
        )






การสร้างวงแหวน (Annulus)

คลาส Annulus ใช้สร้างรูปวงแหวน โดยกำหนดค่ารัศมีด้านใน inner_radius และรัศมีด้านนอก outer_radius

ตัวอย่าง ลองสร้างขึ้นมาดูสัก ๓​ วง
import manimlib as mnm

class Manimala(mnm.Scene):
    def construct(self):
        self.play(
            mnm.Write(
                mnm.VGroup(
                    mnm.Annulus(inner_radius=0.1,outer_radius=0.5,color='#5c2496'),
                    mnm.Annulus(inner_radius=1.1,outer_radius=1.8,color='#884cc6'),
                    mnm.Annulus(inner_radius=2.1,outer_radius=3.1,color='#b081e1')
                )
            ),
            run_time=1.5
        )






การสร้างส่วนตัดของวงแหวน (AnnularSector)

คลาส AnnularSector ไว้ใช้สร้างรูปส่วนตัดของวงแหวน การสร้างคล้ายคลาส Annulus แต่จะกำหนดมุมกวาดเริ่มต้น start_angle และมุมกวาด angle ของวงแหวนด้วย

ตัวอย่าง ใช้ AnnularSector สร้างส่วนตัดของวงแหวนขึ้นมาทีละส่วน
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        lis_suan = []
        for i in range(12):
            suan = mnm.AnnularSector(inner_radius=3,
                                     outer_radius=2,
                                     angle=np.radians(25),
                                     start_angle=np.radians(i*30),
                                     color='#81c9e1')
            lis_suan.append(suan)
        vg = mnm.VGroup(*lis_suan)
        self.play(
            mnm.Write(vg),
            run_time=1.5
        )






การสร้างส่วนตัดของวงกลม (Sector)

คลาส Sector ใช้สร้างส่วนตัดของวงกลม (เหมือนชิ้นพิซซ่า) การใช้คล้ายกับ AnnularSector แต่ใส่แค่ outter_radius คือรัศมีของวงกลม

ตัวอย่าง ลองใช้ Sector สร้างส่วนตัดของวงกลมขึ้นมาทีละอัน
import manimlib as mnm
import numpy as np

class Manimala(mnm.Scene):
    def construct(self):
        lis_suan = []
        for i in range(24):
            suan = mnm.Sector(outer_radius=3.7,
                              angle=np.radians(12),
                              start_angle=np.radians(i*15),
                              color='#ef9ddf')
            lis_suan.append(suan)
        vg = mnm.VGroup(*lis_suan)
        self.play(
            mnm.Write(vg),
            run_time=1.5
        )





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




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

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

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

หมวดหมู่

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

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

目录

从日本来的名言
模块
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
机器学习
-- 神经网络
javascript
蒙古语
语言学
maya
概率论
与日本相关的日记
与中国相关的日记
-- 与北京相关的日记
-- 与香港相关的日记
-- 与澳门相关的日记
与台湾相关的日记
与北欧相关的日记
与其他国家相关的日记
qiita
其他日志

按类别分日志



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

  查看日志

  推荐日志

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