สองปีที่แล้วพอดีผมถอยเครื่องคิดเลขคาสิโอ fx-cg50 Prizm เพราะว่าสนับสนุนภาษาไพทอน อยากลองเขียนไพทอนบนเครื่องคิดเลขดู แต่เนื่องจากไพทอนไม่สามารถเรียกใช้ฟังก์ชั่นในเครื่องคิดเลขต่างๆ เช่นฟังก์ชั่นวาดรูป ฟังก์ชั่นการพล็อทกราฟ คาสิโอเองก็รีบเอาไพทอนมาลงเครื่องคิดเลขเร็วเกินไป ผมเอามาทำที่ทับกระดาษเล่นๆ จนกระทั่งสองปีให้หลังจนบัดนี้ (10 กันยายน 2020) ทางคาสิโอเพิ่งอัพเดทโอเอสของเครื่องคิดเลขจากรุ่น 3.30 มาเป็น 3.40 และได้เพิ่มฟังก์ชั่นการวาดรูปให้กับเครื่องคิดเลขรุ่นนี้ มาลองดูว่าอัพเดทแล้วมีอะไรบ้าง
เพิ่มโมดูล casioplot
ในโมดูลนี้จะมีฟังก์ชั่นให้เรียกใช้อยู่ 4 ฟังก์ชั่น
- draw_string(,,) สำหรับเขียนตัวหนังสือเลือกสี ขนาด ตำแหน่งได้
- set_pixel(,) สำหรับเขียนจุดเลือกสี ขนาด ตำแหน่งได้ ถ้าวาดจุดต่อๆกันก็จะเป็นเส้นตรง เส้นโค้ง
- get_pixel(,) สำหรับอ่านว่าตำแหน่งนั้นมีจุดสีอะไร ขนาดเท่าไหร่
- show_screen() สำหรับแสดงผลบนหน้าจอ
แค่นี้ก็เกินพอแล้วครับ สำหรับเอาไปวาดรูป นอกจากนั้นทางคาสิโอ้ได้ให้ไลบรารีภาษาไพทอนมาสองไฟล์คือ matplotl.py และ turtle.py สามารถดาวน์โหลดได้จากลิ๊งค์ของคาสิโอฝรั่งเศส ตัว matplotl.py เป็นไลบรารีขนาดย่อของ matplotlib ส่วน turtle.py ใช้วาดภาพเคลื่อนไหวไปทีละส่วน สองไลบรารีนี้ก็เรียกใช้งานฟังก์ชั่น 4 ฟังก์ชั่นดังกล่าวข้างต้น
ทดสอบ matplotlib ฉบับย่อ
ผมจะลองพล็อทโค้งดิ่งของงานสำรวจ เป็นที่ทราบกันดีว่าเป็นโค้งพาราโบล่า โจทย์กำหนดให้ BVC 2+880 มีค่าระดับ 468.62 เมตร g1=-3.2% g2=1.8% PVI 3+030 การคำนวณตามไปดูในโค้ดได้ การเขียนโค้ดสามารถเขียนได้ในเครื่องคิดเลขแต่ช้ามาก ถ้าแก้ไขอะไรนิดๆหน่อยๆทำได้ ดังนั้นเขียนบนคอมพิวเตอร์จะสะดวกที่สุด
ผมตั้งชื่อไฟล์โปรแกรมว่า “vcurve.py” เวลาโอนไฟล์จากคอมพิวเตอร์ก็สะดวก สายที่ใช้เชื่อมเป็นสาย USB รุ่นหัวมินิเก่าหน่อย พอต่อแล้วกด F1 เพื่อเลือกโหมด USB จากนั้นก็จะเห็นเป็นไดรว์ สามารถก็อปปี้โปรแกรมไปมาได้
from matplotl import * #Vertical curve (parabola) g1 = -3.2/100 #initial grade g2 = 1.8/100 #final grade BSta = 2880 PSta = 3030 L = 2*(PSta-BSta) #length of curve = 300m A = g2-g1 c1 = 468.62 #BVC elevation c2 = c1 + g1*L/2 #PVI elevation c3 = c2 + g2*L/2 #EVC elevation c4 = c2 - g2*L/2 #origin of g2 grade line a = A/(2*L) b = g1 #Plot parabola curve x = [i for i in range(L+1)] # Array of x values y = [a*(i**2)+b*i+c1 for i in x] # Array of corresponding y values plot(x, y, "blue") #Plot lowest point xx = [-1*g1*(L/A)] yy = [a*(i**2)+b*i+c1 for i in xx] scatter(xx,yy) #plot grade lines x2 = [0, L/2] y2 = [g1*i+c1 for i in x2] x3 = [L/2, L] y3 = [g2*i+c4 for i in x3] plot(x2, y2, "red") #grade line g1 plot(x3, y3, "magenta") #grade line g2 #Draw texts text(0,c1+0.25,"BVC") text(L,c3+0.25,"EVC") text(L/2,c2+0.25,"PVI") text(L/4+10,(c1+c2)/2.0,"g1=-3.2%") text(0.75*L,(c2+c3)/2.0,"g2=1.8%") text(xx[0], yy[0], "x={:.1f} y={:.1f}".format(xx[0],yy[0])) #Define axis axactly axis([-10,L+50,c2-0.5,c1+0.5]) show() #Print all print("Length of curve: {:.1f}m".format(L)) print("g1: {:.1f}%".format(g1*100)) print("g2: {:.1f}%".format(g2*100)) print("BVC elevation: {:3f}m".format(c1)) print("PVI elevation: {:.3f}m".format(c2)) print("EVC elevation: {:.3f}m".format(c3)) print("lowest point: x={:.3f} y={:.3f}".format(xx[0],yy[0])) print("EVC station: {:.0d}".format(BSta+L))
รันโปรแกรมทดสอบโค้งดิ่ง
ทำการรันโปรแกรมบนเครื่องคิดเลข จะเห็นหน้าจอที่วาดโดยไลบรารี matplotlib ฉบับย่อ พอได้เลยครับ การพล็อทเส้นพาราโบลาก็ทำได้ง่าย เพียงแต่ต้องกำหนดสมการ x และ y ให้ แล้วผมก็ลากเส้นเกรดสองเส้น จากนั้นก็เขียนตัวอักษรเช่น BVC, PVI และ EVC และเน้นจุดที่เป็นจุดต่ำสุดให้
ถ้ากดปุ่ม “Exit” จะออกจากโปรแกรม โปรแกรมจะพิมพ์รายการที่คำนวณมาให้
ในช่วงสองปีนี้คาสิโอเองได้ทำการบ้านมาพอสมควร อนาคตน่าจะมีคนเอามาเขียนเป็นไลบรารีเพิ่ม และทางคาสิโอเองคงจะมีการ implement ฟังก์ชั่นต่างๆเข้ามาเพิ่มให้ไพทอนเรียกใช้ได้ ตอนนี้เครื่องคิดเลขเปลี่ยนจากสถานะที่ทับกระดาษกลับมาเป็นเครื่องเทพสมกับราคาที่กัดฟันซื้อจนแทบจะร้าว
ณ ตอนนี้ผมมองหาอีกรุ่นคือ fx-9750GIII ที่ราคาย่อมเยามากและมีภาษาไพทอนมาให้ด้วย ส่วนรุ่นเทพ fx-9860GIII บ้านเรา ณ ตอนนี้ยังไม่นำมาขายและมีภาษาไพทอนมาให้เช่นเดียวกัน โปรดติดตามกันตอนต่อไปครับ