ต่อจาก
บทที่ ๑๔
บทนี้จะเป็นเรื่องของการสร้างรูปลูกศรขึ้นมาในภาพ
การวาดลูกศร
ลูกศรสามารถสร้างขึ้นได้จากคลาส 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)
อ่านบทถัดไป >>
บทที่ ๑๖