ต่อจาก
บทที่ ๑๒
บทนี้จะเป็นเรื่องของการวาดรูปวงกลมและส่วนประกอบต่างๆของวงกลม
การวาดวงกลม (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
)
อ่านบทถัดไป >>
บทที่ ๑๔