ภาคตัดกรวย (Conics) ด้วยภาษา Python ตอน Parabola




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




นิยามของ Parabola คือ เซตของจุดที่อยู่ห่างจากจุดคงที่จุดหนึ่งและเส้นตรงเส้นหนึ่งเป็นระยะทางเท่ากัน [1] และจาก [2] ทำให้ทราบว่าสมการทั่วไปของ parabola คือ

1. Vertical axis และ focus คือ (0,a)

x 2 = 4 a y


2. Horizontal axis และ focus คือ (a,0)
y 2 = 4 a x



เมื่อ  a คือ ระยะห่างจากจุด focus ไปจุด (0,0) และ a > 0

Python script


import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-20,20,400)
y = np.linspace(-20,20,400)
x,y = np.meshgrid(x,y)

a = 5
r = 0

ax = plt.axes()
ax.grid()
ax.axis('equal')

ax.contour(x,y, (y**2 - 4*a*x), [r], colors='green')

plt.show()


คำอธิบาย
ชุดคำสั่งชุดนี้ใช้สมการแบบ vertical axis โดยกำหนดค่า a เป็น 5




ทดลองเปลี่ยนแปลงค่า parameter


1. สร้างสมการแบบ horizontal axis

ax.contour(x,y, (x**2 - 4*a*y), [r], colors='green')



2.  เปลี่ยนค่าของ  a

a = 5
ax.contour(x,y,
       x**2-4*a*y, 
           [r],colors='green'
           )
a = 1
ax.contour(x,y,
       x**2-4*a*y, 
           [r],colors='red'
           )




จากแสดงผลของค่า a เมื่อมีค่ามาก(สีเขียว) และเมื่อมีค่าน้อย (สีแดง)

3. เครื่องหมายข้างหน้า a

a = 5
ax.contour(x,y,
       x**2-4*a*y, 
           [r],colors='green'
           )
a = -5
ax.contour(x,y,
       x**2-4*a*y, 
           [r],colors='red'
           )



เมื่อ a มีเครื่องหมายเป็น + (สีเขียว) และเมื่อเป็น - (สีแดง)

4. การหมุน (rotation) อ้างอิงการทำ shape rotation [3]

theta = [np.pi/4]
a = 1
ax.contour(x*np.cos(theta)-y*np.sin(theta),x*np.sin(theta)+y*np.cos(theta),
       y**2-4*a*x, 
           [r],colors='green'
           )





5. การย้ายตำแหน่ง (translation) [4]
สมมุติว่าต้องการย้ายตำแหน่งไปแนวนอนไปทางขวา 5 หน่วยและขึ้นในแนวตั้ง 5 หน่วย จะได้ translation vector เป็น
[ t x t y ] = [ 5 5 ]

ดังนั้นจุดทุกจุดจะถูกบวกด้วย translation vector รวมทั้งจุด focus และ directrix ด้วย

a = 5
tx = [5]
ty = [5]
ax.contour(x+tx,y+ty,
       y**2-4*a*x, 
       [r],colors='green'
)
ax.plot(a+tx[0],ty[0],'.')
ax.axvline(-a+tx[0])
plt.show()





การ plot จุด focus และเส้น directrix 

กรณี vertical axis

ถ้า  focus คือ (0,a) เส้น directrix คือ y = -a
ถ้า  focus คือ (0,-a) เส้น directrix คือ y = a

a = 5
ax.contour(x,y,
       x**2-4*a*y, 
           [r],colors='green'
           )
ax.plot(0,a,'.') # focus point (0,a)
ax.axhline(-a) # directrix y = -a




กรณี horizontal axis

ถ้า  focus คือ (a,0) เส้น directrix คือ x = -a
ถ้า  focus คือ (-a,0) เส้น directrix คือ x = a

a = 5
ax.contour(x,y,
       y**2-4*a*x, 
           [r],colors='green'
           )
ax.plot(a,0,'.') # focus point (a,0)
ax.axvline(-a) # directrix x = -a








เอกสารอ้างอิง

[1] https://www.mathsisfun.com/geometry/parabola.html
[2] https://somchaisom.blogspot.com/2018/03/computer-graphics-parabola-equation.html#more
[3] https://somchaisom.blogspot.com/2018/03/computer-graphics-2-d-rotation.html#more
[4] https://somchaisom.blogspot.com/2018/03/computer-graphics-2d-translation.html

Previous
Next Post »