ต่อจาก
บทที่ ๑๑
ตั้งแต่บทนี้ไปจนถึง
บทที่ ๑๕ จะเป็นเรื่องของการสร้างวัตถุที่เป็นรูปร่างต่างๆ โดยในบทนี้จะเริ่มจากการใส่เส้นตรงและเส้นโค้ง
การวาดเส้นตรง
วัตถุเส้นตรงสามารถสร้างได้ด้วยคลาส Line โดยค่าที่ต้องใส่คือจุดต้นกับจุดปลาย
ลองดูตัวอย่างแสดงการวาดเส้นขึ้นมา
import manimlib as mnm
import numpy as np
class Manimala(mnm.Scene):
def construct(self):
p1 = np.array([-5.5,3.5,0])
p2 = np.array([6.5,-2.5,0])
sen = mnm.Line(p1,p2)
self.play(
mnm.Write(sen),
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,3,0])
p2 = np.array([5,-3,0])
# จุดต้นปลายใหม่
p3 = np.array([7,0,0])
p4 = np.array([-7,0,0])
# สร้างเส้น
sen = mnm.Line(p1,p2)
self.play(
sen.animate.set_points_by_ends(p3,p4),
run_time=1.5
)
การปรับขอบของเส้น
ความหนา, สี และความทึบแสงของเส้นสามารถกำหนดได้โดยคีย์เวิร์ด stroke_width, stroke_color (อาจใช้ color เฉยๆแทนได้) และ stroke_opacity ตามลำดับ
นอกจากนี้ยังสามารถปรับค่าภายหลังได้ด้วยเมธอด .set_stroke() ซึ่งสามาถใช้กับ .animation เพื่อทำเป็นภาพเคลื่อนไหวได้
ตัวอย่าง ลองสร้างเส้นโดยกำหนดค่าความหนา, สี และความทึบแสงตั้งต้น จากนั้นก็ทำภาพเคลื่อนไหวให้ค่าเหล่านี้เปลี่ยนแปลงด้วย .animation.set_stroke()
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])
sen = mnm.Line(p1,p2,
stroke_width=10,
stroke_color='#71ff92',
stroke_opacity=0.2)
self.play(
sen.animate.set_stroke(width=70,
color='#b86fe7',
opacity=1),
run_time=1.5
)
การวาดเส้นโค้งส่วนของวงกลม
คลาส Line นั้นนอกจากใช้สร้างเส้นตรงแล้วก็ยังใช้สร้างเส้นโค้งได้ โดยใส่มุมความโค้งของเส้นได้ที่คีย์เวิร์ด path_arc
มุมโค้งของเส้นสามารถปรับได้ภายหลังด้วยเมธอด .set_path_arc() ซึ่งก็สามารถใช้กับ .animate เพื่อทำเป็นภาพเคลื่อนไหวได้
ตัวอย่าง ลองทำภาพเคลื่อนไหวที่มีการเปลี่ยนแปลงความโค้งของเส้นไปเรื่อยๆ
import manimlib as mnm
import numpy as np
class Manimala(mnm.Scene):
def construct(self):
p1 = np.array([5,1,0])
p2 = np.array([-5,-1,0])
sen = mnm.Line(p1,p2,
path_arc=np.radians(120),
color='#8583e1',
stroke_width=20)
self.play(
sen.animate.set_path_arc(-np.radians(80)),
run_time=1.5
)
การวาดเส้นประ
คลาส DashedLine ไว้ใช้วาดเส้นประ วิธีการใช้คล้าย Line แต่จะได้เส้นออกมาเป็นเส้นประ
ความถี่ของเส้นประกำหนดได้ที่คีย์เวิร์ด dash_length
ตัวอย่าง
import manimlib as mnm
import numpy as np
class Manimala(mnm.Scene):
def construct(self):
p1 = np.array([6.5,3,0])
p2 = np.array([-6.5,-2.5,0])
senpra = mnm.DashedLine(
p1,p2,
dash_length=0.2,
color='#d4b1f2',
stroke_width=19
)
self.play(
mnm.Write(senpra),
run_time=1.5
)
อีกตัวอย่าง ลองสร้างภาพเคลื่อนไหวที่เปลี่ยนระหว่าง dash_length มากไปน้อยเพื่อเปรียบเทียบ
import manimlib as mnm
import numpy as np
class Manimala(mnm.Scene):
def construct(self):
p1 = np.array([6,3.5,0])
p2 = np.array([-6,-3.5,0])
senpra1 = mnm.DashedLine(
p1,p2,
dash_length=0.8
)
senpra2 = mnm.DashedLine(
p1,p2,
dash_length=0.1
)
self.play(
mnm.Transform(senpra1,senpra2),
run_time=1.5
)
สัดส่วนของเส้นต่อช่องว่างกำหนดได้ที่คีย์เวิร์ด positive_space_ratio ยิ่งค่ามากยิ่งมีส่วนของเส้นมาก ช่องว่างน้อย
ตัวอย่าง เปรียบเทียบระหว่าง positive_space_ratio น้อยกับมาก
import manimlib as mnm
import numpy as np
class Manimala(mnm.Scene):
def construct(self):
p1 = np.array([5.5,-3.5,0])
p2 = np.array([-6,3.5,0])
senpra1 = mnm.DashedLine(
p1,p2,
positive_space_ratio=0.2
)
senpra2 = mnm.DashedLine(
p1,p2,
positive_space_ratio=0.8
)
self.play(
mnm.Transform(senpra1,senpra2),
run_time=1.5
)
การวาดกากบาทขีดทับ
หากมีวัตถุที่ต้องการจะขีดกากบาททับก็ทำได้โดยสร้างคลาส Cross แล้วใส่วัตถุที่ต้องการกา
กากบาทที่สร้างขึ้นมานั้นสามารถปรับสีและความกว้างของเส้นได้ด้วยเมธอด .set_stroke()
ตัวอย่างการใช้
import manimlib as mnm
class Manimala(mnm.Scene):
def construct(self):
text = mnm.Text('ภาษี',size=7,color='#c27bff')
kakabat = mnm.Cross(text)
kakabat.set_stroke(color='#77ffaa',width=30)
self.add(text)
self.play(
mnm.Write(kakabat),
run_time=1
)
การวาดเส้นขีดด้านใต้
คลาส Underline เอาไว้ใช้ขีดเส้นด้านใต้วัตถุ หากใช้กับวัตถุที่เป็นกลุ่มเช่นตัวหนังสือสามารถเลือกขีดแค่เฉพาะบางส่วนได้
ตัวอย่างการใช้ เริ่มจากขีดทั้งหมดก่อนแล้วเปลี่ยนเป็นขีดเฉพาะบางส่วน
import manimlib as mnm
class Manimala(mnm.Scene):
def construct(self):
text = mnm.Text('ความหมาย',size=4,color='#ff7bf1')
# เส้นขีดทั้งหมด
sentai1 = mnm.Underline(text)
sentai1.set_stroke(color='#f2a756',width=20)
# เส้นขีดเฉพาะส่วน
sentai2 = mnm.Underline(text[4:7])
sentai2.set_stroke(color='#f2567b',width=30)
self.add(text)
self.play(
mnm.FadeTransform(sentai1,sentai2),
run_time=1
)
self.wait(0.5)
อ่านบทถัดไป >>
บทที่ ๑๓