ตอนที่แล้วผมนำเสนอโปรแกรมคำนวณโค้งราบบน HP Prime G2 ค่อนข้างน่าประทับใจโปรแกรมเขียนด้วยภาษา PPL ภาษานี้พัฒนาโดย HP เอง ลักษณะคล้ายภาษาปาสคาลแต่เพิ่มเรื่องลิสต์ ปรับ syntax ให้กระชับเข้าใจง่าย ประกาศตัวแปรแต่ตัวแปรไม่มี type มีไลบรารีฟังก์ชั่นให้พร้อมสรรพทั้งด้านคณิตศาสตร์ สถิติ และมีฟังก์ชันวาดรูปมาค่อนข้างดี สามารถอ่านไฟล์ได้ การ Input ข้อมูลทาง HP เตรียมไลบรารีให้มาใช้ง่ายลดการเขียนโค้ดลงไปมาก
ข้อเสียคือไม่สามารถคอมไพล์โปรแกรมเป็นไบนารีโค้ดได้ เวลาคนอื่นเอาโปรแกรมไปสามารถเปิดซอร์สโค้ดของปรแกรมได้ด้วย ซึ่งถ้าใครคิดจะขายโปรแกรมคงไม่เหมาะนัก เพราะก็อปปี้ต่อๆกันได้ และอีกอย่างคือราคาเครื่องคิดเลขค่อนข้างสูง แต่ถ้ามีเงินเหลือใช้จะซื้อหามาใช้งานดูก็ไม่ว่ากัน คุ้มค่าสมราคา จอสัมผัสใช้ง่ายใช้ควบคู่กับปุ่มคีย์บอร์ดที่กดง่ายตอบสนองดี
โค้งสไปรัล (Transition curve or Spiral curve)
สำหรับคำนวณโค้งสไปรัล มีคนขอให้ช่วยเขียนลงเครื่องคิดเลขตั้งนมนานแล้ว ยังไม่มีโอกาสเสียที ตอนนี้ได้ฤกษ์เขียนลงเครื่องคิดเลขมหาเทพ ก่อนไปเรื่องโปรแกรม ผมขอเล่าคร่าวๆว่าโค้งสไปรัลคืออะไร โค้งสไปรัลประกอบด้วยโค้งก้นหอยหรือโค้งสไปรัลนั่นเอง แต่จะใช้ควบรวมกับโค้งวงกลม
ลักษณะจะเป็นโค้งก้นหอยที่จุด TS ที่มีรัศมีอนันต์จากนั้นรัศมีจะค่อยๆเปลี่ยนน้อยลงตามลำดับตลอดความยาวโค้ง (Ls) จนรัศมีโค้งจะเท่ากับรัศมีโค้งวงกลมพอดีที่จุด SC แล้วเข้าสู่โค้งวงกลมตลอดความยาวโค้ง (Lc) ด้วยรัศมีคงที่ และออกจากโค้งวงกลมที่จุด CS เข้าสู่โค้งก้นหอยอีกครั้งเปลี่ยนจากรัศมีวงกลมค่อยๆมากขึ้นจนเป็นอนันต์ที่จุด ST
โค้งสไปรัลในยุคก่อนนำมาใช้กับรถไฟเพื่อให้สามารถเข้าโค้งได้อย่างนุ่มนวล มีแรงกระทำที่ล้อรถไฟน้อยกว่าโค้งวงกลมธรรมดา การนำโค้งนำมาใช้กับถนนทางหลวงเริ่มมีในยุคหลังใช้กับถนนซูเปอร์ไฮเวย์ที่รถใช้ความเร็วสูง และที่ผมเห็นกรณีพิเศษคือทาง interchange ทางแยกต่างระดับเพื่อเปลี่ยนทิศทาง ลักษณะของโค้งจะคล้ายเป็นใบของดอกโคลเวอร์ (Clover leaf) กรมทางหลวงนำมาใช้ในถนนมอเตอร์เวย์ การใช้โค้งสไปรัลในงานถนนส่วนใหญ่จะใช้คู่กันกับการยกถนนแบบ super elevation
การใช้โค้งสไปรัลบนทางแยกต่างระดับ นอกจากเข้าโค้งแล้วนุ่มนวล ยังจะได้รูปทรงที่ประหยัดพื้นที่ดีกว่าการใช้โค้งวงกลมอย่างเดียว รูปทรงที่ประหยัดพื้นที่รองลงมาคือใช้โค้งวงกลมผสมแบบ compound curve แต่ลักษณะโค้งผสมแบบนี้ไม่นิยมเนื่องจากคนขับรถจะรู้สึกไม่สบายต้องฝืนพวงมาลัยมาก ส่วนโค้งวงกลมจะใช้พื้นที่ใหญ่ที่สุด ดูรูปด้านล่าง จะเห็นสีน้ำเงินคือโค้งสไปรัล โค้งสีเขียวคือโค้งวงกลม ส่วนสีแดงคือโค้งแบบผสม
เอกสารอ้างอิง
เนื่องจากสูตรโค้งสไปรัลค่อนข้างซับซ้อนไปนิดหนึ่ง ผมเองดูหลายตำรา ตำราที่พอหาอ่านได้หน่วยจะเป็นฟุต ทำให้รู้สึกขัดๆเขินๆ เพราะทั้งชีวิตใช้แต่หน่วยเมตริกมาตลอด ในหน่วยฟุตที่จะหมายเหตุคือ การกำหนดนิยามโค้งวงกลมจะใช้ Degree of curve (D) ที่กำหนดว่าระยะทางตามโค้งยาวไป 100 ฟุตจะกวาดมุมที่จุดศูนย์กลางวงกลมไปเท่าไหร่ สามารถหารัศมีโค้งได้จากความสัมพันธ์ ความยาวโค้ง (L) มุมที่กวาด (D) และรัศมีโค้ง (R) โดยที่ D=36000/(2¶R) บางรัฐเช่นกรมทางหลวงของรัฐวอชิงตัน (WSDOT) เลิกใช้ Degree of curve มานิยามตั้งแต่ปี 1960 ร่วมๆครึ่งศตวรรษทีเดียว
แต่หน่วยเมตริกไม่มีการนิยาม Degree of curve จะนิยมกำหนดรัศมีโค้งลงไปเลยตรงๆ เอกสารตำราที่ผมดูมีดังนี้
- บล็อกของคุณ Jerry Mahun ที่ผมแค็ปรูปมาลงหลายรูป อ่านง่าย เข้าใจง่าย
- ไฟล์ PDF ของคุณ Jim Crume แสดงสูตรพร้อมทั้งวิธีการคำนวณ พร้อมตัวอย่าง และถ้าต้องการ offset โค้งสไปรัลให้ดูไฟล์ PDF ที่ลิ๊งค์นี้ ละเอียดมาก ผมดูไว้อ้างอิงรูปร่างแต่ไม่ได้นำสูตรไปใช้
- ตำรา James H. Banks ของแมคกรอฮิลล์ แจกฟรีเฉพาะเรื่อง Geometric Road และโค้งสไปรัลก็อยู่ในบทที่ฟรีนี้
- ตำราที่ไม่ได้บอกคนเขียนและเว็บไซต์ไม่มี SSL (กุญแจ) ตอนที่ผมเขียนอยู่ยังเข้าลิ๊งค์ แต่เมื่อเขียนบทความเสร็จไปเข้าอีกทีปรากฎว่าปิดไปแล้ว ผมทำไฟล์ pdf ไว้ที่นี่ หวังว่าคงไม่มีใครมาไล่เบี้ยผมเรื่องลิขสิทธิ์
การคำนวณหาส่วนประกอบโค้ง (Elements of spiral curve)
ต้องบอกก่อนว่าสูตรที่ผมพยายามอ้างอิงนั้นคือหลบเลี่ยงสูตรที่ผูกกับหน่วยฟุตแบบแนบแน่นมากเกินไป ลำดับการคำนวณ จะเริ่มจากสิ่งที่กำหนดมาให้ก่อน โดยที่นิยมคือ
- ความยาวโค้งสไปรัล (Ls)
- รัศมีโค้ง (Rc) ในที่นี้หมายถึงโค้งวงกลมที่อยู่ตรงกลาง
- Deflection angle (△) มุมกวาดโค้งประกอบด้วยมุมกวาดโค้งสไปรัล(△s)และมุมกวาดโค้งวงกลม (△c)
- ทิศทางโค้ง เลี้ยวซ้ายหรือเลี้ยวขวา
แค่สี่อย่างที่กำหนดมาให้สามารถคำนวณองค์ประกอบโค้งสไปรัลได้ทั้งหมด ถ้ากำหนดอะซิมัท back tangent จากจุดเริ่มโค้ง (TS) ไปยังจุด PI หรือ forward tangent จากจุด PI ไปยังจุดสิ้นสุดโค้งสไปรัล (ST) ก็สามารถวาดโค้งพร้อมทิศทางที่ถูกต้องได้
การคำนวณหาสถานี (Stationing)
กรณีกำหนดสถานี PI กรณีมุมเบี่ยงเบนรวมมากกว่า 180 องศา จะไม่กำหนดสถานีที่ PI ตัวอย่างทางแยกยกระดับ
- TS = PI – Ts
- SC = TS + Ls
- CS = SC + Lc
- ST = CS + Ls
กรณีกำหนดสถานีที่ TS
- PI = TS + Ts
- SC = TS + Ls
- CS = SC + Lc
- ST = CS + Ls
กรณีกำหนดสถานีที่ ST
- CS = ST – Ls
- SC = CS – Lc
- CS = SC + Lc
- ST = Cs + Ls
การคำนวณหาค่าพิกัดของจุดบนโค้งสไปรัล
นี่คือส่วนที่ยากที่สุดเมื่อเทียบกับคำนวณหาจุดบนโค้งวงกลม แต่ไม่ได้ยากเกินไป ว่างๆผมจะเอาวิธีการคำนวณแบบแมนวลมาดูกัน ในตอนนี้ขอเน้นไปที่เครื่องคิดเลข HP Prime ก่อน
สูตรคำนวณหาส่วนประกอบโค้งสไปรัล (Spiral curve formula)
สูตรที่ผมเอามาเขียนโปรแกรมเพื่อคำนวณหาส่วนประกอบโค้งสไปรัลมีเพียงเท่านี้
แผนผังแสดงส่วนประกอบโค้งสไปรัล
ถ้าลากโค้งวงกลมผ่านจุด SC มาแตะจุดที่เรียกว่า PCO จุดนี้จะเป็นจุดที่ขนานกับเส้น semi-tangent ระยะทางถ้าวัดตั้งฉากจากปลายเส้นโค้งนี้ไปหาเส้น semi-tangent จะได้ระยะทาง p ถ้าลากขนานกับเส้น semi-tangent ไปหาจุดเริ่มต้นสไปรัล (TS) จะได้ระยะทาง k ดูรูปขยายด้านล่าง
สูตรคำนวณจุดบนเส้นโค้งสไปรัล
การคำนวณหาจุดใดๆบนโค้งสไปรัล จะอาศัยค่าพิกัด X,Y โดยที่แกน X ก็แกนเดียวกับเส้น semi-tangent นั่นเอง อาจจะสงสัยว่าทำไมเรียก semi-tangent หรือเส้นแทนเจนท์ครึ่ง เพราะว่าอีกครึ่งอยู่ที่ PI ไปหา จุดสิ้นสุดโค้งสไปรัล (ST)
ส่วนแกน Y ลากตั้งฉากไปตัดเส้นโค้งสไปรัล เราสามารถหาค่าพิกัด X,Y ได้จากที่ทราบความยาวโค้งสไปรัล (ls) บนจุดใดๆ วัดความยาวตามเส้นโค้งจากจุด TS หรือ ST
มุม theta (?) หาได้จากสมการ ?=ls2/(2*Rc*Ls) สามารถคำนวณหาค่าพิกัด X,Y ได้จากสูตรสมการด้านบน สูตรที่ผมลงมาให้ สามารถคำนวณแก้ปัญหาบนโค้งสไปรัลได้ทั้งหมด ส่วนโค้งวงกลมที่อยู่ตรงกลางนั้นก็ใช้สูตรของโค้งวงกลมได้ธรรมดาอยู่แล้ว
ทดสอบโปรแกรมคำนวณโค้งสไปรัล
ในเครื่องคิดเลข HP Prime โปรแกรมที่เราเขียนสามารถทำเป็นแอพ (App) ได้ สามารถขนไฟล์เช่นไฟล์รูปไปใช้ได้ ผมสร้างไอคอนเป็นรูปเปลือกหอยที่มีเส้นโค้งธรรมชาติเป็นสไปรัล(เครดิตภาพ:wikipedia.com) คลิกเข้าไปจะเข้าสู่โปรแกรม ด้านล่างเป็นเมนูหลัก และจะมีเมนู “Units” อยู่ที่ด้านบนขวา เป็นการตั้งค่าการแสดงผลให้กับหน่วยเมตริกหรือหน่วยฟุต (แต่เมื่อเปลี่ยนหน่วยแล้วจะไม่มีการแปลงตัวเลขให้)
ตั้งค่าหน่วย (Units)
เมื่อคลิกเข้าไปจะเห็นหน้าจอดังนี้ สามารถเลือกหน่วยระยะทางได้ หรือตั้งจำนวนทศนิยมได้ หรือลำดับของค่าพิกดัดในแต่ละประเทศอาจจะใช้นิยมไม่เหมือนกัน บ้านเรานิยมเอาค่า N (North) นำก่อนค่า E (East) เช่น N,E ส่วนบางประเทศนิยม E,N เมื่อตั้งค่าแล้วก็คลิกที่คำว่า “OK” เพื่อปิด
ตัวอย่างที่ 1
ขอยกเอากรณีพิเศษมาทดลองคำนวณก่อนเลยคือโค้งที่มีมุมเบี่ยงเบนกวาดไปมากกว่า 180 องศาในกรณีเป็นทางแยกต่างระดับ (interchange) ลักษณะเป็น loop ramp โดยที่มีมุม ∆ = 270 องศา ในกรณีนี้ค่า T จะมีค่าเป็นลบ จึงถอยมาด้านหลังมาตัดกันตรงจุดเข้าสไปรัลและจุดออกสไปรัล ถ้าเป็นทางแยกต่างระดับจะอยู่กับคนละเลเวลหรือคนละระดับความสูง
เมนูหลักโปรแกรม
จะมีเมนูหลักๆของโปรแกรมคือ “Station”, “Azimuth”, “Elem”, “Resolv”, “Calc” แะล “Quit” การใช้งานจะเริ่มจากซ้ายไปขวา สำหรับหน้าเมนูหลักนี้จะเป็นเครดิตผู้พัฒนาโปรแกรมคือผมเอง จะเริ่มต้นทดลองการใช้งานโดยการเอามือไปแตะที่คำว่า “Station”
ป้อนค่า station และค่าพิกัด
กำหนด station ไว้ที่จุด TS เป็น 0+000 ในกรณี loop ramp แบบนี้จะไม่สามารถกำหนดสถานีที่จุด PI ได้ กำหนดค่าพิกัดของจุด TS เป็น N=5000m, E=2500m คลิกแตะที่ “OK” เพื่อปิดเข้าสู่เมนูหลัก
ป้อนมุมและทิศทางโค้ง
ที่เมนูหลักแตะที่คำว่า “Azimuth” จะเข้าสู่การป้อนมุมที่ทราบค่า ดูรูปโจทย์ด้านบนป้อนค่าดังรูปด้านล่าง โค้งนี้เป็นโค้งเลี้ยวซ้าย
ป้อนรัศมีโค้งวงกลมและความยาวโค้งสไปรัล
ที่เมนูหลักเลือกแตะ “Elem” ย่อมาจาก Elements แปลว่าส่วนประกอบของโค้ง จากนั้นป้อนความยาวโค้งสไปรัล (LS) = 175 m และป้อนรัศมีโค้งวงกลม = 75 m แตะ “OK” เพื่อปิด
คำนวณโค้งเพื่อหาส่วนประกอบโค้งทั้งหมด
ที่เมนูหลักแตะที่คำว่า “Resolv” ย่อมาจาก Resolve หรือแปลว่าคำนวณวิเคราะห์นั่นเอง โปรแกรมจะคำนวณส่วนประกอบโค้งที่เหลือให้ทั้งหมด เช่น ?s, ?c, Ts, Lc, k, p จน chainage และค่าพิกัดสถานีได้แก่ TS, SC, CS, ST หรือ PI สามารถใช้นิ้วจิ้มแตะลากขึ้นลงเพื่อดูค่าเหล่านี้ได้ หรือกดคีย์ลูกศรเพื่อเลื่อนขึ้นลงก็ได้เช่นเดียวกัน แตะที่คำว่า “Close” เพื่อปิด จะกลับมาที่เมนูหลัก
จะสังเกตุเห็นค่า Ts = -7.533 m ค่าติดลบเพราะมุมเบี่ยงเบน = 270 องศา ทำให้เส้น tangent ถอยหลังมาตัดกัน
วาดรูปโค้ง
ที่เมนูหลักแตะที่คำว่า “Calc” จะเห็นเมนูสำหรับงานคำนวณโค้งขึ้นมา จะเห็นไดอะแกรมส่วนประกอบโค้งสไปรัลขึ้นมาให้ดูเพื่อให้เห็นภาพคร่าวๆ คลิกที่เมนู “Plot” เพื่อวาดรูปโค้ง จะเห็นโค้งสไปรัลประกอบเป็นรูปใบโคลเวอร์ ที่ออกแบบให้เป็นทางแยกต่างระดับสำหรับเปลี่ยนทิศทางหรือที่เรียกว่า Loop ramp
เวลาต้องการเลื่อนใช้นิ้วแตะแล้วลากซ้ายขวาขึ้นลงได้ การซูมหรือขยายหรือต้องการย่อ แตะที่เมนู “Zoom+” หรือ “Zoom-” ได้
คำนวณหาจุดบนโค้ง
สำหรับช่างสำรวจสิ่งที่ต้องการในการทำงานคือการเลย์เอ้าท์โค้ง สมัยปัจจุบันการวางจุดนิยมค่าพิกัดเพราะใช้กล้องโททัลสเตชันให้ความสะดวกกว่าสมัยอดีตที่เปิดมุมและดึงระยะด้วยเทป การคำนวณหาค่าพิกัดจาก chainage ที่ต้องการและทำการ offset ไปด้านข้าง
ตอนนี้อยู่ที่เมนูรอง “Sta”, “Interv”, “Info”, “Plot” และ “Exit” แตะไปที่ “Sta” เพื่อคำนวณหาค่าพิกัดจาก chainage 0+400 โดยการป้อนตัวเลข 400 หรือ 0+400 ก็ได้ ต้องการออฟเซ็ตไปทางด้านขวาเป็นระยะทาง 10 เมตร จะได้ค่าพิกัดของจุดออฟเซ็ทเมื่อแตะเมนู “Plot” จะเห็นจุดสีน้ำเงิน
ต่อไปจะคำนวณหาจุดแบบ interval โดยแบ่งโค้งเป็นช่วงๆ ที่เมนูคลิกแตะที่คำว่า “Interv” ย่อมาจาก “Interval” ป้อนค่า 10 เมตร และออฟเซ็ทไปด้านซ้ายเป็นระยะทาง 5 เมตร ป้อนค่าดังรูป จากนั้นโปรแกรมจะคำนวณหาค่าพิกัดให้ จำนวนจุดมากโขอยู่เพื่อแบ่งช่วงแค่ 10 เมตร
คลิก “Close” เพื่อปิดจากนั้นลองคลิกคำว่า “Plot” เพื่อให้โปรแกรมวาดโค้งให้ ตอนแรกยังไม่ค่อยมั่นใจว่าสูตรที่ได้มาจะถูกต้องนัก ผมนำค่าพิกัดไปพล็อทใน Civil3D ที่ขึ้นโค้งสไปรัลมาด้วยพารามิเตอร์เดียวกัน จุดที่คำนวณได้ลงกันเป๊ะพอดี
ตัวอย่างที่ 2
ต่อไปจะเสนอตัวอย่างที่เป็นรูปแบบทั่วๆไป แต่ที่พิเศษหน่อยผมจะเสนอตัวอย่างที่เป็นหน่วยฟุต (หมายเหตุโปรแกรมจะไม่มีการแปลงหน่วยเป็นเมตรให้)
โจทย์กำหนดค่า Degree of curve (D) = 2° ในโปรแกรมจะไม่รองรับ แต่จะรองรับเฉพาะรัศมีโค้งเท่านั้น โดยที่รัศมีโค้งคำนวณได้ดังนี้ จากสูตร D=36000/(2πR) หรือ R=36000/(2πD) = 36000/(4π) = 2864.789′
แบริ่งสำหรับ back tangent กำหนดให้ S13°14’11″W คิดเป็นอะซิมัท 193°14’11” ส่วน forward tangent กำหนดให้ S23°15’5″E คิดเป็นอะซิมัท 156°44’55” ดังนั้นมุมเบี่ยงเบน Δ = 193°14’11” – 156°44’55” = 36°29’16”
ต่อไปจะเป็นการนำข้อมูลไปป้อนรวดเดียวโดยไม่มีการอธิบายรายละเอียดมากนัก เริ่มจากกลุ่ม Station, กลุ่ม Azimuth และ Elements
คำนวณ “Resolve”
วาดรูปโค้งด้วย “Plot”
ลองคำนวณ Interval
ผมสังเกตุว่าค่าพิกัดที่ผมคำนวณได้จะละเอียดกว่าใน sheet ที่ดูจากต้นฉบับที่ผมแนะนำลิ๊งค์ไว้ด้านบนของคุณ Jim Crume สูตรในต้นฉบับน่าจะมีการ round off หรือปัดตัวเลขไปมาก
สรุป
จากที่เขียนโปรแกรมบน HP Prime G2 มาสองโปรแกรม ก็ประทับใจเครื่องคิดเลขมากพอสมควร ภาษา PPL ที่ HP พัฒนามาก็ถือว่าดีในระดับหนึ่งทีเดียว อาจจะมีคำถามว่าสู้ไพทอนได้ไหม ถ้าเอาเฉพาะเครื่องคิดเลขด้วยกัน ผมว่าพอสู้ได้ ภาษา PPL นั้นง่ายคล้ายๆไพทอน มีตัวแปรลิสต์เหมือนกัน อาจจะไม่ดีเท่าไพทอนแต่ก็ดีพอตัว ตัวไลบรารีเอง HP เตรียมทำการบ้านดีครับเรียกใช้ด้วย PPL ได้ทุกแง่ทุกมุมของเครื่องคิดเลข ไม่ว่าจะการวาดรูป ฟังก์ชันคำนวณทางคณิตศาสตร์ ผมมีหลายโครงการจะพอร์ตโปรแกรมหลายๆโปรแกรมมาเครื่องคิดเลข ด้วยที่เครื่อง HP Prime ใช้ซีพียู Arm Cortex A7 ซึ่งก็ไม่ขี้เหร่อยู่แล้วสำหรับเครื่องคิดเลขที่มีความเร็วซีพียู 528 MHz และมีแรม 256 MB ซึ่งสมดุลย์เรื่องความเร็วและแบตเตอรี่ สำหรับงานคำนวณทั่วๆไป ไม่ต้องการอะไรแรงๆเร็วๆนัก และไม่ต้องชาร์จแบตเตอรี่บ่อย
ก็คงต้องพักเรื่องเครื่องคิดเลข HP Prime ไว้แต่เพียงนี้ก่อน ฉบับหน้ามาว่าเรื่องอื่นกัน โปรดติดตามกันตอนต่อไปครับ