ต่อจาก
บทที่ ๑๓
บทนี้จะเป็นเรื่องของการสร้างรูปหลายเหลี่ยมชนิดต่างๆ
การวาดรูปหลายเหลี่ยมทั่วไป (Polygon)
รูปหลายเหลี่ยมโดยทั่วไปสร้างขึ้นได้จากคลาส Polygon โดยค่าที่ต้องใส่คือตำแหน่งจุดมุมของรูปเหลี่ยมนั้นๆ โดยจะกำหนดกี่จุดก็ได้
ตัวอย่าง ลองสร้างสามเหลี่ยมโดยกำหนดตำแหน่งจุดมุมทั้ง ๓
import manimlib as mnm
import numpy as np
class Manimala(mnm.Scene):
def construct(self):
samliam = mnm.Polygon(np.array([0,-2,0]),
np.array([6,0,0]),
np.array([-4,3,0]),
fill_color='#6644ff',
fill_opacity=1,
color='#ffaaaa',
stroke_width=12)
self.play(
mnm.Write(samliam),
run_time=1.2
)
self.wait(0.3)
คีย์เวิร์ด fill_color, fill_opacity, color, stroke_width นั้นเหมือนกับที่ใช้กับวัตถุวงกลมในบทที่แล้ว
การปรับให้มุมโค้งมนด้วยเมธอด .round_corners()
รูปหลายเหลี่ยมสามารถปรับส่วนมุมให้โค้งมนได้ โดยใช้เมธอด .round_corners() โดยใส่ค่ารัศมีส่วนโค้งลงไป
เมธอดนี้สามารถใช้กับ .animation เพื่อทำภาพเคลื่อนไหวให้มุมค่อยๆเปลี่ยนเป็นโค้งมนลงไปได้
ตัวอย่าง
import manimlib as mnm
import numpy as np
class Manimala(mnm.Scene):
def construct(self):
samliam = mnm.Polygon(np.array([6,-2,0]),
np.array([-6.5,-3,0]),
np.array([1,3,0]),
fill_color='#893e7c',
fill_opacity=1,
color='#d7bae8')
self.play(
samliam.animate.round_corners(0.8),
run_time=1.2
)
self.wait(0.3)
การวาดสี่เหลี่ยมจตุรัส (Square)
คลาส Square เป็นคลาสย่อยของคลาส Polygon เอาไว้ใช้สร้างสี่เหลี่ยมจตุรัสซึ่งมีความยาวด้านตามที่กำหนด
ตัวอย่าง ลองสร้างสี่เหลี่ยมจตุรัสหลายๆอันไล่ขนาดไปเรื่อยๆ
import manimlib as mnm
class Manimala(mnm.Scene):
def construct(self):
lis_siliam = []
for i in range(11):
siliam = mnm.Square((2+i)/8, # ขนาดด้าน
fill_color='#72c7d6',
fill_opacity=0.8)
lis_siliam.append(siliam)
vg = mnm.VGroup(*lis_siliam) # นำมารวมกลุ่ม
vg.arrange(mnm.LEFT) # จัดให้เรียงต่อกันไปทางซ้าย
self.play(
mnm.Write(vg),
run_time=1.5
)
การวาดสี่เหลี่ยมผืนผ้า (Rectangle)
คลาส Rectangle เป็นคลาสย่อยของคลาส Polygon เอาไว้ใช้สร้างสี่เหลี่ยมผืนผ้า โดยกำหนดขนาดด้านกว้างและสูง
ตัวอย่าง ลองสร้างสี่เหลี่บมผืนผ้าหลายๆอันไล่ขนาดวางเรียงกัน
import manimlib as mnm
import numpy as np
class Manimala(mnm.Scene):
def construct(self):
lis_siliam = []
for i in range(14):
siliam = mnm.Rectangle((2+i)/12, # กว้าง
1+5*i/15, # สูง
fill_color='#8c72d6',
fill_opacity=0.9)
lis_siliam.append(siliam)
vg = mnm.VGroup(*lis_siliam) # นำมารวมกลุ่ม
vg.arrange(mnm.RIGHT) # จัดให้เรียงต่อกันไปทางขวา
self.play(
mnm.Write(vg),
run_time=1.5
)
การวาดสี่เหลี่ยมผืนผ้ามุมโค้งมน (RoundedRectangle)
คลาส RoundedRectangle ใช้สร้างสี่เหลี่ยมผืนผ้าพร้อมปรับมุมให้โค้งมนไปด้วย
ตัวอย่าง
import manimlib as mnm
class Manimala(mnm.Scene):
def construct(self):
lis_siliam = []
for i in range(7):
siliam = mnm.RoundedRectangle(width=(2+i)/3, # กว้าง
height=6, # สูง
corner_radius=0.1+0.2*i, # ความโค้งมน
fill_color='#f4c994',
fill_opacity=1)
lis_siliam.append(siliam)
vg = mnm.VGroup(*lis_siliam) # นำมารวมกลุ่ม
vg.arrange(mnm.RIGHT) # จัดให้เรียงต่อกันไปทางขวา
self.play(
mnm.Write(vg),
run_time=1.5
)
การวาดรูปหลายเหลี่ยมด้านเท่า (RegularPolygon หรือ Triangle)
คลาส RegularPolygon เป็นคลาสย่อยของ Polygon เอาไว้สร้างรูปหลายเหลี่ยมด้านเท่าซึ่งมีจำนวนด้านตามที่กำหนด
คลาส Triangle เป็นคลาสย่อยของ RegularPolygon อีกที ในกรณีที่จำนวนด้านเป็น 3
ลองสร้างรูปเหลี่ยมด้านเท่าที่มีจำนวนด้านตั้งแต่ 3 ไปจนถึง 10
import manimlib as mnm
class Manimala(mnm.Scene):
def construct(self):
lis_rupliam = []
for i in range(8):
rupliam = mnm.RegularPolygon(3+i,
fill_color='#d672b6',
fill_opacity=1-0.1*i)
lis_rupliam.append(rupliam)
vg = mnm.VGroup(*lis_rupliam)
vg.arrange_in_grid(n_cols=4)
self.play(
mnm.Write(vg),
run_time=1.5
)
ค่ามุมกวาดเริ่มต้นกำหนดได้โดยคีย์เวิร์ด start_angle
ตัวอย่าง ลองสร้างรูปสามเหลี่ยมโดยเปลี่ยมมุมกวาดเริ่มต้นไปเรื่อยๆ
import manimlib as mnm
import numpy as np
class Manimala(mnm.Scene):
def construct(self):
lis_samliam = []
for i in range(7):
samliam = mnm.Triangle(start_angle=np.radians(15*i),
fill_color='#c4f494',
fill_opacity=0.9-0.15*i)
lis_samliam.append(samliam)
vg = mnm.VGroup(*lis_samliam)
vg.arrange(mnm.RIGHT)
self.play(
mnm.Write(vg),
run_time=1.5
)
การวาดสี่เหลี่ยมล้อมกรอบ (SurroundingRectangle)
คลาส SurroundingRectangle ใช้สร้างสี่เหลี่ยมผืนผ้าล้อมรอบวัตถุที่กำหนด
หากต้องการให้เว้นระยะห่างระหว่างกรอบกับตัววัตถุให้ใส่ค่าระยะที่คีย์เวิร์ด buff
คีย์เวิร์ดอื่นๆเหมือนกับกรณีสร้างสี่เหลี่ยมผืนผ้าด้วยคลาส Rectangle
ตัวอย่าง
import manimlib as mnm
class Manimala(mnm.Scene):
def construct(self):
text = mnm.Text('เงิน',size=4,color='#dbb4ff')
kroplom = mnm.SurroundingRectangle(text,
buff=1,
color='#91bf64',
stroke_width=20,
fill_color='#ffb4ce',
fill_opacity=0.3)
self.add(text)
self.play(
mnm.Write(kroplom),
run_time=1
)
การระบายพื้นสี่เหลี่ยมหลังวัตถุ (BackgroundRectangle)
คลาส BackgroundRectangle เป็นคลาสย่อยของ SurroundingRectangle อีกที โดยจะต่างกันตรงที่สร้างพื้นที่สี่เหลี่ยมล้อมวัตถุโดยจะแค่ระบายสีแต่ไม่วาดขอบ
ตัวอย่าง
import manimlib as mnm
class Manimala(mnm.Scene):
def construct(self):
text = mnm.Text('สมบัติ',size=4.5,color='#bde5c7')
kroplom = mnm.BackgroundRectangle(text,
buff=2,
fill_color='#8b5fb7')
self.add(text)
self.play(
mnm.Write(kroplom),
run_time=1
)
อ่านบทถัดไป >>
บทที่ ๑๕