Tag: calculator

ติดปีกเครื่องคิดเลขเทพ Casio fx 9860G II SD ด้วยโปรแกรมภาษาซีบน AddIn ตอนที่ 7 โปรแกรมคำนวณโค้งราบ (Horizontal Curve)

ติดปีกเครื่องคิดเลขเทพ Casio fx 9860G II SD ด้วยโปรแกรมภาษาซีบน AddIn ตอนที่ 7 โปรแกรมคำนวณโค้งราบ (Horizontal Curve)

โปรแกรมคำนวณโค้งราบ HCurve สำหรับเครื่องคิดเลข Casio fx-9860 G

ช่วงนี้อยู่ในชุดซีรี่ย์โปรแกรมเครื่องคิดเลข Casio fx-9860G ที่ใช้ไลบรารี MyLib ต่อไปขอนำเสนอโปรแกรมคำนวณโค้งราบ (Simple Horizontal Curve) ตัวโปรแกรมพัฒนาด้วยภาษาซี  ใช้เป็นโปรแกรม AddIn ดังรูปด้านล่าง

โปรแกรม HCurve คำนวณโค้งราบ (Simple Horizontal Curve)

องค์ประกอบของโค้งราบ (Elements of Horizontal Curve)

องค์ประกอบของโค้งราบ (Elements of Curve)

คำนิยาม (Abbrivations)

R – Radius คือรัศมีของโค้งราบ รัศมีจะตั้งฉากกับเส้นสัมผัสวงกลมเสมอ

PC –  Point of Curvature คือจุดเริ่มต้นโค้ง บางครั้งเรียกว่า BC (beginning of curve) หรือ TC (tangent to curve)

PI – Point of Intersection คือจุดตัดของ tangent 2 เส้น

PT – Point of Tangency คือจุดสิ้นสุดโค้ง บางครั้งเรียกว่า EC (end of curve) หรือ CT (curve to tangent)

POC – Point of Curve คือจุดบนโค้งในตำแหน่งใดก็ตาม

L – Length of Curve คือความยาวโค้งวัดตามโค้งจากจุด PC ไปจุด PT

T – Tangent Distance หรือ Tangent Length คือเส้นตรงที่สัมผัสโค้งวัดจากจุด PC ไปจุด PI หรือวัดจาก จุด PI ไปจุด PT

คุณสมบัติของโปรแกรม

โค้งราบ (Simple Horizontal Curve) ในงานสำรวจใช้ในงานสำรวจเพื่อการก่อสร้าง (Construction Survey) โดยที่ให้ตำแหน่ง (Setting out) งานก่อสร้างถนน ทางรถไฟ ผู้ใข้ป้อนข้อมูลองค์ประกอบของโค้งราบที่โปรแกรมต้องการจนครบ โปรแกรมสามารถคำนวณองค์ประกอบโค้งที่เหลือและสามารถคำนวณค่าพิกัดบนเส้น Center line หรือกระทั่งสามารถ offset ไปด้านซ้ายหรือด้านขวาก็ได้เช่นเดียวกัน สามารถคำนวณค่าพิกัดแบบทุกช่วงระยะ (interval) ให้ค่าพิกัดออกมาเป็นบัญชีรายการได้ โปรแกรมนี้ออกแบบและพัฒนามาเพื่อช่วยช่างสำรวจให้สามารถนำโปรแกรมไปตรวจสอบข้อมูลโค้งราบได้ด้วยตัวเอง

ในปัจจุบันการวางโค้งในสนาม ไม่ได้ถูกจำกัดเช่นสมัยแต่ก่อนเนื่องจากเครื่องมือเช่นอุปกรณ์กล้องสำรวจ Total Station ทันสมัยสามารถให้ตำแหน่งจากค่าพิกัดได้เลย ไม่เหมือนสมัยแต่ก่อนที่มีแต่กล้อง Theodolite และเทปวัดระยะ ที่การวางโค้งต้องอาศัยการตั้งกล้องที่จุด PC หรือ PI หรือแม้กระทั่ง PT แล้วทำการเปิดมุมและดึงเทปไปตามคอร์ด ปัจจุบันไม่ต้องทำอย่างนั้นแล้ว สามารถตั้งกล้องที่ไหนก็ได้ที่สะดวก

ก็เนื่องจากความทันสมัยของกล้อง Total Station นี้เอง ในอนาคตไม่ไกลการโอนข้อมูลจากกล้องไปที่ออฟฟิศหรือจากออฟฟิศไปที่กล้องจะเป็นเรื่องธรรมดามากผ่านทางออนไลน์ ซึ่งเรื่องนี้ข้อดีก็มีมากมาย แต่ข้อเสียที่เกิดขึ้นคือช่างสำรวจจะมีเวลาใช้สมองคิดเรื่อง geometry น้อยลงเพราะโปรแกรมบนกล้องทำให้หมด ทำให้ขาดการฝึกฝนทักษะในด้านนี้ ซึ่งผมคิดว่าอาจจะทำให้คุณภาพของบุคลากรด้านสำรวจของเราด้อยลงในอนาคต ดังนั้นการใช้เครื่องคิดเลขมาช่วยอาจจะช่วยฝึกฝนทักษะได้บ้างในจุดนี้

ดาวน์โหลดโปรแกรม (Download)

ไปที่หน้าดาวน์โหลด มองหาโปรแกรมคำนวณโค้งราบ ไฟล์ชื่อ “HCURVEEX.G1A” เมื่อดาวน์โหลดมาแล้วโอนเข้าเครื่องคิดเลขผ่านทางโปรแกรม FA-124 หรือ SD Card

ใช้งานฟรี (Freely Usable)

ก็ยังเหมือนเดิมไม่ว่าจะโปรแกรมบนเครื่องคอมพิวเตอร์หรือบนเครื่องคิดเลข คือให้ใช้งานได้ฟรี

เริ่มต้นใช้งาน

ที่เครื่องคิดเลขกดคีย์ “Menu” เพื่อเข้าสู่หน้า AddIn หรือ  Main Menu ของเครื่องคิดเลข เลื่อนลูกศรลงไปด้านล่างๆจะเห็นไอคอนของโปรแกรมดังรูปด้านล่าง กดคีย์ “EXE” เพื่อเข้าสู่โปรแกรม

จะเห็นหน้าเมนูหลักของโปรแกรมดังนี้

ก็เหมือนโปรแกรมคำนวณโค้งดิ่ง (VCurve) ที่ผ่านมาคือมีเมนูย่อยเรียงจากซ้ายไปขวา สัมพันธ์กับการกดคีย์ F1-F6 เรียงกันไป

เมนูหลัก (Main Menu)

F1 (Know) – Known สำหรับป้อนจุดที่ทราบค่า station และค่าพิกัด

F2 (Angl) – Angle สำหรับป้อนที่เกี่ยวกับมุมเช่น back tangent azimuth และมุมเบี่ยงเบน (Deflection Angle) ตลอดจนถึงทิศทางของโค้ง (Curve Direction)

F3 (Elem) – Elements สำหรับป้อนองค์ประกอบของโค้งเช่นรัศมีหรือความยาวโค้าง

F4 (Info) – Information สำหรับคำนวณหาข้อมูลพื้นฐานของโค้งทั้งหมด

F5 (Calc) – Calculate สำหรับคำนวณหาค่าพิกัดโค้งได้หลายรูปแบบเช่นกำหนดสถานี ระยะ offset ตลอดจนคำนวณจากช่วงระยะทาง (interval) ที่กำหนดให้

F6 (Exit) – Exit ออกจากโปรแกรม

ตัวอย่างการคำนวณโค้งราบ (Example)

มาดูวิธีการใช้งานจากตัวอย่างจะเข้าใจง่ายที่สุด

เลือกและป้อนสถานีที่ทราบและค่าพิกัด (Known Station and Know Coordinates)

ที่เมนูหลักกดคีย์ F1 (Know) แก้ไขค่าตามโจทย์ตัวอย่างที่ 1 ดังนี้

ในที่นี้สถานีและค่าพิกัดกำหนดที่จุด PI ทั้งคู่ เมื่อป้อนค่าเสร็จแล้วกดคีย์ F6 (OK) เพื่อออก

เลือกป้อนมุมอะซิมัทและมุมเบี่ยงเบน(Known Tangent and Deflection Angle)

ที่เมนูหลักกดคีย์ F2 (Angl) เพื่อเลือกอะซิมัทของเส้นสัมผัสที่ทราบค่าและมุมเบี่ยงเบน ตลอดจนป้อนทิศทางของโค้งราบว่าเลี้ยวซ้ายหรือเลี้ยวขวา จากตัวอย่างเลือกและป้อนค่าดังนี้

เสร็จแล้วกดคีย์ F6 (OK) เพื่อจัดเก็บค่าและออก

ป้อนองค์ประกอบโค้งราบ (Elements of Curve)

ที่เมนูหลักกดคีย์ F3 (Elem)  เลือกว่าจะป้อนค่ารัศมีโค้ง (Radius) หรือว่าความยาวโค้ง (Length of Curve) ในที่นี้เลือกรัศมีโค้งและป้อนค่า 201.950 เมตร

คำนวณหาข้อมูลพื้นฐานโค้งราบ (Curve Information)

ที่เมนูหลักกดคีย์ F4 (Info)

แสดงองค์ประกอบของโค้งและข้อมูลพื้นฐาน ค่าพิกัดของจุด PC, PI และ PT ตลอดจนจุดศูนย์กลางของโค้ง เนื่องจากจอภาพมีขนาดเล็กดังนั้นใช้การกดคีย์ F1 (PgUp) หรือ F2 (PaDn) เพื่อเลื่อนดูหน้าก่อนหน้านี้หรือหน้าถัดไป กดคีย์ F6 (Done) เพื่อออก

การคำนวณโค้งราบ (Horizontal Curve Calculation)

ที่เมนูหลักกดคีย์ F5 (Calc)จะเห็นเมนูย่อยอีกเมนูคือเมนูสำหรับคำนวณโค้งราบ

จะมีเมนูดังนี้

F1 (Sta) – Station คำนวณหาค่าพิกัดเมื่อกำหนดสถานี

F2 (INT) – Interval คำนวณหาค่าพิกัดสถานีเมื่อกำหนดช่วงระยะทาง (Interval) ให้

F4 (Info) – Information คำนวณข้อมูลพื้นฐานโค้งราบ โดยที่ผลลัพธ์เหมือนกับเมนู Info บนเมนูหลัก

F5 (Plot) – Plot Curve วาดรูปร่างโค้งราบ

F6 (Done) ออกจากเมนูคำนวณโค้งราบ

คำนวณหาค่าพิกัดเมื่อกำหนดสถานี (Calculate Coordinates of Station)

ที่เมนูคำนวณโค้งราบกดคีย์ F1 (Sta) จะมีไดอะล็อกให้ป้อนสถานี ตัวอย่างนี้ต้องการทราบค่าพิกัดของสถานี 17+200 โดยที่ offset ไปด้านซ้าย 8 เมตร ป้อนข้อมูลดังรูป ถ้าไม่ต้องการคำนวณหรือเก็บข้อมูลที่ป้อนก็กดคีย์ F5 (Canc) เพื่อ Cancel ออกไป หรือต้องการเก็บค่าแต่ไม่คำนวณก็กดคีย์ F6 (OK) ออกไป ถ้าต้องการคำนวณก็กดคีย์ F1 (Calc) จะได้ผลลัพธ์ดังรูปถัดไป กดคีย์ “EXE” เพื่อออก

คำนวณหาค่าพิกัดสถานีแบบกำหนดช่วงระยะทาง (Interval Calculation)

ที่เมนูคำนวณโค้งกดคีย์ F2 (INT) ในที่นี้ต้องการคำนวณทุกๆระยะ 25 เมตร โดยคำนวณในแนว Center Line (ไม่มีการ offset ไปซ้ายหรือขวา) กดคีย์ F1 (Calc) เพื่อคำนวณ

จะได้ผลลัพธ์ เริ่มตั้งแต่ PC (17+151.314), Sta 17+175, Sta 17+200, Sta 17+225, Sta 17+250, Sta 7+275, Sta 17+300 และสุดท้ายที่ PT (17+313.794) กด F1 (PgUp) เพื่อเลื่อนไปหน้าก่อนหน้านี้ และกด F2 (PgDn) เพื่อไปดูหน้าถัดไป กด F6 (Done)

 

วาดรูปโค้งราบ (Plot Curve)

จากเมนูคำนวณโค้งราบ กดคีย์ F5 (Plot) จะมีเมนูย่อยลงไปอีกสำหรับย่อ F1 (Z-) ขยาย F2 (Z+) ดึงรูปไปด้านซ้าย F3 (Lt) ดึงรูปไปด้านขวา F4 (Rt) กดคีย์ F5 (>) เพื่อไปเมนูย่อยอีกเมนูด้านขวา เมนูด้านขวาจะมีดึงรูปลง F1 (Dn) หรือดึงรูปขึ้น F2 (Up) กดคีย์ F6 (Exit) เพื่อออกจากเมนู

ก็อย่างว่าเครื่องคิดเลขรุ่นนี้เป็นจุดภาพ (pixel) บนจอภาพ ไม่ใช่จอภาพแบบโทรศัพท์มือถือในปัจจุบันที่มีความละเอียดสูง ข้อเสียคือแสดงภาพความละเอียดสูงไม่ได้ แต่ข้อดีไม่เปลืองแบตเตอรี สังเกตว่าแค่ถ่าน AAA สามก้อนใช้กันจนลืมครับ ดังนั้นก็ดูรูปโค้งพอให้เกิดจินตนาการว่าโค้งวางตัวในลักษณะไหน เวลาไปอยู่หน้างานจะได้วางภาพในใจได้

ติดปีกเครื่องคิดเลขเทพ Casio fx 9860G II SD ด้วยโปรแกรมภาษาซีบน AddIn ตอนที่ 6 โปรแกรมคำนวณโค้งดิ่ง (Vertical Curve)

ติดปีกเครื่องคิดเลขเทพ Casio fx 9860G II SD ด้วยโปรแกรมภาษาซีบน AddIn ตอนที่ 6 โปรแกรมคำนวณโค้งดิ่ง (Vertical Curve)

ประเภทลักษณะของโค้ง (Type of Curve)

โค้งในงานถนน งานรถไฟมีสองแบบคือโค้งราบ (Horizontal Curve) และโค้งดิ่ง (Vertical Curve) โค้งราบเป็นตัวกำหนดรูปรางและทิศทางของถนนในแนวราบ ส่วนโค้งดิ่งเป็นโค้งที่รองรับลักษณะภูมิประเทศขึ้นๆลงๆ การออกแบบโค้งสำหรับงานวิศวกรรมงานถนนนั้นเพื่อให้มีความปลอดภัยต่อยวดยานผู้ขับขี่ตลอดทั้งผู้โดยสาร

ประเภทโค้งดิ่ง (Type of Vertical Curve)

โค้งดิ่งจะแบ่งเป็นเส้นโค้งพาราโบลา (Parabola Vertical Curve) ลักษณะนี้จะเป็นโค้งที่นิยมกันมากที่สุดในโลกนี้แทบจะว่า 99% ก็ได้เพราะเวลารถยนต์หรือรถไฟเข้าโค้งนี้จะมีความนุ่มนวลมากที่สุด และเส้นโค้งประเภทต่อไปคือเส้นโค้งวงกลม (Circular Vertical Curve) ตามที่ได้ยินมาคือโค้งวงกลมนี้จะมีความสบายและความนุ่มนวลน้อยกว่าเส้นโค้งพาราโบลา จึงมีความนิยมน้อยกว่า ผมค้นหาในเว็บโดยใช้เสิร์ชเอนจิ้นปรากฎว่าเจอแค่เว็บเดียวที่เป็นเอกสาร PDF อธิบายสูตร คิดดูแล้วกันครับว่ามันใช้กันน้อยขนาดไหน ถึงแม้จะใช้กันน้อยมากแต่ผมก็มีโอกาสได้ใช้โค้งดิ่งแบบวงกลมนี้ในโครงการรถไฟฟ้าที่บังคลาเทศ แต่แปลกแต่จริงสำหรับรถไฟความเร็วสูงกลับนิยมใช้โค้งดิ่งแบบวงกลมมากกว่าพาราโบลา ซึ่งใช้รัศมีที่ใหญ่มากประมาณ10 กม.ขึ้นไป

ลักษณะของโค้งดิ่งจะมี 2 ลักษณะคือ โค้งหงาย (Sag Curve) และโค้งคว่ำ (Crest Curve)

โค้งทางดิ่ง (vertical Curve) แบบโค้งคว่ำ (Crest Curve) เครดิตภาพ wikibooks.org

ออกแบบโปรแกรมใหม่ (New Design)

ถ้าลองใช้โปรแกรมเครื่องคิดเลข Casio fx-9860G ที่ผมปล่อยฟรีมาก่อนหน้านี้ ระบบการติดต่อผู้ใช้จะเป็นลักษณะจากบนลงล่างคือเปิดโปรแกรมมาแล้ว โปรแกรมจะถามค่าตัวแปร เมื่อผู้ใช้ป่อนค่าลงไปจนครบ ต่อไปจะเป็นการนำค่าตัวแปรเหล่านี้มาคำนวณและแสดงผลให้ทราบ วิธีการดีตรงที่ตรงไปตรงมา ผู้ใช้จะถูกบังคับให้ป้อนค่าตามที่โปรแกรมต้องการจนครบ แต่ข้อเสียเมื่อต้องการคำนวณอีกครั้งในกรณีป้อนค่าผิดต้องการป้อนใหม่ จะต้องเรียกโปรแกรมมาอีกครั้งตั้งแต่ต้น ทำให้เสียเวลามากเกินไป จนในที่สุดก็ต้องหาตัวช่วยมาช่วยและก็ได้พบกับไลบรารี MyLib

ไลบรารี MyLib

ผมมีโอกาสได้เห็นโปรแกรมเครื่องคิดเลข HP 50g จากเว็บไซต์ที่ทางฝั่งผู้พัฒนาจากแคนาดาชื่อ Simple Geospatial Solution โปรแกรมนี้ไม่ฟรีต้องเสียเงินซื้อ ผมลองดูรูปแบบแล้วน่าสนใจ เลยกลายเป็นแรงบันดาลใจ หน้าตาประมาณรูปด้านล่าง

โปรแกรมสำรวจบนเครื่องคิดเลข HP 50g

หันมามองฝั่งเครื่องคิดเลข Casio fx-9860G ผมได้เจอคนเขียนไลบรารีเล็กๆชื่อ MyLib จากผู้ใช้นามว่า  hayzel ปล่อยซอร์สโค้ดภาษาซีออกมาด้วย ไลบรารีนี้สามารถนำมาเขียนเมนูเพื่อติดต่อกับผู้ใช้งาน และสามารถสร้างไดอะล็อกเพิ่อป้อนข้อมูลได้ และมีโค้ดสำหรับช่วยในการวาดรูปอีกนิดหน่อย ผมดูโค้ดแล้ว ถ้าให้ผมเขียนเองคงทำไม่ได้แน่ แต่ถ้าจะแกะเอามาใฃ้ก็เป็นงานถนัดไม่เหลือบ่ากว่าแรง ก็ต้องยกเครดิตและขอขอบคุณผู้เขียนไลบรารีนี้ ไม่มีไลบรารีนี้ก็ไม่มีโปรแกรมนี้

รูปแบบการติดต่อผู้ใช้ (User Interface)

รูปแบบการติดต่อผู้ใช้ ผมเขียนโปรแกรมโดยที่ออกแบบเมนูเล็กๆเรียงจากซ้ายไปขวาวางด้านล่างหน้าจอ  วิธีการนี้ผู้ใช้จะแก้ไขข้อมูลตรงไหนก็สามารถเลือกเมนูเข้าไปแก้ไขได้ การเลือกเมนูในเครื่องคิดเลขก็สามารถทำได้ง่ายด้วยการกดคีย์ F1-F6 เรียงกันไป

ไลบราาี MyLib บนเครื่องคิดเลข Casio fx-9860G

ใช้งานได้ฟรี (Free to use)

ก็ยังเหมือนเดิมคือให้ใช้งานได้ฟรีไม่มีค่าใช้จ่ายและเพื่อช่วยเหลือวงการสำรวจบ้านเราเล็กๆน้อยๆตามกำลังที่ผมมีอยู่ โปรแกรมขนาดนี้ประมาณ 800-1000 บรรทัดดูมากสำหรับเครื่องคิดเลข แต่ถ้าเทียบกับโปรแกรมบนเครื่องคอมพิวเตอร์ถือว่าเล็กจิ๊บๆมาก

คำนิยาม (Abbreviations)

สำหรับโค้งดิ่งจะมีคำนิยามคำย่อ ที่บางตำราอาจจะเรียกแตกต่างกัน

BVC – Begin of Vertical Curve – จุดเริ่มโค้ง(บางทีเรียก PVC – Point of Vertical Curve)
PVI – Point of Vertical Intersection – จุดตัดแนวดิ่ง
EVC – End of Vertical Curve  – จุดสุดโค้ง(บางทีเรียกว่า PVT – Point of Vertical Tangent)
L – Length of Curve – ความยาวโค้ง
R – Radius – รัศมีโค้ง ใช้ในโค้งดิ่งแบบวงกลม(Circular Vertical Curve) เท่านั้น
g1 – Grades of Tangents (%) – ความชันด้านสัมผัสที่ผ่านจุด BVC/PVC
g2 – Grades of Tangents (%) – ความชันด้านสัมผัสที่ผานจุด EVC/PVT

ดาวน์โหลดโปรแกรม (Download)

ไปที่หน้าดาวน์โหลด มองหาโปรแกรมสำหรับเครื่องคิดเลข Casio fx-9860G แล้วทำการดาวน์โหลดจะได้ไฟล์ VCURVEEx.G1A ทำการติดตั้งลงเครื่องคิดเลขด้วยโปรแกรม FA-124 หรือ copy ผ่าน SD Card ก็ได้

วิธีการใช้งานโปรแกรม (How to Use)

ที่เครื่องคิดเลขกดคีย์ “Menu” จะเห็นโปรแกรม AddIn ขึ้นมาใช้คีย์ลูกศรกดไปจนพบกับไอคอนโปรแกรมดังรูป กดคีย์ “EXE” เพื่อรันโปรแกรม

เมนูหลัก (Main Menu)

จะเห็นเมนูโปรแกรมเรียงรายจากซ้ายมาขวาอยู่ที่ด้านลางของจอภาพ แต่ละเมนูจะสัมพันธ์กับคีย์ F1 ,F2, F3, F4, F5 และ F6 

เมนูหลัก (main menu)

Type – Curve Type – เลือกประเภทโค้งดิ่ง (F1)

Know – Known Station – เลือก Station ที่กำหนดค่าระดับ (F2)

Elem – Elements of Curve – ป้อนค่าส่วนประกอบของโค้ง (F3)

Info – Curve Information – แสดงข้อมูลโค้ง (F4)

Calc – Calculate – คำนวณโค้งเพื่อหาสถานี ค่าระดับ (F5)

Exit – Exit Program – ออกจากโปรแกรม (F6)

ตัวอย่างที่ 1 โค้งดิ่งแบบพาราโบลา (Example 1 – Parabola Curve)

ลักษณะโค้งดิ่ง (Vertical curve diagram)

ลักษณะเป็นโค้งหงาย (Sag Curve) ความยาวโค้ง 200 เมตร ต้องเตือนใจกันลืมนิดหนึ่งความยาวโค้งดิ่งที่ระบุมานั้นเป็นความยาวในแนวราบ  (ไม่ใช่ระยะทางวัดไปตามความยาวโค้ง)

เลือกประเภทโค้งดิ่ง

จากเมนูหลักเลือกกดคีย์ F1 (Type) จะเป็นการเลือกประเภทของโค้ง จะเห็น Dropdown List

เมนูหลัก (main menu)
ประเภทโค้งดิ่ง (Curve type)

กดคีย์ “EXE” เพื่อเลือก จะเห็นมีสองทางเลือกคือลักษณะเป็นโค้งดิ่งแบบวงกลม (Circular) กับโค้งดิ่งแบบพาราโบลา สามารถใช้คีย์ลูกศรเลื่อนขึ้นลงเพื่อเลือกได้ ในที่นี้เราเลือก “Parabola” ด้วยการกดคีย์ “EXE” เมื่อเสร็จแล้วกดคีย์ F6 (OK) เพื่อยืนยัน ถ้าต้องยกเลิกก็กดคีย์ F5(Canc)

เลือกสถานีที่ทราบค่าระดับ (Known Station)

กลับมาเมนูหลักกดคีย์ F2 (Know) จะเห็นจอภาพเครื่องคิดเลขดังรูปด้านล่าง

กำหนดสถานีที่ทราบค่า (Known station)

ตรง “Known” สามารถเลือกได้ว่าต้องการกำหนดค่าระดับที่สถานีไหน จะมีให้เลือก 3 อย่างคือ BVC/PVI/EVC เลื่อนคีย์ลูกศรขึ้นลงแล้วกดคีย์ “EXE” ตามตัวอย่างนี้เลือก “PVI

 

จากนั้นเลื่อนค่าลงไปที่ Station กดคีย์ “EXE” โปรแกรมจะแสดงไดอะล็อกให้ป้อนค่าสถานีลงไปตามตัวอย่างนี้ป้อน Station : 1000 ดังรูปด้านล่าง

และเลื่อนลูกศรไปป้อนค่า Elevation = 50 เมตรเข้าไป เสร็จแล้วกดคีย์ F6 (OK) เพื่อยืนยัน

ป้อนข้อมูลองค์ประกอบของโค้งดิ่ง (Elements of Vertical Curve)

ที่เมนูหลักกดคีย์ F3 (Elem) 

องค์ประกอบของโค้งจะประกอบไปด้วยความยาวโค้ง (L – Length of Curve), ความชันของเส้นสัมผัสด้านเข้าโค้ง (g1 – Entry Grade) และความชันของเส้นสัมผัสด้านออกโค้ง (g2 – Exit Grade) ป้อนข้อมูลตามรูปด้านบนโดยที่ L = 200 m, g1 = -2 % และ g2 = 3%

คำนวณโค้งหาข้อมูลพื้นฐาน (Curve Information)

ที่เมนูหลักกดคีย์ F4 (Info) โปรแกรมจะคำนวณข้อมูลพื้นฐานของโค้งมาให้  และแสดง station/elevation ของจุดต่ำสุดและสูงสุดของโค้งมาให้ด้วย

คำนวณโค้งหาระยะทางและค่าระดับ

ที่เมนูหลักกดคีย์ F5 (Calc) จะเห็นเมนูคำนวณโค้งดิ่ง

Elev? – Elevation? – คำนวณหาค่าระดับเมื่อทราบระยะทางหรือสถานี

Sta? – Station? – คำนวณหาระยะทางหรือสถานีเมื่อทราบค่าระดับ

INT – Interval – คำนวณหาระยะทางหรือสถานีและค่าระดับเมื่อกำหนดช่วงระยะทางให้

Info – Curve Information – คำนวณหาข้อมูลพื้นฐานโค้งดิ่ง

Plot – Plot Curve – วาดรูปโค้งดิ่ง

Done  – ออกจากเมนูคำนวณโค้ง

คำนวณหาค่าระดับ (Calculate Elevation)

ในกรณีทราบระยะทางหรือสถานีต้องการหาค่าระดับเช่นในภาคสนามต้องการ stake out สามารถคำนวณได้ ที่เมนูคำนวณโค้งดิ่ง กดคีย์ F1 (Elev?) ป้อนค่า 920 (0+920) ลงไป การป้อนสถานี้ให้ป้อนเป็นหน่วยเมตรไปก่อน รุ่นหน้าจะสามารถป้อนในลักษณะ 0+920 ได้ เมื่อป้อนเสร็จแล้วกดคีย์ F6 (OK) เพื่อยืนยัน

กดคีย์ F1 (Calc) เพื่อทำการคำนวณ จะได้ค่าระดับ 51.650 เมตร ดังรูปด้านล่าง

คำนวณหาสถานี (Calculate Station)

ในกรณีทราบค่าระดับต้องการคำนวณหาระยะทางหรือสถานี ที่เมนูคำนวณโค้งกดคีย์ F2 (Sta?) 

ป้อนค่า 51.5 เมตร กดคีย์ F1 (Calc) จะได้คำตอบเป็นสถานี 2 สถานีเพราะว่าเป็นโค้งหงายที่ค่าระดับเดียวกันคือ 51.5 เมตรถ้าลากเส้นตรงจะตัดผ่าน 2 สถานีคือสถานี 931.010 (0+931.010) และสถานี 1028.990 (1+028.990)

กำหนดช่วงห่างระยะทางคำนวณหาสถานีและค่าระดับ (Interval Calculation)

เมื่อกำหนดช่วงห่างระยะทาง (Interval) ต้องการหาระยะทาง(สถานี)และค่าระดับ ที่เมนูคำนวณโค้งดิ่งกดคีย์ F3 (INT) ตัวอย่างต้องการทราบระยะทางและค่าระดับทุกๆ 10 เมตร ป้อน 10.0 ดังรูป

กดคีย์ F1 (Calc) เพื่อทำการคำนวณจะได้ผลลัพธ์ออกมา ผลลัพธ์อาจจะมีหลายหน้าถ้าช่วงห่างระยะทางมีค่าน้อยๆ

กดคีย์ F2 (PgDn – Page Down) เพื่อดูหน้าถัดไป

ต้องการดูหน้าก่อนหน้านี้ก็กดคีย์ F1 (PgUp – Page Up) หรือกด F6 (Done) เพื่อออก

แสดงรูปรางของโค้งดิ่ง (Plot Curve)

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

ที่เมนูโค้งดิ่งกดคีย์ F5 (Plot) จะเห็นรูปร่างของโค้งดิ่งแสดงให้เห็นพอหอมปากหอมคอ (หมายเหตุ สเกลแนวราบแนวดิ่งอาจจะไม่เท่ากัน)


กดคีย์ F6 (Done) เพื่อออก

ตัวอย่างที่ 2 โค้งดิ่งแบบวงกลม (Example 2 – Circular Vertical Curve)

ก็จะขอไปแบบรวบรัดรูปเยอะๆ ภาพเครื่องคิดเลขอาจจะดูแปลกตานิดเพราะผมจับภาพจากเครื่องมือเขียนโปรแกรมบนเครื่องคอมพิวเตอร์

เลือกลักษณะของโค้งดิ่ง

เมนูหลัก กดคีย์ F1 (Type)
เลือกลักษณะโค้งดิ่ง กดคีย์ “EXE”
เลือกโค้งดิ่งแบบวงกลม (Circular)

กด F6 (OK) ออกไปหน้าเมนูหลัก

เลือกสถานีที่ทราบค่าระดับ (Known Station)

เมนูหลัก กดคีย์ F2 (Know)
ป้อนค่าสถานีและค่าระดับที่ทราบค่า

กดคีย์ F6 (OK) เพื่อออกกลับมาเมนูหลัก

ป้อนข้อมูลองค์ประกอบของโค้งดิ่ง (Elements of Vertical Curve)

เมนูหลัก กดคีย์ F3 (Elem)
ที่ Known: เลือก “Radius” ป้อนค่ารัศมีโค้งและค่าความชัน

กดคีย์ F6 (OK) เพื่อออกเข้าเมนูหลัก

คำนวณโค้งหาข้อมูลพื้นฐาน (Curve Information)

เมนูหลัก กดคีย์ F4 (Info)
องค์ประกอบของโค้งดิ่ง

กดคีย์ F6 (Done) เพื่อออกเข้าเมนูหลัก

เมนูหลัก กดคีย์ F5 (Calc)

กำหนดช่วงห่างระยะทางคำนวณหาสถานีและค่าระดับ (Interval Calculation)

เข้ามาเมนูคำนวณโค้งดิ่ง

กำหนดช่วงห่างระยะทางคำนวณหาสถานีและค่าระดับ (Interval Calculation)

ป้อนค่า  interval 5.0 เมตร เพื่อต้องการหาค่าสถานีและค่าระดับทุกๆ 5 เมตร

ป้อนค่า Interval กดคีย์ F1 (Calc)

กดคีย์ F1 (PgUp) เพื่อเลื่อนขึ้นไปหนึ่งหน้าหรือกดคีย์ F2 (PgDn) เพื่อเลื่อนไปหน้าถัดไป หรือกดคีย์ F6 (Done)  ออกมาเมนูคำนวณโค้งดิ่ง

 

แสดงรูปรางของโค้งดิ่ง (Plot Curve)

เมนูคำนวณโค้งดิ่ง

กดคีย์ F5 (Plot) เพื่อแสดงรูปร่างของโค้งดิ่ง

รูปร่างโค้งดิ่งแบบวงกลม

อยากจะบอกว่าโปรแกรมที่ปล่อยให้ดาวน์โหลดมาก่อนหน้านี้ ผมจะรื้อมาเขียนใหม่ โดยใช้ไลบรารี MyLib ตัวนี้ เพราะว่าทำให้โปรแกรมใช้งานได้ง่ายขึ้นในแง่ที่สามารถแก้ไขค่าตัวแปรของโค้งและสามารถคำนวณใหม่ได้ตามที่ต้องการ ติดตามกันต่อไปครับ ตอนหน้าจะเป็นโปรแกรม Horizontal Curve ครับ

ติดปีกเครื่องคิดเลขเทพ Casio fx 9860G II SD ด้วยโปรแกรมภาษาซีบน AddIn ตอนที่ 5 โปรแกรมคำนวณ Resection ด้วยอัลกอริทึ่มสมัยใหม่

ติดปีกเครื่องคิดเลขเทพ Casio fx 9860G II SD ด้วยโปรแกรมภาษาซีบน AddIn ตอนที่ 5 โปรแกรมคำนวณ Resection ด้วยอัลกอริทึ่มสมัยใหม่

การเล็งสกัดย้อน (Resection) และความเป็นมา

ในที่สุดก็มาถึงตอนที่ 5 ตอนที่ผมใช้เวลามากที่สุดในการ implement อัลกอริทึ่มที่ใช้คำนวณปัญหา Resection จาก 3 จุดที่กำหนด (Three Points Resection Problem) เป็นที่ทราบกันดีว่าการคำนวณ Resection นั้นนักคณิตศาสตร์ได้คิดค้นกันมาหลายร้อยปีแล้ว มีอัลกอริทึ่มรวมๆกันไม่น้อยกว่า 500 อัลกอริทึ่ม แต่บางอัลกอริทึ่มนั้นอายุเก่าแก่มากใช้การคำนวณหาด้วยการวาดลงบนกระดาษ ถ้าจะคัดออกมาจริงๆที่ใช้กันในปัจจุบันมีประมาณ 18 อัลกอริทึ่มหลักๆ และสามารถนำมา implement เป็นโปรแกรมในคอมพิวเตอร์ได้ ก่อนจะไปต่อกันลึกๆมาดูกันว่า Resection คืออะไร

การเล็งสกัดย้อน(Resection) คือการวัดพิกัดจุดตั้งกล้องจากสถานีที่ทราบค่าพิกัด 3 สถานี ตามตัวอย่างได้แก A, B และ C และวัดมุมราบคือมุม α และ β ตามลำดับ

ผมคนรุ่นเก่ายังทันเครื่องมือวัดมุม Sextant ผมทัน Sextant นี้ในช่วงทำงานใหม่ๆ โดยที่ลงเรือไปในทะเลกับพี่ๆช่างสำรวจของกรมเจ้าท่า ตอนนั้นเพิ่งเรียนจบมาใหม่ ยุคนั้น GPS/GNSS ยังไม่เป็นที่รู้จัก การวัดตำแหน่งของเรือสำรวจใช้เครื่องมือ Sextant ที่อาศัยหลักการของ Resection มาประยุกต์ใช้ บนเรือสำรวจจะมีเจ้าหน้าที่ 2 คน คนแรกจะส่องสถานี A และ B เพื่อวัดมุม α และคนที่สองจะส่องสถานี B และ C เพื่อวัดมุม β สองคนนี้ตามหลักการแล้วต้องขี่คอกันแต่จริงๆคงไม่มีใครทำเพียงแต่นั่งใกล้ๆกัน การใช้ Sextant วัดตำแหน่งเรือต้องอาศัยความชำนาญอย่างสูง เพราะเรือไม่อยู่นิ่งกับที่เพราะคลื่มลม จะปะทะให้เคลื่อนไหวตลอดเวลา

เมื่อการวัดมุมเสร็จสิ้นลงทั้งสองคนจะจดค่ามุม ∝ และ ∅ พร้อมๆกัน การใช้ Sextant ควบคู่ไปกับกับใช้เครื่องมือวัดความลึกของท้องน้ำจำพวก Echo sounder งาน post processing ในออฟฟิศได้แต่การนำค่ามุม α และ β มาคำนวณหาค่าพิกัดแตละจุด จากนั้นก็จัดทำแผนที่แสดงความลึกของแม่น้ำหรือทะเลในบริเวณที่ทำการสำรวจ ถึงแม้กระนั้นเครื่องมือ Sextant จะให้ค่าความละเอียดด้านมุมไม่ดีนัก แต่ค่าพิกัดที่ได้สมัยนั้นก็เพียงพอสำหรับงานในทะเลหรือแม่น้ำ

หัวข้อต่อๆไปจะกล่าวถึงที่ไปที่มาของสูตรที่ผมใช้สำหรับเครื่องคิดเลข fx-9860G ถ้าผู้อ่านไม่สนใจก็ข้ามไปที่การใช้โปรแกรมเครื่องคิดเลขด้านท้ายๆเลยครับ

หลักการคำนวณ Resection

อัลกอริทึ่มที่ผมกล่าวไปนั้นตั้งแต่ยุคอดีตกาลนั้นมากกว่า 500 อัลกอริทึ่ม แต่ส่วนใหญ่แล้วอาศัยหลักการคล้ายๆกันคือใช้หลักวงกลมสามวงตัดกันที่จุด P วงแรกจะลากผ่านจุด A-P-B วงที่สองลากผ่านจุด B-C-P วงที่สามลากผ่าน C-P-A ดังรูปด้านล่าง

ภาวะเอกฐาน (Singularity) ที่อัลกอริทึ่มล้มเหลว

ผมขอยืมคำแปล Singularity ที่แปลว่าภาวะเอกฐานจากเรื่องหลุมดำในทฤษฎีฟิสิกส์ควอนตัมหน่อย เพราะมันได้ใจความคือภาวะที่ทฤษฎีทางคณิตศาสตร์ล้มเหลว คือเหมือนกับพลัดตกลงไปในหลุมดำประมาณนั้น

การคำนวณ Resection ที่ใช้วงกลมสามวงมาตัดกันดังรูปด้านบน แต่จะเกิดอะไรขึ้น ถ้าจุดทั้ง 4 จุดนี้อยู่บนวงกลมวงเดียวกัน ก็หมายความว่าวงกลมสามวงนั้นจะซ้อนทับกันทั้งสามวง จนไม่สามารถหาจุดตัดกันได้ ดังนั้น Resection ไม่มีสูตรหรืออัลกอริทึ่มไหนในบรรณพิภพนี้ที่สามารถคำนวณได้บนภาวะเอกฐาน

ภาวะเอกฐานเสมือน (Pseudo Singularity)

ภาวะเอกฐานเสมือนเป็นสภาวะที่จุด P มาอยู่บนเส้นตรงระหว่าง A-B หรือ B-C หรือ A-C ด้านล่างจะเป็นกรณีจุด P อยู่บนเส้นตรงระหว่างจุด B และ C จะทำให้มุม β มีค่ากับ π เรเดียน (หรือเท่ากับ 180 องศา) หรือถ้าขยับจุด P ให้เลยออกจากจุด B แตยังอยู่ในแนวเส้นตรง ในกรณีนี้จะได้ มุม β = 0

ภาวะเอกฐานเสมือนนี้สูตรหลายๆสูตรไม่สามารถหาค่าได้เช่นสูตร Tienstra Method

อัลกอริทึ่มสมัยใหม่ (Modern Algorithm)

เท่าที่ผมทราบในปัจจุบันตัวที่ทำให้เกิดสูตรคณิตศาสตร์ใหม่ๆมาจากวงการ Robot ที่ต้องการให้ค่าพิกัดของหุ่นยนต์ในการเคลื่อนไหวได้แม่นยำ เนื่องจากหุ่นยนต์ทำงานอยู่ในอาคาร จึงทำให้ระบบให้ค่าพิกัด GNSS ไม่สามารถนำมาใช้งานได้ หุ่นยนต์ในที่นี้ไม่ได้หมายถึงหุ่นยนต์ที่ติดตั้งแบบอยู่กับที่ในโรงงานนะครับ แต่เป็นหุ่นยนต์ที่สามารถเคลื่อนไหวได้อิสระ ตัวอย่างง่ายๆได้แก่การแข่งขันหุ่นยนต์ของนักศึกษาในอินดอร์ อดึตกาลสูตรเหล้านี้มาจากนักคณิตศาสคร์ แต่สำหรับสูตรสมัยใหม่เนื่องจากความต้องการใช้งานในวงการหุ่นยนต์ ทำให้คนที่คิดค้นสูตรสมัยใหม่กลายเป็นวิศวกรไฟฟ้าหรือวิศวกรเครื่องกล เท่าที่ผมศึกษางานวิจัยในเบื้องต้นผมสนใจงานของ

    1. A New Three Object Triangulation Algorithm for Mobile Robot Positioning โดย Vincent Pierlot and Marc Van Droogenbroeck ทั้งสองท่านจบวิศวกรไฟฟ้า งานวิจัยนี้มีโค้ดภาษา C ด้วย แต่เนื่องจากลิขสิทธิ์ที่ระบุให้ใช้ในวงการศึกษาหรือใช้งานส่วนตัวเท่านั้น ผมจึงไม่สามารถนำโค้ดมาใช้งานได้เพราะยังกำกวม ความจริงงานทั้ง 2 ท่านได้รวบรวมอัลกอริทึ่มรวมทั้งของตัวเองด้วยทั้งหมด 18 อัลกอริทึ่มและ implement มาเป็นโค้ด พร้อมทั้งวัด benchmark ว่าใค้ดใครเร็วที่สุด ก็ตามคาดหมายโค้ดที่ทั้งสองท่านคิดค้นมานั้นเข้าวิน แต่สำหรับผมแล้วความต่างมันหนึ่งในพันส่วนของวินาทีอาจจะจำเป็นสำหรับงานให้ตำแหน่งหุ่นยนต์ที่ต้องมีการคำนวณตำแหน่งแบบ real time แต่สำหรับงานสำรวจในภาคสนามความจำเป็นกลับต่างออกไป
    2. New Method That Solves the Three-Point Resection Problem Using Straight Lines Intersection โดย Josep M. Font-Llagunes and Joaquim A. Batlle ผมชอบความคิดของสองท่านนี้ดูจากโพรไฟล์แล้วจบวิศวกรเครื่องกล แต่เนื่องจากเอกสารเข้าใจยากไปนิด ผมกลับใช้เวลาแกะอัลกอริทึมโดยใช้เวลาพอสมควรกว่าจะออกมาเป็นโค้ดได้ โปรแกรมสามารถคำนวณในสภาวะเอกฐานเสมือนได้

หลักการคำนวณโดยย่อ

ผมไม่มีเวลาที่จะศึกษาสูตรในเบื้องลึกให้กระจ่างมากนั้นแต่เน้น implement มาเป็นโค้ดภาษา C ดังนั้นความเข้าใจจึงอยู่ในระดับผิวเผิน ต่อไปผมจะบอกเล่าสิ่งที่ผมเข้าใจแบบจำกัดจำเขี่ย เราจะมาเริ่มต้น สมมติว่าตอนนี้ถ้าทราบค่าพิกัด P แล้วเราสามารถหาค่าอะซิมัทจากสถานี A, B และ C ไปยังจุด P ได้ง่ายๆ ตามรูปด้านล่าง

ค่าอะซิมัทของสถานีที่ทราบค่าพิกัด

1.คำนวณหาค่าอะซิมัทโดยประมาณ (Θ)

แต่ในชีวิตจริงค่าพิกัด P เป็นสิ่งที่เรายังไม่ทราบดังนั้นสูตรคำนวณนี้จะมีการหาค่าโดยประมาณก่อน Θ = θ – โดย  คือค่าเบี่ยงเบนไปจากค่าจริงจากที่เราประมาณ ถ้าทุกๆเส้นเบี่ยงเบนไป  เราสามารถลากเส้นไปตัดกันเป็นรู)สามเหลี่ยมเล็กๆ แต่ถ้า  ที่ประมาณการณ์ไว้มีขนาดเบี่ยงเบนไปมาก ก็จะได้ขนาดสามเหลี่ยมนี้ใหญ่ขึ้น สามเหลี่ยมนี้ทางผู้คิดค้นเรียกว่า error triangle จุดตัดแทนที่ด้วย PAB, PBC และ PAC

2.คำนวณหาค่าพิกัดของ Error Triangle

ค่าพิกัดของจุดตัด P นี้สามารถคำนวณได้จากสูตร

โดยที่ mA = cot(Θ), mB = cot(Θ – α) และ mC = cot(Θ – α -β) ไม่ลืมว่า Θ คือค่าอะซิมัทโดยประมาณ

3.คำนวณหาค่าพิกัดของ Centers Triangle

ถ้าจากจุด P ลากเส้นตรงไปหาสถานีที่ทราบค่าพิกัดแล้วแบ่งครึ่งลากเส้นตั้งจาก เราจะได้สามเหลี่ยมอีกชุดหนึ่งเรียกว่า centers triangle  และเป็นสามเหลี่ยมคล้ายสามเหลี่ยม error triangle ดังนั้นความสัมพันธ์ด้านมุมและระยะระหว่างสามเหลี่ยมสองรูปนี้สามารถคำนวณได้ ดังนั้นค่าพิกัดของ centers triangle สามารถคำนวณหาค่าพิกัดจุดตัด CAB, CBC และ CAC ได้จากสูตรดังต่อไปนี้

4.คำนวณมุมเบี่ยงเบน

ค่าเบี่ยงเบนเมื่อคำนวณมาได้แล้วสามารถนำไปบวกหรือลบกับค่าอะซิมัทประมาณการในครั้งแรกจะได้ค่าอะซิมัทที่ถูกต้อง

สามารถคำนวณสมการ (9) จากระยะทางแต่ละด้านของ error triangle และ centers triangle เช่นตัวอย่าง |δθ| = arcsin(ระยะทางระหว่างจุด PAB– PBC / ระยะทางจุด CAB– CBC )

หรือในสมการ (10) สามารถใช้พื้นที่ของสามเหลี่ยมสองรูปนี้ได้

5.คำนวณหาเครื่องหมายมุมเบี่ยงเบน

ก่อนหน้านี้ที่แสดงค่าที่คำนวณได้ในสมการ (9) และ (10) จะเห็นว่าติดเครื่องหมาย absolute ไว้คือยังไม่ได้คิดเครื่องหมาย ส่วนเครื่องหมายมุมเบี่ยงเบนหาได้ดังนี้

ทางผู้พัฒนาแสดงทิศทางของ error triangle เมื่อเทียบ center triangle ตามเครื่องหมายของ error triangle ดังนี้

อาจจะดูยากไปนิดเป็นการคูณไขว้กัน ดูตัวอย่างเพื่อความง่าย

sign = (xPAC-xPBC)*(yCAC-yCBC) – (xCAC-xCBC)*(yPAC-yPBC)

ค่าของ  sign จะออกมาเป็นบวกหรือเป็นลบ แล้วจะเอาเครื่องหมายนี้ไปใส่ให้สมการในข้อต่อไป

6.คำนวณหาอะซิมัทที่ถูกต้อง

สมการ θ=Θ +sign(dθ)

7.คำนวณหาพิกัดของจุดตัด Resection

ถ้าจุดตัดไม่ตกหลุมดำ ก็สามารถคำนวณหาจุดตัดได้จาก 1 ใน 3 สมการ ของสมการ (1), (2) หรือ (3) เช่นตัวอย่าง

mA = cot(θ)
mB = cot(θ – α)
xP = (mA x xA – mB x xB – yA + yB) / (mA – mB)
yP = mA x (xP – xA) + yA

การคำนวณเมื่อจุดตัดตกภาวะเอกฐานเสมือน

จะมี 3 กรณีคือ

1) ค่า α = 180 หรือ α = 0

2)ค่า β = 180 หรือ β = 0

3)ค่ามุม α+β = 180 หรือ α+β = 0

จากการคำนวณในข้อ 3 จะสังเกตในสูตร (5) จะมีตัวคูณด้วย cot(α) อยู่ ในกรณีนี้จุดตัด P อยู่บนเส้นตรงระหว่างจุด A และ B ดังนั้นมุม α = 180 องศาจะทำให้ cot(α) ไม่สามารถคำนวณได้เพราะค่าเป็นอนันต์ (infinity)  ในเคสนี้เราจะไม่คำนวณหาจุด CAB เพราะหาไม่ได้นั่นเอง แต่จุด CBC และ CAC ก็ยังหาได้ปกติ ดังนั้นในกระบวนการสุดท้ายค่าพิกัดของจุด P สามารถคำนวณได้จากการใช้สมการอีก 2 สมการคือสมการ (2) และ (3)

ไม่ใช้สมการ (1) เพราะมีค่า (mA – mB)  = 0 ทำให้ห่าค่า xP ไม่ได้

ข้อสังเกต สามารถลากวงกลมได้แค่ 2 วงเท่านั้นคือวงกลม A-P-C และ B-P-C ส่วนอีกวงลากไ่ม่ได้เพราะว่า A-P-B เป็นเส้นตรง

ดาวน์โหลด (Download) โปรแกรมสำหรับเครื่องคิดเลข fx-9860G

ไปที่หน้าดาวน์โหลดมองหาโปรแกรมชื่อ Resction.G1A เมื่อดาวน์โหลดมาแล้วใช้โปรแกรม FA-124 ทำการโอนโปรแกรมเข้าเครื่องคิดเลข (ดูโพสต์เก่าได้วิธีการนี้) จะเห็นไอคอนปรากฎที่หน้า AddIn ดังรูป

กรณีที่ 1 ตัวอย่างงานรังวัดในงานสำรวจทั่วไป (Survey Engineering Example)

กำหนดค่าพิกัดของสถานี A, B และ C ดังนี้

วัดค่ามุม ∝ และ ∅ จากกล้อง total station ได้ดังนี้ ∝= 40°35’22.11“ และค่ามุม ∅ = 9°18’31.84“ ที่ไอคอนโปรแกรมกดคีย์ “EXE” เข้าไปป้อนค่าพิกัดสถานีทั้งสามดังนี้

จากนั้นป้อนมุมภายใน

โปรแกรมจะคำนวณหาค่าพิกัดของจุดตัด โดยที่แจ้งสถานะมาก่อนว่าคำนวณได้ Resection Solved…

กรณีที่ 2 ตัวอย่างงานที่จุดตัดตกอยู่ในภาวะเอกฐานเสมือน (Pseudo Singularity)

นี่เป็นกรณีพิเศษจริงๆ เพราะว่าหลายๆสูตรคำนวณด้วยวิธีนี้ไม่ได้เช่นสูตร Tienstra กำหนดค่าพิกัดสถานี  A (2639303.349mN, 231605.043mE) ค่าพิกัดสถานี B (2639271.845mN, 231419.755mE) และสถานี C (2639180.389mN, 231561.178mE) มุมที่รังวัดมา α = 180° มุม β = 105°3’14.94“

ข้อสังเกตุถ้ามุม α เท่ากับ 180 แสดงว่าจุดตัดตกอยู่บนเส้นตรงระหว่างสถานี A และ B แต่เขยิบเข้าไปใกล้ B มากกว่าเพราะว่ามุม β เป็นมุมป้าน มาดูการคำนวณจากเครื่องคิดเลข เมื่อเรียกโปรแกรมมาแล้วป้อนค่าพิกัดสถานีตามลำดับ A, B และ C แล้ว

จากนั้นป้อนมุม α และ β

ผลลัพธ์ที่ได้

กรณีที่ 3 ตัวอย่างจุดตัดตกหลุมดำในภาวะเอกฐาน (Singularity)

กรณีสุดท้าย โอกาสที่จะเจอแบบนี้คือสถานีทั้งสามสถานีอยู่บนวงกลมเดียวกันและจุดที่ตั้งกล้องที่ต้องการทราบค่าพิกัดและยังมาอยู่บนวงกลมเดียวกันทั้ง 4 จุด ในชีวิตจริงมีโอกาสน้อยมากเหมือนกับถูกล็อตเตอรีรางวัลที่ 1 ยังไงยังงั้น มาลองคำนวณดู

กำหนดค่าพิกัดสถานี A (2369180.389mN, 231561.178mE) สถานีพิกัดสถานี B (2639303.349mN, 231605.093mE) และสถานี C (2639478.455mN, 231509.233mE) วัดมุม α = 29°32’23.9“และ β = 18°48’43.9“

เมื่อเข้าไปในโปรแกรมป้อนค่าพิกัด A, B และ C ตามลำดับ

จากนั้นป้อนมุม α และ β ตามลำดับ

สุดท้ายโปรแกรมไม่สามารถคำนวณหาพิกัดจุดตัดได้และแสดงว่า Resection unsolved…

เครดิต (Credit)

ก็ยกเครดิตสำหรับอัลกอริทึ่มหรือสูตรคำนวณนี้ให้กับสองท่านคือ Josep M. Font-Llagunes and Joaquim A. Batlle.

ซอร์สโค้ดสูตรคำนวณ (Sourcecode)

ผมยกมาเฉพาะสูตรคำนวณตั้งชื่อฟังก์ชั่น straightLineIntersection สำหรับคนที่สนใจเรื่องโปรแกรมมิ่งก็ศึกษาโค้ดภาษาซีกันได้ครับ ไม่มีอะไรยุ่งยาก

/* Algorithm based on Josep M. Font-Llagunes and Joaquim A. Batlle.
  - Input angles are radians. 
  - Internal angles is clock-wise direction.
  - A, B and C must be located from right to left respectively.*/
bool straightLineIntersection(double *xP, double *yP,
				double alpha_AB, double alpha_BC,
				double xA, double yA, double xB, double yB, double xC, double yC)
{
  double mA, mB, mC; //slope of lines.
  double cot_12, cot_23, cot_31;
  double pAB, pAC, pBC; //Euclidean distance between station.
  double estB; //Estimated angle A-B-C.
  double xPAB, yPAB, xPBC, yPBC, xPAC, yPAC; //error triangle.
  double xCAB, yCAB, xCBC, yCBC, xCAC, yCAC; //center of triangle.
  double deltatheta;
  double theta; //first estimated and actual azimuth from P to A at the end.
  double AP, AC;
  double sign;
  double dPAC_PBC, dCAC_CBC;
  double dPAB_PBC, dCAB_CBC;
  double dPAB_PAC, dCAB_CAC;

  pAB = sqrt((xA-xB)*(xA-xB) + (yA-yB)*(yA-yB));
  pAC = sqrt((xA-xC)*(xA-xC) + (yA-yC)*(yA-yC));
  pBC = sqrt((xB-xC)*(xB-xC) + (yB-yC)*(yB-yC));

  estB = acos((pAB*pAB + pBC*pBC - pAC*pAC) / (2*pAB*pBC));
  //Check if found absolutely singularity then stop and return.
  if (((estB + alpha_AB + alpha_BC - PI) >= -0.0001) and 
      ((estB + alpha_AB + alpha_BC - PI) <= 0.0001))
    return false;

  /*first guess (theta), try to avoid for cot(angle) 
    when angle == PI or zero).*/ 
  theta = alpha_AB + alpha_BC/2.0;    
  mA = cot(theta);
  mB = cot(theta - alpha_AB);
  mC = cot(theta - alpha_AB - alpha_BC);
	
  //calc coordinates of error triangle.
  xPAB = (mA*xA - mB*xB - yA + yB) / (mA - mB);
  yPAB = mA*(xPAB - xA) + yA;  
  xPBC = (mB*xB - mC*xC - yB + yC) / (mB - mC);
  yPBC = mB*(xPBC - xB) + yB;
  xPAC = (mA*xA - mC*xC - yA + yC) / (mA - mC);
  yPAC = mA*(xPAC - xA) + yA;
	
  dPAC_PBC = sqrt((xPAC-xPBC)*(xPAC-xPBC) + (yPAC-yPBC)*(yPAC-yPBC));
  dPAB_PBC = sqrt((xPAB-xPBC)*(xPAB-xPBC) + (yPAB-yPBC)*(yPAB-yPBC));
  dPAB_PAC = sqrt((xPAB-xPAC)*(xPAB-xPAC) + (yPAB-yPAC)*(yPAB-yPAC));
  
  AP = ((xPAB - xPBC) * (yPBC - yPAC) - (xPBC - xPAC) * (yPAB - yPBC))/* / 2*/ ;
  AP = (AP < 0.0) ? -AP : AP;

  /* The next 3 Cases are psudosingularities.
    
    1st case: P is aligned with A & B.Therefore cannot calc PAB & CAB.*/
  if (alpha_AB == PI || alpha_AB == 0.0){ /* P is aligned on A & B.*/
    /* cot(alpha_AB) is infinity */
    cot_23 = cot(alpha_BC);
    cot_31 = cot(alpha_AB+alpha_BC);
   
    //calc coordinates of center triangle.
    xCBC = 0.5 * (xB + xC + (yB - yC) * cot_23);
    yCBC = 0.5 * (yB + yC + (xC - xB) * cot_23);
    xCAC = 0.5 * (xA + xC + (yA - yC) * cot_31);
    yCAC = 0.5 * (yA + yC + (xC - xA) * cot_31);

    //distance CAC to CBC (center triangle).
    dCAC_CBC = sqrt((xCAC-xCBC)*(xCAC-xCBC)+(yCAC-yCBC)*(yCAC-yCBC));

    deltatheta = asin(0.5*(dPAC_PBC/dCAC_CBC));
	deltatheta = (deltatheta < 0.0) ? -deltatheta : deltatheta; 
    sign = (xPAC-xPBC)*(yCAC-yCBC) - (xCAC-xCBC)*(yPAC-yPBC);
	if (sign < 0.0 ) deltatheta = -deltatheta ;   
    theta += deltatheta;

    mB = cot(theta - alpha_AB);
    mC = cot(theta - alpha_AB - alpha_BC);
  
    *xP = (mB * xB - mC * xC - yB + yC) / (mB - mC);
    *yP = mB * ((*xP) - xB) + yB; 
    return true;
  }else if ((alpha_BC == PI) || (alpha_BC == 0)){ 
    /* 2nd case: P is aligned on B & C.
                 cot(alpha_BC) is infinity */
    cot_12 = cot(alpha_AB);
    cot_31 = cot(alpha_AB+alpha_BC);
   
    //calc coordinates of center triangle.
    xCAB = 0.5 * (xA + xB + (yA - yB) * cot_12);
    yCAB = 0.5 * (yA + yB + (xB - xA) * cot_12);
    xCAC = 0.5 * (xA + xC + (yA - yC) * cot_31);
    yCAC = 0.5 * (yA + yC + (xC - xA) * cot_31);

    //distance CAB ot CAC (center triangle)
    dCAB_CAC = sqrt((xCAB-xCAC)*(xCAB-xCAC)+(yCAB-yCAC)*(yCAB-yCAC));

    deltatheta = asin(0.5*(dPAB_PAC/dCAB_CAC));
	deltatheta = (deltatheta < 0.0) ? -deltatheta : deltatheta; 
    sign = (xPAB-xPAC)*(yCAB-yCAC) - (xCAB-xCAC)*(yPAB-yPAC);
	if (sign < 0.0 ) deltatheta = -deltatheta ;   
    theta += deltatheta;

    mA = cot(theta);
    mB = cot(theta - alpha_AB);
  
    *xP = (mA * xA - mB * xB - yA + yB) / (mA - mB);
    *yP = mA * ((*xP) - xA) + yA; 
    return true;
  }else if (((alpha_AB + alpha_BC) == PI) || ((alpha_AB + alpha_BC) == 0)){
    /* 3rd case: P is aligned on A & C. 
       cot(alpha_AB+alpha_BC) is infinity.*/
    cot_12 = cot(alpha_AB);
    cot_23 = cot(alpha_BC);
   
    //calc coordinates of center triangle.
    xCAB = 0.5 * (xA + xB + (yA - yB) * cot_12);
    yCAB = 0.5 * (yA + yB + (xB - xA) * cot_12);
    xCBC = 0.5 * (xB + xC + (yB - yC) * cot_23);
    yCBC = 0.5 * (yB + yC + (xC - xB) * cot_23);

    //distance CAB ot CBC (center triangle)
    dCAB_CBC = sqrt((xCAB-xCBC)*(xCAB-xCBC)+(yCAB-yCBC)*(yCAB-yCBC));

    deltatheta = asin(0.5*(dPAB_PBC/dCAB_CBC));
	deltatheta = (deltatheta < 0.0) ? -deltatheta : deltatheta; 
	sign = (xPBC - xPAB) * (yCBC - yCAB) - (xCBC - xCAB) * (yPBC - yPAB);
	if (sign < 0.0 ) deltatheta = -deltatheta;   
    theta += deltatheta;

    mA = cot(theta);
    mB = cot(theta - alpha_AB);
  
	*xP = (mA * xA - mB * xB - yA + yB) / (mA - mB);
	*yP = mA * ((*xP) - xA) + yA;   
    return true;
  }else {
    /* Normal case can be calculated by other methods as well.*/
    cot_12 = cot(alpha_AB);
    cot_23 = cot(alpha_BC);
    cot_31 = cot(alpha_AB+alpha_BC);
   
    //calc coordinates of center triangle.
    xCAB = 0.5 * (xA + xB + (yA - yB) * cot_12);
    yCAB = 0.5 * (yA + yB + (xB - xA) * cot_12);
    xCBC = 0.5 * (xB + xC + (yB - yC) * cot_23);
    yCBC = 0.5 * (yB + yC + (xC - xB) * cot_23);
    xCAC = 0.5 * (xA + xC + (yA - yC) * cot_31);
    yCAC = 0.5 * (yA + yC + (xC - xA) * cot_31);

	AC = ((xCAB - xCBC) * (yCBC - yCAC) - (xCBC - xCAC) * (yCAB - yCBC))/* / 2*/ ;
	AC = (AC < 0.0) ? -AC : AC;

    deltatheta = asin(0.5*sqrt(AP/AC));
	deltatheta = (deltatheta < 0.0) ? -deltatheta : deltatheta; 
	sign = (xPBC - xPAB) * (yCBC - yCAB) - (xCBC - xCAB) * (yPBC - yPAB);
	if (sign < 0.0 ) deltatheta = -deltatheta ;   
    theta += deltatheta;

    mA = cot(theta);
    mB = cot(theta - alpha_AB);
  
	*xP = (mA * xA - mB * xB - yA + yB) / (mA - mB);
	*yP = mA * ((*xP) - xA) + yA;  
    return true;
  }
}
ติดปีกเครื่องคิดเลขเทพ Casio fx 9860G II SD ด้วยโปรแกรมภาษาซีบน AddIn ตอนที่ 4 โปรแกรมพื้นฐานงานสำรวจชุดที่ 1 (COGO SSE 1)

ติดปีกเครื่องคิดเลขเทพ Casio fx 9860G II SD ด้วยโปรแกรมภาษาซีบน AddIn ตอนที่ 4 โปรแกรมพื้นฐานงานสำรวจชุดที่ 1 (COGO SSE 1)

COGO (Coordinate Geometry)

ผมพยายามจะแปลคำนี้เป็นภาษาไทยอยู่นานทีเดียว แต่สุดท้ายขอทับศัพท์ดีกว่า จริงๆแล้วงานสำรวจคืองานที่เกี่ยวกับทรงเรขาคณิต (Geometry) อยู่แล้ว และต้องสามารถระบุค่าพิกัด (Coordinate) ทุกๆจุดได้บนเรขาคณิตนั้นๆ ความเกี่ยวข้องระหว่างรูปทรงเรขาคณติกับค่าพิกัดจะเกี่ยวข้องกันด้วยมุมและระยะทางเป็นส่วนใหญ่

Selected Serie 1 (SSE 1)

คำนี้เอามันครับ ผมนึกถึงโปรแกรมตระกูลไมโครสเตชัน (Microstation) ที่มักจะใช้คำนี้บอกรุนของโปรแกรม ดังนั้นคำว่า  Selected Serie 1 คำแปลก็ประมาณว่าเลือกสรรแล้วชุดที่ 1

โปรแกรมพื้นฐานงานสำรวจชุดที่ 1 (COGO SSE 1)

ก่อนหน้านี้ผมเขียนโปรแกรมภาษาซีสำหรับเครื่องคิดเลข Casio fx-9860G II SD มาหลายตอนแต่เป็นโปรแกรมระดับ advance มาในตอนนี้จะกลับมาที่พื้นฐานงานสำรวจที่ต้องเกี่ยวข้องกับค่าพิกัด มุมและระยะทาง

ดาวน์โหลดและติดตั้ง

ไปที่หน้าดาวน์โหลด (Download) มองหาโปรแกรมแล้วดาวน์โหลดจะได้ไฟล์ COGOSSE1.G1A  แล้ว copy ไฟล์ไปที่เครื่องคิดเลขตามวิธีขั้นตอนที่ผมได้บอกไว้ก่อนหน้านี้

ส่วนประกอบของโปรแกรม

สำหรับโปรแกรมพื้นฐานงานสำรวจในชุดนี้จะจัดโปรแกรมย่อยเล็กๆ ไว้ 4 โปรแกรม

  1. Bearing-Dist (2 pt) เมื่อกำหนดจุดค่าพิกัด 2 จุด สำหรับคำนวณหามุมอะซิมัทและระยะทาง
  2. Bearing-Dist(3 pt) เมื่อกำหนดจุดค่าพิกัด 3 จุด สำหรับคำนวณหาง่ามมุมราบ อะซิมัทและระยะทาง ในงานสำรวจก็ได้แก่การตั้งเป้าหลัง  (backsight)  จุดตั้งกล้อง (station) และเป้าหน้า (target)
  3. Coordinate 2D เมื่อกำหนดจุดค่าพิกัด 2 จุด กำหนดมุมราบและระยะราบ คำนวณหาค่าพิกัดจุดที่ 3 คำนวณหาพิกัดจุดที่ 3 การคำนวณคำนวณในระนาบสองมิติอย่างเดียว ไม่มีค่าระดับมาเกี่ยวข้อง
  4. Coordinate 3D เมื่อกำหนดจุดค่าพิกัด 2 จุด กำหนดมุมราบและมุมดิ่ง ระยะทางแบบ slope distance ต้องการคำนวณหาค่าพิกัดและค่าระดับจุดที่ 3

วิธีการใช้งานโปรแกรม

กดคีย์ “MENU” ที่เครื่องคิดเลขจะเห็นหน้าตาประมาณนี้ เลื่อนลูกศรไปที่ไอคอนของโปรแกรมดังรูป กดคีย์ “EXE”

Bearing-Dist (2 pt)

ที่เมนูกดคีย์ “1” เป็นการคำนวณหาค่ามุมอะซิมัทและระยะทางเมื่อกำหนดจุดค่าพิกัดให้สองจุด ลองทดสอบจากตัวอย่างดังรูป การประยุกต์ใช้งานส่วนใหญ่เป็นตอนที่ช่างสำรวจตั้งกล้องที่หมุดและส่องไปเป้าหลังหรือเป้าหน้าแล้ววัดระยะทางเพื่อตรวจสอบจากค่าพิกัด

ผลลัพธ์ก็ออกมาดังนี้

Bearing-Dist (3 pt)

ที่เมนูกดคีย์เลข “2” การประยุกต์ใช้งานส่วนใหญ่จะเป็นการตั้งกล้องส่องไปหมุดเป้าหลังแล้วป้อนค่าพิกัดเป้าหน้าเพื่อตรวจสอบมุมราบหรือไม่ก็จะเป็นการวางผังโดยการเปิดมุมราบและวัดระยะทางที่เป้าบน pole ลองดูตัวอย่างทดสอบ

จะได้ผลลัพธ์มาดังนี้ ครั้งแรกจะแสดงมุมอะซิมัทและระยะทางไปเป้าหลังก่อน

ถัดไปจะเป็นมุมราบ มุมอะซิมัทและระยะทางไปเป้าหน้า

Coordinate 2D

ที่เมนูกดคีย์เลข “3” เป็นการคำนวณหาค่าพิกัดเป้าหน้าเมื่อกำหนดค่าพิกัดจุดตั้งกล้องและเป้าหลัง กำหนดมุมราบและระยะทาง การคำนวณจะไม่มีค่าระดับมาเกี่ยวข้อง จึงเรียกว่า 2D หรือสองมิติ สำหรับโปรแกรมนี้ผมได้นำค่าสเกลแฟคเตอร์เข้ามาช่วยประยุกต์ใช้ด้วย ในกรณีที่ไม่ต้องใช้ก็ป้อนค่าสเกลแฟคเตอร์นี้ เป็น 1.0

สเกลแฟคเตอร์ตัวนี้แล้วจริงๆคือ Combine Scale Factor (CSF) ที่ได้จาก Elevation Scale Factor (ESF) x Grid Scale Factor (GSF) การประยุกต์ใช้สเกลแฟคเตอร์ส่วนใหญ่นำมาใช้โครงการที่ระบบพิกัดฉากกริดยูทีเอ็มในงานใหญ่ๆยาวๆ เช่นโครงการก่อสร้างถนน รถไฟ เพราะว่าแบบ drawing เราอยู่บนระนาบพิกัดฉาก ให้คิดเสียว่าแบบอยู่บนกระดาษขนาดใหญ่มาตราส่วน 1:1 แล้วเราวัดระยะทางบนผิวโลกที่มีความโค้ง ดังนั้นการวัดระยะทางจะต้องมีการทอนจากบนผิวโค้งเพื่อให้ลงมาเข้ากับระนาบพิกัดฉากของกระดาษ

มาลองทดสอบข้อมูล ป้อนข้อมูลค่าพิกัดเป้าหลัง ค่าพิกัดจุดต้องกลองดังนี้

จากนั้นป้อนมุมราบ และระยะทาง (Ground Distance ใช้ตัวย่อ Gnd dist) ในกรณีกล้องโททัล สเตชัน ไม่ได้ตั้งค่าสเกลแฟคเตอร์ไว้ที่ตัวกล้อง ระยะทางที่วัดออกมาจะเป็นระยะทางบนพื้นโลก ส่วนค่าสเกลแฟคเตอร์ในตัวอย่างผมใช้ 1.000480

 

โปรแกรมจะคำนวณมุมอะซิมัทและระยะทางไปเป้าหลังให้ดูก่อนเพื่อตรวจสอบ และไม่ลืมว่าค่าพิกัดที่เราป้อนเข้าไปในเครื่องคิดเลขคือค่าพิกัดในระบบพิกัดฉาก ระยะทางที่คำนวณออกมาคือระยะทางบนพิกัดฉาก (Grid Distance ใช้ตัวย่อ Grd Dist) และถ้าวัดระยะทางจริงๆควรจะได้เท่ากับ Ground Distance

ทวนกันนิด ระยะทางบนพิกัดฉาก(กริด)= ระยะทางบนพื้นโลก x สเกลแฟคเตอร์ 

สุดท้ายจะได้แสดงข้อมูลได้แก่มุมอะซิมัทไปเป้าหน้า ระยะทางบนพิกัดฉากและระยะทางบนพื้นโลก รวมทั้งค่าพิกัดเป้าหน้าที่ต้องการ

Coordinate 3D

ที่เมนูกดคีย์ “4” โปรแกรมคล้าย Coordinate 2D แต่จะมีมิติทางดิ่งเข้ามาเพิ่มดังนั้นที่จุดตั้งกล้องจะวัดความสูงของกล้อง (HI – Height of instrument) และที่เป้าหน้าก็จะต้องวัดความสูงมาด้วย (HT – Height of target) นอกจากนั้นจะมีมุมดิ่ง (Vertical angle) มาด้วย มาดูข้อมูลทดสอบกัน เริ่มจากป้อนค่าพิกัดเป้าหลัง ต่อมาป้อนค่าพิกัดจุดตั้งกล้อง ค่าระดับจุดตั้งกล้อง ความสูงกล้อง

ต่อไปป้อนมุมราบ(H.Ang) มุมดิ่ง(V.Ang) ระยะทาง (Slope distance) และความสูงเป้า(HT) และค่าสเกลแฟคเตอร์ (Scale Factor)

โปรแกรมจะคำนวณอะซิมัท ระยะทางจากจุดตั้งกล้องไปเป้าหลัง ข้อสังเกตผมใส่เครื่องหมายดาว (*) หน้าระยะทางบนพื้นโลก (Ground Distance)

กดคีย์ “EXE” จะได้ผลลัพธ์ อะซิมัท ระยะราบทั้งระยะบนพื้นโลกและระยะกริดจากจุดตั้งกล้องไปเป้าหน้า

สุดท้ายคือผลลัพธ์ที่ต้องการคือค่าพิกัดและค่าระดับของเป้าหน้า

สรุป

ก็พอหอมปากหอมคอสำหรับโปรแกรมพื้นฐานงานสำรวจชุดที่ 1 โดยมีสิ่งที่ช่างสำรวจจะต้องเข้าใจตั้งแต่เรื่องมุมอะซิมัทคือมุมอะไร สำคัญมากเพราะมุมนี้เป็นหัวใจขั้นพื้นฐานและจะสัมพันธ์กับระยะทางโดยที่แยกกันไม่ออกและสามารถนำไปคำนวณค่าพิกัดได้ สำหรับการคำนวณแบบนี้ โปรแกรมในกล้อง Total Station ปัจจุบันก็คำนวณให้อยู่แล้ว แล้วก็เก่งขึ้นเรื่อยๆ แต่ในทางกลับกัน สำหรับช่างสำรวจเอง คงไม่มีใครได้จับกล้องพวกนี้ได้ตลอดเวลา จำเป็นจะต้องมีเครื่องคิดเลขคู่ใจไว้ติดตัวตลอด สามารถหยิบมาใช้งานได้สะดวกและถ้ามีโปรแกรมที่จำเป็นสำหรับการทำงานติดอยู่ด้วย ชีวิตการทำงานก็พลอยลื่นไหล ติดตามตอนต่อไปครับ

ติดปีกเครื่องคิดเลขเทพ Casio fx 9860G II SD ด้วยโปรแกรมภาษาซีบน AddIn ตอนที่ 3 โปรแกรมคำนวณหาระยะทางจากค่าพิกัดภูมิศาสตร์ (Geodetic Dist Calc)

ติดปีกเครื่องคิดเลขเทพ Casio fx 9860G II SD ด้วยโปรแกรมภาษาซีบน AddIn ตอนที่ 3 โปรแกรมคำนวณหาระยะทางจากค่าพิกัดภูมิศาสตร์ (Geodetic Dist Calc)

มาถึงตอนที่ 3 ขอนำเสนอโปรแกรมคำนวณหาระยะทางที่สั้นที่สุดบนทรงรีด้วยสูตรการคำนวณของ Vincenty  และระยะทางที่สั้นที่สุดบนทรงกลมด้วยสูตรของ Haversine โดยที่กำหนดค่าพิกัดภูมิศาสตร์ (แลตติจูด/ลองจิจูด) มาให้ 2 จุด

Geodesic Distance

ระยะทางที่สั้นที่สุดบนทรงรี (Ellipsoid) จะเรียกว่า Geodesic distance ผมใช้ไลบรารี GeographicLib ที่พัฒนาโดย Charles F. F. Karney ไลบรารีตัวนี้ใช้ c standard library เฉพาะ math อย่างเดียว ดังนั้นมั่นใจได้เลยว่าสามารถเอามาคอมไพล์บนเครื่องคิดเลข Casio fx-9860G II SD ได้อย่างแน่นอน ไฟล์ header และซอร์สภาษาซีสามารถไปดาวน์โหลดได้ตามลิ๊งค์นี้ ให้ดาวน์โหลดเฉพาะไฟล์ geodesic.h และ geodesic.c ก็พอ ในไลบรารีเองจะแบ่งการคำนวณออกเป็น 2 แบบ คือ

  • Inverse กำหนดค่าพิกัดภูมิศาสตร์ 2 จุด คำนวณหาระยะทางและอะซิมัทของจุดเริ่มและจุดสิ้นสุด
  • Direct กำหนดค่าพิกัดภูมิศาสตร์ 1 จุดและอะซิมัทจุดเริ่มต้นและระยะทาง สามารถคำนวณหาค่าพิกัดภูมิศาสตร์จุดสิ้นสุดหรือจุดปลายได้
Image from http://proj4.org

ไลบรารี GeographicLib นอกจากจะคำนวณ Inverse & Direct แล้วยังสามารถคำนวณหาพื้นที่ของรูปปิด polygon ได้ แต่ผมไม่ได้นำมาคำนวณในที่นี้

Great Circle Distance

ส่วนการคำนวณหาระยะทางบนทรางกลม ที่ใช้สูตร Haversine ผมเขียนเองเพราะเป็นสูตรสั้นๆ แบ่งการคำนวณแบบ Inverse และ Direct ได้ หมายเหตุความถูกต้องของระยะทางยังสู้ Geodesic distance ไม่ได้

Image from https://en.wikipedia.org

ดาวน์โหลด (Download) โปรแกรมเครื่องคิดเลข

ไปที่หน้าดาวน์โหลด ตามลิ๊งค์นี้ จะได้ไฟล์ GEODIST.G1A แล้วติดตั้งลงเครื่องคิดเลข Casio fx-9860G II SD ผ่านทาง SD card หรือผ่าน FA-124

ทดสอบการใช้งาน

ในโหมด “MAIN MENU” ใช้ปุ่มคีย์บอร์ดลูกศรลงมาที่ไอคอน ดังรูป จากนั้นกดคีย์ “EXE” ประมวลผล

จะเห็นเมนูขึ้นมาดังรูป

Vincenty Inverse

เมื่อกำหนดค่าพิกัดสองจุด ต้องการคำนวณหาระยะทางบนทรงรี ที่เมนูกดคีย์ “1” ที่เครื่องคิดเลข เพืื่อคำนวณระยะทางแบบ Geodesic dist ป้อนค่าพิกัดดังรูป

กดคีย์ “EXE” เพื่อดูผลลัพธ์ จะได้ระยะทางสองหน่วยคือเมตรและกิโลเมตร  Azi 1 คือค่าอะซิมัทจุดเริ่มต้น Azi 2 อะซิมัทที่จุดปลายทาง

Vincenty Direct

กำหนดค่าพิกัดเริ่มต้น กำหนดระยะทางและอะซิมัท คำนวณหาค่าพิกัดปลายทางและอะซิมัทปลายทาง ที่เมนูกดคีย์ “2” ป้อนข้อมูลทดสอบดังนี้

ได้ผลลัพธ์ดังนี้

Haversine Inverse

กำหนดค่าพิกัดให้สองจุด คำนวณหาระยะทางและอะซิมัท ที่เมนูกดคีย์เลข “3” ป้อนข้อมูลทดสอบดังนี้

กดคีย์ “EXE” ได้ผลลัพธ์ดังนี้

จะเห็นว่าค่าพิกัดสองจุดเป็นจุดเดียวกันกับตัวอย่าง Vincenty Inverse แต่ระยะทางที่คำนวณด้วยสูตร Vincentry ได้เท่ากับ 9271.574 กม. แต่ที่คำนวณด้วย Haversine ได้ระยะทาง 9273.574 กม. ต่างกันเล็กน้อยมากประมาณ 0.02  %

Haversine Direct

กำหนดค่าพิกัดให้หนึ่งจุด อะซิมัทแบะระยะทาง คำนวณค่าพิกัดจุดปลายทาง ที่เมนูกดคีย์ “4” ป้อนข้อมูลทดสอบดังนี้ 

กดคีย์ “EXE” ได้ผลลัพธ์ดังนี้

สรุป

การคำนวณระยะทางที่สั้นที่สุดบนทรงรี ใช้ไลบรารีที่สุดยอดจาก GeographicLib แบบยกมาเต็มๆ ความละเอียด ความถูกต้องเทียบเท่ากับคำนวณโปรแกรมบนคอมพิวเตอร์ ก็คงเหมาะสมกันเมื่อไลบรารีเทพมาอยู่บนเครื่องคิดเลขเทพ ตอนหน้าผมจะเสนอโปรแกรมที่ช่างสำรวจใช้ในชีวิตประจำวันกัน หลังจากที่ตอนก่อนหน้านี้ แสดงโปรแกรมที่แสดงศักยภาพของเครื่องคิดเลขเป็นส่วนใหญ่ ติดตามกันต่อไปครับ

 

ติดปีกเครื่องคิดเลขเทพ Casio fx 9860G II SD ด้วยโปรแกรมภาษาซีบน AddIn ตอนที่ 1 โปรแกรมแปลงพิกัดภูมิศาสตร์ (Geographic Calc)

ติดปีกเครื่องคิดเลขเทพ Casio fx 9860G II SD ด้วยโปรแกรมภาษาซีบน AddIn ตอนที่ 1 โปรแกรมแปลงพิกัดภูมิศาสตร์ (Geographic Calc)

รอคอยมานานแต่ไม่รู้ว่าสิ่งที่รอคอยมันคืออะไร

สำหรับคนที่เคยเขียนโปรแกรมลงเครื่องคิดเลขคาสิโอ ถ้าเคยเขียนโปรแกรมมิ่งบนระบบใหญ่ๆมาก่อนเช่นจาวา ซี หรือไพทอน จะรู้สึกว่าโดนมัดมือมัดเท้าทำอะไรไม่ถนัด ภาษาเบสิคของคาสิโอ (basic casio) ก็ดูจะหน่อมแน๊ม ตัวแปรก็จำกัดไม่กี่ตัว เมมโมรีสำหรับเก็บโปรแกรมก็น้อยนิดเดียว เขียนฟังก์ชั่นก็ไม่ถนัด ก็เลยได้แต่โปรแกรมอะไรที่ง่ายๆ ใช้ตัวแปรไม่มาก  แต่ไม่นานที่ผ่านมา เผอิญไปค้นหาในอินเทอร์เน็ต โดยที่หาโปรแกรมแบบ basic casio บนเครื่องคิดเลขระดับเทพในวงการสำรวจบ้านเราคือ fx-9860G II SD ที่ผมเคยร่ำๆจะซื้อหามาใช้หลายเที่ยวแต่ติดที่ความรู้สึกว่าแพงไปนิดเมื่อเทียบกับ fx-5800P ที่ใช้อยู่ โปรแกรมที่ค้นหาก็ไม่ได้มีอะไรมากแค่เอามาเปรียบเทียบอัลกอริทึ่มที่ผมมีอยู่ บังเอิญไปเจอว่าการเขียนโปรแกรม AddIn ต้องใช้ SDK (Software Development Kit) ที่ต้องใช้ภาษาซี ก็เลยสะดุดตา ลองค้นเข้าไปอีกหน่อย ก็พออนุมานได้ว่าสามารถเขียนโปรแกรมอะไรก็ได้แบบ AddIn ให้กับเครื่องคิดเลข ที่ไม่ติดจำกัดด้านโครงสร้างภาษาเพราะใช้ภาษาซี ที่คาสิโอเตรียมคอมไพเลอร์ ไลบรารีเครื่องมือพัฒนาโปรแกรมด้านภาษาซีมาพอประมาณ สุดท้ายผมก็เลยมานึกว่า ก่อนหน้านี้ผมคงต้องรอคอยอะไรบางอย่างมานานแต่ไม่รู้ว่าคืออะไร จนกระทั่งได้เจอสิ่งนี้ 🙂 มันใช่เลย ถึงแม้ตอนเจอดูเหมือนผมจะมาสายไปบ้างก็ตาม

อารมณ์มัน Back to school คือความสนุกสนานได้กลับมาอีกครั้ง ผมเคยพูดถึงว่าเครื่องรุ่นเทพสมัยแต่ก่อนคือ Casio fx-880P ที่เขียนภาษาเบสิค(แบบกำกับด้วยหมายเลขบรรทัด) เวลาพกเครื่องคิดเลขรุ่นนี้ ถ้าเอาเท่ห์ก็เอาเหน็บที่กระเป๋าหลังของกางเกงยีนส์ แต่บ่อยครั้งที่ลืมนั่งทับจนเครื่องพัง ที่สามารถเขึยนโปรแกรมได้พอประมาณ แต่ปัญหาคือเมมโมรีที่จัดเก็บโปรแกรมมาน้อย ถึงแม้สามารถซื้อแรมขนาด 32KB มาเพิ่มได้ก็ตาม เคยเขียนโปรแกรม Traverse เล่นๆลงไปเขมือบเมมโมรีไปเกินครึ่ง จนต้องลบโปรแกรมอื่นทิ้งไป ถึงจะใส่ได้ การจะโอนโปรแกรมไปหาเครื่องอื่นก็แสนยากเย็นกระไร เพราะต้องหาสายลิ๊งค์ สมัยก่อนไม่มีอีเบย์ ก็เลยใครอยากได้โปรแกรมอะไรก็ต้องพิมพ์เองสดๆลงไปในเครื่อง ประมวลผลดูผิดตรงไหนก็ตามไปแก้ สำหรับเครื่องคิดเลขในทศวรรษนี้ไม่ต้องทำแบบนั้นแล้วครับมีสายลิ๊งค์มาให้ หรือรุ่น fx-9860G II SD ก็มี SD card มาให้สามารถโอนโปรแกรมให้กันได้สะดวก

รู้จัก Casio fx-9860G II SD

เครื่องรุ่นนี้ออกเก็บเกี่ยวความสำเร็จตามหลัง fx-9750G โดยที่ผลิตออกมาสองรุ่น รุ่นแรกเคสสีเงินส่วนคีย์บอร์ดสีน้ำเงิน ใช้ CPU SH3 รุ่นที่สองเป็นรุ่นล่าสุดเคสสีน้ำเงินเข้มส่วนคีย์บอร์ดสีขาวใช้ CPU SH4a มีเมมโมรีใช้งาน 62 KB (ขนาดน่าสงสารมาก) มีพื้นที่จัดเก็บโปรแกรม (storage memory) เป็น 1.5 MB ที่ผมประเมินดูโปรแกรมขนาดกลางๆสำหรับเครื่องคิดเลขขนาด น่าจะประมาณ 50000 Bytes ถ้าพื้นที่จัดเก็บโปรแกรม 1.5 MB น่าจะใส่โปรแกรมได้ไม่ต่ำกว่า 30 โปรแกรมเลยทีเดียว โดยรวมการประมวลผลเร็วครับ ตามความเข้าใจผมตัว OS ของรุ่นนี้น่าจะกินเมมโมรีไม่มากนัก ที่ผมชอบอีกอย่างคือพื้นที่การแสดงผล ถ้าเอาแบบแสดงตัวอักษรอย่างเดียว ได้ทั้งหมด 8 แถว (row) และแถวละ 21 ตัวอักษร ถามว่าพอไหม ก็ตอบได้ว่าพอครับแบบเบียดเสียดไปหน่อย แต่ยังโอเคกว่ารุ่น fx-5800P ที่มีแค่ 2 บรรทัด แต่อย่างไรก็ตามยังมีโหมดกราฟฟิคมีความละเอียดกว้าง x สูง = 127 x 63 สำหรับวาดกราฟ ก็มาดูขนาดโปรแกรมแปลงพิกัดภูมิศาสตร์ของผม UTMGeo.g1a คือโปรแกรมที่คอมไพล์และบิวท์ (compile & build) มาแล้ว ขนาดประมาณตามรูป 78760 ไบต์ ส่วนโปรแกรมสองโปรแกรมด้านบน (ARCCENPT.g1a และ INTERSCT.g1a) ผมก็เขียนเหมือนกันแต่ขนาดเล็กกว่า

ตามล่าเครื่องมือพัฒนาโปรแกรม SDK (Software Development Kit)

เมื่อรู้ว่าใช้ภาษาซีเขียนได้ ผมก็ตามหาเครื่องมือเพื่อพัฒนาโปรแกรม แต่เนื่องจากรุ่นนี้ออกมาได้หลายปีร่วมๆสิบปีแล้ว (ออกมาปี 2009) เข้าไปในเว็บไซต์ของคาสิโอแต่กลับพบกับผิดหวัง ไม่มีลิ๊งค์ให้ดาวน์โหลด (Link ขาดไปนาน) ทั้งๆที่คู่มือต่างๆเช่นการใช้งาน SDK, ไลบรารี ต่างๆก็ยังมีให้ดาวน์โหลดปกติแต่เครื่องมือพัฒนาโปรแกรมตั้งแต่เขียนโปรแกรม คอมไพล์ บิวท์ กลับหายไป สุดท้ายต้องลงใต้ดินตามหา จนเจอยังมีคนปล่อยให้ดาวน์โหลดได้ แต่ต้องใช้ระยะเวลาความพยายามเป็นอาทิตย์เหมือนกัน ผมจะไม่แสดงลิ๊งค์นี้เพราะอาจติดขัดกับลิขสิทธิ์ของคาสิโอได้ (ถ้าใครอยากได้ก็ขอมาหลังไมค์ละกันครับ) เมื่อได้มาแล้วก็มาลงบนคอมพิวเตอร์โน๊ตบุ๊ค วินโดส์ 10 และจอของผมเป็น 4K ก็ไม่ได้มีปัญหาอะไร สามารถเปิดโปรแกรมมาได้ปกติ เครื่องมือพัฒนาโปรแกรมเรียกว่า integrated development environment (IDE) ตั้งแต่ปล่อยมาปี 2007 Casio ไม่เคยอัพเดทอีกเลย เครื่องมือนี้ใช้คอมไพเลอร์ของ Renesas SHC ซึ่งอิงภาษาซีของ ANSI C standard (C89)

เริ่มแรกใช้งานกับปัญหาที่ประสบ

แต่พอเริ่มคอมไพล์โปรแกรมทดสอบเล็กๆดูกลับมีปัญหาเล็กๆน้อยๆ เช่น ** L2011 (E) Invalid parameter specified in option “input” : “”C:\Program Files (x86)\CASIO\fx-9860G SDK\OS\FX\lib\setup.obj”” วิธีการแก้ไข ให้ถอนโปรแกรมไปติดตั้งใหม่ แต่ตอนติดตั้งให้ติดเลือกติดตั้งที่รากของไดรว์ C: (ไม่เลือกดีฟอลต์คือติดตั้งลง C:\Program fils(x86) เพราะโปรแกรมนี้รุ่นเก่าไม่ชอบ path ทีมีตัว space) ปัญหาเล็กๆน้อยๆ เหล่านี้พอหาได้ตามฟอรั่มที่เกี่ยวข้องกับเครื่องคิดเลขของคาสิโอครับ แต่แล้วเส้นทางนี้ไม่ได้โรยด้วยกลีบกุหลาบ ปัญหาที่นึกไม่ถึงคือ user interface ทางคาสิโอไม่ได้เตรียม document ไว้ให้เลย พวกสิ่งเหล่านี้ได้แก่การ input แม้กระทั่งการอ่านข้อมูลจากตัวแปรตัวอักษร A-Z ก็ไม่ได้ทำไว้ ข้อมูลเป็นตัวเลข เป็นสตริง ผมอาศัยไปอ่านตามฟอรั่มที่มีหลายคน hack ไว้ ตรงนี้เสียเวลาไปหลายสิบวันกว่าจะแกะและจูนได้

โปรแกรมแรกเป็นกรณีศึกษา -เขียนโปรแกรมแปลงพิกัดภูมิศาสตร์ (Geographic Calc)

จั่วหัวไปเหมือนโปรแกรมจะใหญ่โต แต่เปล่าเลยผมเคยเขียนโปรแกรมแปลงพิกัดระหว่าง UTM และค่าพิกัดภูมิศาสตร์ (Geographic) บน fx 5800P ก็ไม่ได้ยากเย็นอะไรมากเพราะการแปลงพิกัดเหลานี้มีสูตรที่แน่นอนถึงแม้สูตรจะยาวไปหน่อยก็ตาม แต่ก็ไม่ได้ยากเย็นอะไร ผมมีเรื่องการแปลงพิกัดค้างคาอยู่นิดหนึ่งคือในโปรแกรม Surveyor Pocket Tools ในส่วนการแปลงพิกัดจะสังเกตเห็นว่าไม่มีระบบพิกัด MGRS (Military Grid Reference System) ซึ่งสำหรับพลเรือนอย่างพวกเรา คงไม่มีโอกาสได้ใช้งานเท่าไหร่นัก ผมค้นดูไลบรารีที่สามารถแปลงพิกัดได้ตาม github ไปพบมาอันหนึ่งชื่อ mrgs พัฒนาโดย Howard Butler ซึ่งไลบรารีที่เขียนไว้ไม่ใหญ่มาก นอกจากแปลงพิกัด Transverse Mercator ได้ยังแปลง MGRS ได้ และโปรแกรมในรุ่นนี้ผมขอจำกัดแค่ดาตั้ม “WGS84

ส่วนผมเองต้องบอกก่อนว่าไม่ใช่แฟนพันธุ์แท้ภาษาซี พอจะเขียนได้แต่ไม่ได้เก่งกาจนัก ดังนั้นโปรแกรมที่เขียนขึ้นมาอาจจะมีส่วนใดส่วนหนึ่งที่เยิ่นเย้อไปบ้าง

ลอง Military Grid Reference System (MGRS) ดูสักตั้ง

ในส่วนระบบพิกัด MGRS ซึ่งผมเห็นว่ามันแปลกดีที่ระบบนี้เอาตัวอักษรและตัวเลขแบ่งเป็นกริดมาขมวดรวมกันก็กลายเป็นค่า coordinate ได้ ลองดูรูปแบบดังตัวอย่างด้านล่าง

    • 46Q …………………GZD only, precision level 6° × 8° (in most cases)
    • 46QFJ ……………….GZD and 100 km Grid Square ID, precision level 100 km
    • 46QFJ 1 6 ……………precision level 10 km
    • 46QFJ 12 67 ………….precision level 1 km
    • 46QFJ 123 678 ………..precision level 100 m
    • 46QFJ 1234 6789 ………precision level 10 m
    • 46QFJ 12345 67890 …….precision level 1 m

ในเบื้องต้นผมขอใช้ไลบรารีนี้เพื่อเป็นกรณีศึกษา เพื่อลองเขียนโปรแกรมแปลงพิกัด MGRS ดูบ้าง ซึ่งระบบพิกัดนี้เครื่องคิดเลข fx-5800P ทำไม่ได้แน่นอนครับเพราะเครื่องคิดเลขไม่มีระบบรับข้อมูลเป็นสตริง (ยาวสุดประมาณ 15 ตัวอักษร) นอกจากไม่มีระบบรับข้อมูลสตริงแล้ว ไม่มีไลบรารีตัดสตริงออกมาเป็นท่อนๆ

เส้นทางและระยะเวลาในการพัฒนา

เนื่องจากโปรแกรมแปลงพิกัดนี้เป็นโปรแกรมเล็กๆ ไลบรารีที่ผมไปเอามาใช้จาก github ก็ใช้ง่ายสะดวก แต่ติดปัญหาที่ผมบอกไปแล้วคือระบบติดต่อผู้ใช้รับข้อมูลตัวเลข ตัวอักษรทาง casio ไม่ได้เปิดเผยเอกสาร บางอย่างต้องเขียนเองเช่นการรับข้อมูลเป็นสายสตริงเช่นค่าพิกัด MGRS (ตัวอย่างเช่น “18SVK8588822509”) บางอย่างไปหาตามฟอรั่ม เลยใช้เวลาสำหรับโปรแกรมแรกนี้ประมาณหนึ่งอาทิตย์กว่าๆ ในตอนนี้โปรแกรมเล็กๆนี้ก็เสร็จพอใช้งานได้แล้ว คุณสมบัติของโปรแกรมนี้คือค่าพิกัด latitude/longitude ที่แปลงมาจาก MGRS หรือ UTM สามารถแสดงผลได้ในทศนิยมที่ห้า ซึ่งจะเทียบเท่ากับหน่วยมิลลิเมตร ที่เราชาวสำรวจที่ต้องใช้ ถ้าใครเคยใช้โปรแกรมแปลงพิกัด UTM <==> Geo ที่ผมเขียนด้วย fx-5800P จะสังเกตเห็นว่าคำนวณแล้วได้ทศนิยมแค่สองตำแหน่งเท่านั้น ข้อได้เปรียบของ fx-9860G II คือสถาปัตยกรรมของเครื่องรุ่นนี้สามารถใช้ตัวแปร double ได้ ซึ่งในงานสำรวจนั้นเพียงพออยู่แล้ว

มาดาวน์โหลดโปรแกรมไปทดสอบ

เมื่อผม compile และ build โปรแกรมในเครื่องมือพัฒนาโปรแกรมของคาสิโอ แล้วจะได้ไฟล์ที่นามสกุล G1A (ตัว A คงหมายความว่า AddIn) ถ้าสนใจก็ไปดาวน์โหลดได้ที่หน้าดาวน์โหลด เมื่อได้ไฟล์มาแล้วชื่อ “UTMGeo.G1A” จากนั้นให้ดึง SD card ที่เสียบอยู่ด้านบนเครื่องคิดเลข fx-9860G II SD แล้วนำมาเสียบที่เครื่องพีซีหรือโน๊ตบุ๊ค เมื่อเปิดด้วย windows explorer จากนั้นสร้างโฟลเดอร์ใหม่ อย่างของผมตั้งชื่อ “Survey Addin Programs” แล้วก็อปปี้ไฟล์ “UTMGeo.G1A” ไปไว้ที่โฟลเดอร์ดังกล่าวนี้

จากนั้นดึง SD card เอาไปเสียบที่เครื่องคิดเลขเหมือนเดิม จากนั้นกดปุ่ม “MENU” ที่คีย์บอร์ดของเครื่องคิดเลข จะเห็นไอคอนของโปรแกรม AddIn ขึ้นมาทั้งหมด ใช้คีย์บอร์ดลูกศรเลื่อนไปที่ “MEMORY” กด “EXE”

  • จะเห็นตัวหนังสือ Memory Manager พร้อมเมนูให้เลือก เลือกกดคีย์บอร์ด “F3” เพื่อเลือก F3:SD Card
  • จะเห็นโฟลเดอร์ ที่อยู่ในเครื่องคิดเลข จะเป็นชื่อสั้น 8.3 แบบระบบปฏิบัติการ DOS สมัยแต่ก่อน เลื่อนไปที่ [SURVEY~2] กด “EXE”
  • จะเห็นชื่อไฟล์ “UTMGeo.G1A” ที่เราก็อปปี้มาจากโน๊ตบุ๊คคอมพิวเตอร์นั่นเอง กด “F1” (SEL) และกดปุ่ม “F2” (COPY)
  • ที่นี้จะมีไดอะล็อกเล็กๆให้เลือกปลายทาง กดคีย์เลข 2 เลือกโฟลเดอร์ปลายทางเป็น “ROOT” กด “EXE” ถ้ามีไฟล์อยู่แล้วให้ยืนยันการเขียนทับ “Yes” ด้วยกดคีย์ “F1”
  • จากนั้นก็กดคีย์ “EXIT” หลายๆครั้ง สุดท้ายกดคีย์ “MENU” กดลูกศรเลื่อนลงไปด้านล่าง จะเห็นไอคอน “UTM Geo” จากนั้นกดปุ่ม “EXE”

ทดสอบการใช้งานโปรแกรมแปลงพิกัด Geographic Calc

เมื่อกด “EXE” เข้าไปแล้วจะเห็นบรรทัดบนสุดแสดงชื่อโปรแกรม “Geographic Calc” มีเมนูแบบง่ายๆ 4 เมนูให้เลือกคือ ต้องการเลือกตัวไหนก็กดตัวเลขตามเมนู

    1.  UTM to Geo – แปลงพิกัดจากระบบพิกัดฉากยูทีเอ็มไปยังค่าพิกัดภูมิศาสตร์ Latitude/Longitude
    2. Geo to UTM – แปลงพิกัดจากระบบพิกัดภูมิศาสตร์ไปยังระบบพิกัดฉากยูทีเอ็ม
    3. MGRS to Geo – แปลงพิกัดจากระบบพิกัด MGRS ไปยังระบบพิกัดภูมิศาสตร์
    4. Geo to MGRS – แปลงพิกัดจากระบบพิกัดภูมิศาสตร์ไปยังระบบพิกัด MGRS

แปลงพิกัดจากระบบพิกัดฉากยูทีเอ็มไปยังค่าพิกัดภูมิศาสตร์ (UTM to Geo)

ที่เมนูกดคีย์เลข “1” เข้าไปโปรแกรมจะถามค่าพิกัด North, East และตัวเลขของโซนยูทีเอ็ม ลองป้อนข้อมูลตามตัวอย่าง

จะได้ผลลัพธ์ดังต่อไปนี้ ครับตามที่กล่าวไปแล้วได้ทศนิยมค่าแลตติจูด ลองจิจูด ตำแหน่งที่ห้า

แปลงพิกัดจากพิกัดภูมิศาสตร์ไปยังระบบพิกัดฉากยูทีเอ็ม (Geo to UTM)

ที่เมนูกดเลข “2” โปรแกรมจะถามค่าพิกัดภูมิศาสตร์ สามารถป้อนทศนิยมได้มากกว่า 5 ตัว ป้อนค่ามุมตัวคั่นองศา ลิปดา ฟิลิปดาให้ใช้เครื่องหมายลบ (-) ค่าแลตติจูดลงท้ายให้ป้อนตัวอักษร ถ้าซึกโลกเหนือให้ป้อน “N” ตามหลัง ตามเป็นซีกโลกใต้ให้ป้อน “S” หรือค่าลองจิจูดซึกโลกตะวันตกให้ป้อนคำว่า “W” ลงท้าย ซีกโลกตะวันออกให้ป้อน “E” ลงท้าย ดูตัวอย่าง

เมื่อกด “EXE” จะได้ผลลัพธ์ดังนี้

แปลงค่าพิกัดจาก MGRS ไปยังค่าพิกัดภูมิศาสตร์ (MGRS to Geo)

ที่เมนูกดปุ่ม “3” เลือก โปรแกรมจะถามค่าพิกัด MGRS ป้อนไปดังรูปด้านล่าง

กด “EXE” จะได้ผลลัพธ์ค่าพิกัดภูมิศาสตร์

แปลงค่าพิกัดจากค่าพิกัดภูมิศาสตร์ ไปยัง MGRS  (Geo to MGRS)

ที่เมนูกดเลข “4” ลองป้อนค่าพิกัดแลตติจูด ลองจิจูดเข้าไปดังรูป

กด “EXE” จะได้ค่าผลลัพธ์ดังรูป

สรุป

ในขณะที่ลองเขียนโปรแกรมสำหรับเครื่องคิดเลข fx-9860G II นี้ ผมยังทำงานที่บังคลาเทศ ใช้เครื่องคิดเลขของน้องๆ แต่ด้วยความประทับใจเครื่องรุ่นนี้เลยสั่งซื้อเครื่องที่เมืองไทยส่งไปที่บ้านรอกลับไปค่อยไปลองเครื่องใหม่อีกที (สั่งจาก mr.finance ที่รับของแล้วค่อยโอนเงินอีกที บริการประทับใจครับ) ด้วยสนนราคาประมาณตอนนี้สี่พันบาทปลายๆ รวม SD card  มีความรู้สึกว่าคุ้มค่า ไม่ลังเลเหมือนก่อน ผมมีโครงการจะเขียนโปรแกรมเล็กๆด้วยภาษาซีอีกหลายโปรแกรมเพื่อแจกจ่ายเป็นโปรแกรมให้พี่ๆน้องๆในวงการสำรวจได้ใช้งานกันโดยไม่ได้คิดมูลค่า

ขอเพิ่มเติมอีกนิดครับ บทความที่นำเสนอมานี้ไม่ได้มีเจตนาส่งเสริมการขายเครื่องคิดเลขรุ่น fx-9860G II SD นี้ให้ขายดีขึ้นแต่อย่างใด สำหรับน้องๆนักศึกษาหรือช่างสำรวจที่จบมาทำงานใหม่ๆ เครื่องคิดเลข fx-5800P สามารถใช้งานได้ทั่วๆไปได้เพียงพอ โปรแกรมที่มีขายแและแจกจ่ายในวงการบ้านเราก็สามารถหามาใช้งานกันได้อย่างเหลือเฟือ และราคาเครื่องคิดเลข fx-5800P ก็พอจะซื้อหามาใช้งานได้ แต่สำหรับเครื่องคิดเลขรุ่น fx-9860G II SD นั้นราคามากกว่า fx-5800P ประมาณ 2-3 เท่า ถ้ามีเงินเหลือใช้ก็หาซื้อหามาใช้กันได้ สำหรับคนที่มีงานทำแล้วก็พอจะสามารถเก็บเงินซื้อได้

ผมเขียนบทความนี้เพื่อวงการศึกษาช่างสำรวจบ้านเราที่สนใจเรื่องโปรแกรมมิ่งสามารถจะพัฒนาโปรแกรมภาษาซีบนเครื่องคิดเลขรุ่นนี้ได้ โดยที่มีไม่มีข้อจำกัดด้านภาษาโปรแกรมมิ่งแต่อย่างใด เหมือนภาษา basic casio อาจจะส่งผลให้ในอนาคต มีโปรแกรมที่พัฒนาโดยบุคคลากรท่านอื่นๆ เข้ามาสู่วงการนี้มากขึ้น และได้ตัวโปรแกรมงานสำรวจก็มีความหลากหลายและความสามารถมากขึ้น ในบทความตอนหน้าไม่กี่ตอนจากนี้ไปจะมีบทความ แนะนำการใช้เครื่องมือพัฒนาโปรแกรม SDK (Software Development Kit) ของ casio และเทคนิคการใช้เครื่องมืออื่นๆที่ แฮกเกอร์เครื่องคิดเลขรุ่นนี้ได้ reverse-engineering เขียนเผยแพร่ไว้ หรือแม้กระทั่งใช้ฟังก์ชั่นที่ไม่ได้เปิดเผยจากทาง casio เองก็ตาม พบกันใหม่ครับ

สนุกกับโปรแกรมเครื่องคิดเลขสำหรับงานสำรวจ ตอนที่ 1 โปรแกรมแปลงพิกัด “Geo2UTM” บนเครื่องคิดเลข Casio FX 5800P

  • สวัสดีครับท่านผู้อ่านทุกท่าน ในโอกาสที่บ.เคเอ็นเอส เอ็นจิเนียริ่ง คอร์ปอเรชั่น จำกัด มีอายุใกล้จะขวบปีแล้ว ผมในฐานะวัยแล้วเกือบจะรุ่นพ่อของน้องๆชุดนี้แล้ว เห็นความตั้งใจของน้องๆ และก็ยินดีเป็นอย่างยิ่ง ในโอกาสนี้ด้วยความที่สนิทสนมกันก็ถูกลากมาให้เขียนบทความให้เพื่อฉลองครบรอบหนึ่งปี และลงที่นี่ ไม่ใช่ที่บล็อก priabroy.com ที่ประจำ ตอนแรกคิดๆอยู่ว่าจะเขียนเรื่องอะไรดี แต่สุดท้ายก็จะเขียนเรื่องโปรแกรมมิ่งเครื่องคิดเลข เพราะว่าเครื่องคิดเลขเป็นเครื่องมือพื้นฐานที่สุดสำหรับช่างสำรวจ ช่างโยธาของเรา
  • บทความนี้คงจะมีหลายตอนก็มาติดตามกัน

ย้อนอดึตแห่งความทรงจำ

  • เครื่องคิดเลข Casio นับว่าเป็นขวัญใจของเราช่างสำรวจ ช่างโยธา ตอนเรียนอยู่วิทยาลัยหรือมหาวิทยาลัย บางคนอาจจะมีประสบการณ์ในการพาเครื่องไปฝากไว้ที่โรงจำนำเพราะกลัวทำหาย ^-^ ตอนสมัยเรียนช่วงปี 30-33 ผมใช้ FX3800 ปัจจุบันเลิกผลิตไปนานแล้ว เหลือไว้แต่ความทรงจำ สมัยแต่ก่อนเขียนโปรแกรมลงเครื่องพวกนี้คงได้แค่โปรแกรมเล็กๆ เพราะเครื่องมื memory ที่จำกัดจำเขี่ยมากๆ
Casio Fx3800
Casio Fx3800
  • ต่อมาทำงานได้สักสองปีก็ไปถอยเอาเครื่องในตำนาน  FX-880P ได้มาเครื่องหนึ่ง รุ่นนี้ปัจจุบันขึ้นหิ้งเป็นตำนานไปแล้ว ทั้งที่ผ่านระยะเวลามายี่สิบกว่าปี ยังมีคนตามล่าหากัน รุ่นนี้เวลาพกพาก็เสียบไว้ที่กระเป๋าหลังของกางเกงยีนส์ ดูมันเท่ห์ แต่พกแบบนี้ บางคนเผลอนั่งทับจนเครื่องคิดเลขหักเป็นท่อน น้ำตาตกกันมาแล้วก็มี โปรแกรมมิ่งรุ่นนี้ใช้โปรแกรมภาษาเบสิคแบบมีหมายเลขบรรทัดกำกับ เปิดโลกโปรแกรมมิ่งไปอีกหลายระดับ เขียนโปรแกรมยากๆได้พอสมควร การตั้งตัวแปรใช้ตัวอักษรหลายตัวได้ เครื่องเดิมๆ มี memory 32 กิโลไบต์ มันเยอะพอสมควร
Casio FX - 880P
Casio FX – 880P
  • ด้านหลังเครื่องรุ่นนี้ยังมีช่องให้ใส่แรมเพิ่มได้อีก 32 กิโลไบต์ ผมอุตส่าห์ไปเดินแถวสะพานเหล็ก คลองถมจนได้มาหนึ่งอัน เมื่อใส่แล้วก็รวมกันได้ 64 กิโลไบต์ คิดเป็น 65536 ไบต์ เหลือเฟือ ขนาดเขียนวงรอบเล่นๆ ยังไม่เต็มเลย
s-l300
Memory Pack 32KB for FX-880P
  • มาดูโปรแกรมสำหรับเครื่องคิดเลข FX-880P เพื่อรำลึกความหลัง ผมเขียนโปรแกรมนี้หาจุดตัดระหว่างเส้นตรงกับเส้นตรง เส้นตรงกับวงกลม วงกลมกับวงกลม ผมลงมาให้เต็มๆแบบไม่มีตัดทอน ตอนนี้ผมไม่มีเครื่องคิดเลขรุ่นนี้ให้ลองแล้ว

5 ‘Intersection
10 CLS:BEEP:BEEP1:ANGLE 0:SET F5:PRINT CHR$(9);:CLS
20 PRINT ” ***Find Intersection point***”
30 CLS:PRINT “<<1:AZI#AZI>> <<2:AZI#DIST>>”;:PRINT
40 PRINT”<<3:DIST#DIST>> <>”;
50 T$=INKEY$
60 IF (T$=”1″) THEN 150
70 IF (T$=”2″) THEN 600
80 IF (T$=”3″) THEN 800
90 IF (T$=”4″) THEN 400
100 IF (T$=”Q”) THEN PRINT TAB(10);”<<>>”;
:SET F9:END
110 GOTO 50
150 CLS:PRINT “N1=”;N1;:INPUT N1
160 PRINT “E1=”;E1;:INPUT E1
170 PRINT “AZIMUTH1=”;AZI1;:INPUT AZI1
180 FANG=AZI1:GOSUB 3000:DAZI1=DANG
190 PRINT “N2=”;N2;:INPUT N2
200 PRINT “E2=”;E2;:INPUT E2
210 PRINT “AZIMUTH2=”;AZI2;:INPUT AZI2
220 FANG=AZI2:GOSUB 3000:DAZI2=DANG
230 DELTY=N2-N1:DELTX=E2-E1
240 GOSUB 3500:AZI12=Y:DIST12=X
250 NI=(TAN(DAZI2)*N2-TAN(DAZI1)*N1+E1-E2)/(TAN(DAZI2)-
TAN(DAZI1))
260 EI=(NI-N1)*TAN(DAZI1)+E1
290 PRINT “NI= “;NI;:PRINT
300 PRINT “EI= “;EI
310 GOTO 30
400 ‘Four points
410 CLS:PRINT “N1= “;N1;:INPUT N1
420 PRINT “E1= “;E1;:INPUT E1
430 PRINT “N2= “;N2;:INPUT N2
440 PRINT “E2= “;E2;:INPUT E2
450 PRINT “N3= “;N3;:INPUT N3
460 PRINT “E3= “;E3;:INPUT E3
470 PRINT “N4= “;N4;:INPUT N4
480 PRINT “E4= “;E4;:INPUT E4
490 DELTY=N2-N1:DELTX=E2-E1:GOSUB 3500:AZI12=Y:DIST12=X
500 DELTY=N4-N3:DELTX=E4-E3:GOSUB 3500:AZI34=Y:DIST34=X
510 DELTY=N3-N1:DELTX=E3-E1:GOSUB 3500:AZI=Y
512 IF (AZI12=90 OR AZI12=270) THEN NI=N1 ELSE 515
513 EI=(NI-N3)*TAN(AZI34)+E3
515 IF (AZI34=90 OR AZI34=270) THEN NI=N3 ELSE 520
520 IF NOT((AZI12=90 OR AZI12=270) OR (AZI34=90 OR
AZI34=270)) THEN NI=(TAN(AZI34)*N3-TAN(AZI12)*N1+E1-
E3)/(TAN(AZI34)-TAN(AZI12)) ELSE 540
530 EI=(NI-N1)*TAN(AZI12)+E1
540 PRINT “NI= “;NI;:PRINT
550 PRINT “EI= “;EI
560 GOTO 30
600 ‘AZI # DIST
610 CLS:PRINT “N1= “;N1;:INPUT N1
620 PRINT “E1= “;E1;:INPUT E1
630 PRINT “AZIMUTH= “;INAZI;:INPUT INAZI:FANG=INAZI:GOSUB
3000:DAZI1=DANG
635 CANG=0:PAZI=DAZI1:GOSUB 4500:DAZI2=NAZI
640 PRINT “N2= “;N2;:INPUT N2
645 PRINT “E2= “;E2;:INPUT E2
650 PRINT “DIST= “;DIST;:INPUT DIST
660 DELTY=N2-N1:DELTX=E2-E1:GOSUB 3500:DIST12=X:AZI12=Y
670 PHI1=AZI12-DAZI1:IF PHI1 675 PHI2=AZI12-DAZI2:IF PHI2 Int No.1
900 CANG=ANG2:PAZI=AZI12:GOSUB 4500:AZI2I2=NAZI
910 PNI=N2+DIST2*COS(AZI2I1)
920 PEI=E2+DIST2*SIN(AZI2I1)
930 MNI=N2+DIST2*COS(AZI2I2)
940 MEI=E2+DIST2*SIN(AZI2I2)
950 CLS:BEEP:PRINT “NI(1)= “;PNI;:PRINT
960 PRINT “EI(1)= “;PEI
970 CLS:PRINT “NI(2)= “;MNI;:PRINT
980 PRINT “EI(2)= “;MEI
990 GOTO 30
3000 ‘Convert input angle to degree
3010 DD=FIX(FANG)
3020 TEMP=FRAC(FANG)*100
3030 MM=FIX(TEMP)
3040 SS=FRAC(TEMP)*100
3050 DANG=DEG(DD,MM,SS)
3060 RETURN
3500 ‘Find Azimuth
3510 X=POL(DELTY,DELTX)
3520 IF Y180 THEN 4550 ELSE 4530
4530 TEMP=TEMP+180
4540 GOTO 4590
4550 IF TEMP>540 THEN 4580
4560 TEMP=TEMP-180
4570 GOTO 4590
4580 TEMP=TEMP-540
4590 NAZI=TEMP
4600 RETURN

ถึงยามต้องพรากจากกัน

  • ผ่านไปหลายปีสำหรับการทำงานในภาคสนาม ไปไหนมาไหนก็หอบเครื่องคิดเลขรุ่นนี้ไปใช้งาน ก่อนจะจากกันผมทิ้งเครื่องคิดเลขไว้ที่ตู้คอนเทนเนอร์หน้าไซต์งาน เพราะลูกน้องเอาไปใช้บ้าง ไม่ได้เอากลับที่พักตอนยามค่ำคืน คืนนั้นไฟฟ้าลัดวงจรที่ตู้คอนเทนเนอร์ ทราบข่าวอีกทีก็วอดแล้ว ยืนคอตกไปพักใหญ่ๆ เพราะว่าทรัพย์สินทางปัญญาหายวับไปกับพระเพลิง แต่ด้วยความไม่ประมาท ผมลอก Source code ไว้ที่เครื่องคอมพิวเตอร์ไว้บ้างแต่ไม่ทั้งหมด
  • ถึงแม้จะรู้ว่าใดๆในโลกนี้ล้วนอนิจจัง แต่ประสบการณ์เรื่องนี้ทำให้การใช้งานคอมพิวเตอร์ผมจะแบ็คอัพข้อมูลที่ทำงานได้สอง สามที่เสมอ และที่สำคัญคือผมชอบโปรแกรมมิ่ง จะเก็บ source code ไว้อย่างดี เก็บไว้หลายๆที่เช่นกัน แต่อย่างไรก็ตามต้องขยัน back up ครับ ถ้ามันพังในวันนี้ยังเอาของเมื่อวานมาใช้งานได้

สิบปีที่เครื่องคิดเลขห่างหาย

  • ตั้งแต่นั้นเป็นต้นมาผมก็ไม่เคยซื้อเครื่องคิดเลขอีกเลยประมาณสิบปี เพราะว่าเป็นยุคเวลาของโน๊ตบุ๊ค เอะอะจะคำนวณอะไรๆก็ต้องที่โน๊ตบุ๊ค แต่ชีวิตเหมือนขาดอะไรไป จนมาถึงยุคมือถือจอสัมผัสยิ่งแล้วไปกันใหญ่ เพราะมีโปรแกรมจำลองเครื่องคิดเลขมาให้ใช้งาน วันนั้นไปเดินห้างเห็นเครื่องคิดเลข FX 5800P วางอยู่ที่ชั้นขายของ ป้ายบอกลดราคาเหลือ 1990 บาท จากราคาเดิม 2890 บาทคิดอยู่ในใจว่ามันลดราคากระหน่ำแท้ๆ ราคานี้ไม่รวมสายลิ๊งค์ ดูสเป็คบอกว่าเขียนโปรแกรมได้ มีเม็มโมรีมาให้ 28500 ไบต์ ผมนึกถึง Fx-880P ทันที ตัดสินใจซื้อมาลอง ที่ไหนได้มาถึงบ้านเปิดดูในเน็ตเห็นราคาขายออนไลน์ราคา 1790 บาทได้สายลิ๊งค์ด้วย มันถูกว่ากว่าที่ผมซื้อหลายร้อยบาท เอาละวะ ภูมิใจที่ได้ใช้ของแพงกว่า
Casio FX5800P
Casio FX5800P

FX 5800P กับอารมณ์กระชากใจเหมือนกลับไปเรียน (Back to old school) อีกครั้ง

  • เอาละครับ ได้ใช้เครื่องคิดเลขจริงๆสักที คือหลายสิบปีที่ผ่านมาเหมือนรออะไรบางอย่าง แต่ไม่รู้ว่ามันคืออะไร เจออีกทีใช่เลย เวลากดคีย์เครื่องคิดเลขมันมีการตอบสนองได้อารมณ์เหมือนได้กลับไปใช้และเรียนมหาวิทยาลัยอีกครั้ง ผมเริ่มอ่านคู่มือเพื่อจะเขียนโปรแกรม ใช้เวลาไม่มากนักเพราะคุ้นๆอยู่ คู่มืออะไรก็หาง่ายในยุคนี้ ดาวน์โหลดมาอ่านได้สบายๆ
  • ช่วงเริ่มต้นกับเครื่องคิดเลข ผมเริ่มโปรแกรมง่ายๆก่อนเช่นจำพวก Cogo เช่นหามุม ระยะทางเมื่อกำหนดค่าพิกัดของจุดสามจุด ความรู้สึกแรกคือชอบเครื่องคิดเลขรุ่นนี้พอสมควร
  • เคยคิดเล่นๆว่าเครื่องคิดเลขพวกนี้ ยกเว้น FX-880P ที่เทพไปแล้ว จะสามารถเขียนโปรแกรมระดับ Advance ได้ไหมเช่นแปลงพิกัดไปมาระหว่าง UTM และ ค่าพิกัดภุมิศาตร์ (Geographic) หาระยะทางระหว่างสองจุดบน Ellipsoid หรือหาระยะทาง Geodesic distance

ข้อจำกัดด้านโปรแกรมมิ่งแต่ฟ้าปิดกั้นดินไม่ได้

  • จั่วหัวให้เว่อร์ซะยังงั้น ปัญหาจริงๆที่คนจะเขียนโปรแกรมพวกนี้คืออย่างแรกคือสูตร ไม่รู้จะใช้เวอร์ชั่นไหนดี อย่างที่สองคือเครื่องคิดเลขรุ่นพวกนี้มีตัวแปรจำกัด จาก A ถึง Z นับได้ 26 ตัว น้อยซะจริงๆ ถ้าสูตรมีการใช้ตัวแปรมากกว่านี้จะทำอย่างไร ปัญหานี้ยังมีทางออก เครื่องคิดเลขรุ่นนี้เตรียมตัวแปรอนุกรมให้คือ Z เราสามารถใช้งาน Z[1],Z[2],Z[3],…. ได้มากเท่าที่เมมโมรีเครื่องคิดเลขยังเหลือพอ
  • ข้อจำกัดอีกอย่างคือไม่สามารถนำไฟล์ข้อมูลให้โปรแกรมได้ ดังนั้นโปรแกรมเครื่องคิดเลขจึงจะต้องไม่ซับซ้อนมาก ถ้ามากกว่านี้ต้องใช้เครื่องคอมพิวเตอร์จะดีที่สุด

โปรแกรมแปลงพิกัดจากค่าพิกัดภูมิศาสตร์ ไปยัง ค่าพิกัดระบบพิกัดฉาก UTM

  • ก่อนจะไปต่อเรื่องโปรแกรมมิ่ง มาเรียกน้ำย่อยกันก่อน มาดูรูปการคำนวนกันก่อน ต้องการแปลงค่าพิกัด lat=14°27’44.71″ long=100°58’27.02″ ไปยังค่าพิกัด UTM

input_geo

  • แปลงพิกัดเป็น UTM ได้ค่า N=1599784.382 E=712796.211

output_utm1

  • และคำนวน zone  ของ UTM มาให้ด้วยจุดพิกัดนี้อยู่ในโซน 47

output_utm2

แปลงพิกัดบน WGS84

  • สำหรับโปรแกรมจะแปลงพิกัดบนพื้นฐาน WGS84 เท่านั้น ไม่มีการแปลงข้ามพื้นหลักฐานเพราะมันจะซับซ้อนยุ่งยากเกินกว่าเครื่องคิดเลข เมมโมรีน้อยๆจะทำได้

โปรแกรมคำนวณ

  • ข้อจำกัดอีกอย่างของเครื่องคิดเลขรุ่นนี้คือสามาถใช้สายลิ๊งค์โอนโปรแกรมจากเครื่องไปหาเครื่องอื่นเท่านั้น แต่ถ้าโอนโปรแกรมเข้าเครื่องคอมพิวเตอร์ผมพยายามหาในเน็ตตามฟอรั่ม มีคนพยายามจะแกะโปรโตคอลแต่ไม่น่าจะสำเร็จ ที่นี้จะเอาโปรแกรมมาแสดงบนคอมพิวเตอร์ได้ยังไง ก็ต้องนั่งแกะโปรแกรมทีละเม็ด เขียนด้วยเวิร์ดเพราะต้องการสัญลักษณ์ให้ตรงกับที่แสดงในเครื่องคิดเลขมากที่สุด สัญลักษณ์ส่วนใหญ่หาได้ในฟอนต์ Symbol, Wingdings
  • เมื่อแกะเสร็จแล้วก็ดูทวนอีกทีว่าพิมพ์ได้ตรงกับในเครื่องคิดเลขไหม ไม่มีอะไรตกหล่นก็ export มาเป็นภาพเอามาแปะ ผมพยายามแยกสีให้ดูง่ายตรงไหนเป็นฟังก์ชันใช้สีแดงเข้ม ตัวแปรสีน้ำเงิน เงื่อนไขโปรแกรมใช้สีเขียว ลองดูครับ
Geo2UTM
Geo2UTM
Geo2UTM(continued)
Geo2UTM(continued)
  • สำหรับเครื่องคิดเลขแล้ว ก็ไม่ถือว่าโปรแกรมใหญ่มากนัก แต่สังเกตดูตัวแปร ตั้งแต่ตัว A ถึงตัว Z ใช้แทบหมด ผมคงไม่อธิบายตัวโปรแกรมนะครบ จะยืดเยื้อ สำหรับคนที่เคยเขียนโปรแกรมเครื่องคิดเลขคาสิโอ้รุ่นเหล่านี้ มองแป๊ปเดียวก็โอเคแล้ว

วิธีใช้งาน

  • วิธีใช้งานก็ง่ายครับตามสไตล์เครื่องคิดเลข กดเรียกโปรแกรมก่อน Shift+Prog ที่เครื่องคิดเลขผมเลือก “GEO2UTM

20170108_122613

ตัวอย่างที่ 1

  • โปรแกรมจะถามค่าพิกัดแลตติจูดและค่าลองจิจูด ตัวอย่างการใช้นี้กำหนดให้ latitude = 26°12’3.6128″N longitude = 50°36’25.1928″E ที่เครื่องคิดเลขกดคีย์ “EXE” โปรแกรมจะถามค่าแลตติจูด ป้อนไปให้ทศนิยมครบ ตามรูปแรก  (เครื่องคิดเลขเวลาแสดงค่าพิกัดที่เราป้อนไปแล้ว จะแสดงแค่ทศนิยมสองตำแหน่ง) และป้อนค่าลองจิจูดให้ตามรูปถัดไป

20170108_123456

20170108_123609

ผลลัพธ์การคำนวณ

  • โปรแกรมจะคำนวณค่าพิกัดฉาก UTM ให้พร้อมบอกหมายเลขโซนของยูทีเอ็มมาด้วยและบอกว่าเป็นโซนด้านเหนือหรือด้านใต้ของเส้นศูนย์สูตร ในที่นี้จุดค่าพิกัดนี้แถวประเทศบาเรนห์ โซน 39N (เหนือ)

20170108_130154 20170108_130205

  • เทียบกับค่าที่คำนวณด้วยโปรแกรม Surveyor Pocket Tools ตรงกันครับ หมายเหตุนิดหนึ่งว่าการคำนวณการแปลงพิกัดในโปรแกรม  Surveyor Pocket Tools ใช้ไลบรารีของ Proj4 ผ่านทาง pyproj
Surveyor Pocket Tools
Surveyor Pocket Tools

ตัวอย่างที่ 2

  • มาลองดูกัน ถ้าผู้อ่านเกิดจับพลัดจับผลูไปทำงานต่างประเทศที่อยู่ใต้เส้นศูนย์สูตร ก็ยังสามารถใช้ได้ กำหนด แลตติจูด = 16d9’7.048″S ลองจิจูด = 33d33’49.779″E ค่าพิกัดอยู่ที่ประเทศโมซัมบิค ทวีปอาฟริกา
  • ป้อนค่าพิกัดเข้าดังนี้ ค่าแลตติจูดอยู่ใต้เส้นศูนย์สูตรให้ติดเครื่องหมายลบข้างหน้า ส่วนค่าพิกัดลองจิจูดก็ป้อนปกติ

20170108_132745
20170108_132903

  • ผลลัพธ์การแปลงพิกัดได้ดังนี้ จุดอยู่ที่โซน 36S ใต้เส้นศูนย์สูตร

20170108_132916
20170108_132923

  • เปรียบเทียบผลการคำนวณกับ Surveyor Pocket Tools ตรงกัน

surveyor-pocket-tools_2017-01-08_13-31-09

  • ก็พอหอมปากหอมคอครับ ตอนหน้ามาดูโปรแกรมแปลงค่าพิกัดฉากยูทีเอ็ม (UTM) ไปยังค่าพิกัดภูมิศาสตร์บ้าง ติดตามกันตอนต่อไปครับ

สนุกกับโปรแกรมเครื่องคิดเลขสำหรับงานสำรวจ ตอนที่ 2 โปรแกรมแปลงพิกัด “UTM2Geo” บนเครื่องคิดเลข Casio FX 5800P

โปรแกรม “UTM2Geo” สำหรับเครื่องคิดเลข Casio FX 5800P

  • สวัสดีครับผู้อ่านทุกท่าน พบกันตอนนี้เป็นตอนที่ 2 แล้วครับ ตอนแรกนำเสนอโปรแกรม “Geo2UTM” แปลงพิกัดจากคาพิกัดภูมิศาสตร์ (แลตติจูด/ลองจิจูด) ไปเป็นค่าพิกัดบนระบบพิกัดฉาก UTM มาตอนนี้กลับกันครับ เราจะมาเขียนโปรแกรมที่แปลงพิกัดจากระบบพิกัดฉากยูทีเอ็มไปเป็นค่าพิกัดภูมิศาสตร์
  • มาเขียนบทความที่นี่ให้กับ kns-engineering เป็นการเฉพาะกิจ สำหรับเพื่อนพี่น้องชาวสำรวจแวะไปเยี่ยมเยียนผมได้ที่บล็อกประจำ priabroy.name

เกร็ดความรู้เล็กน้อยสำหรับช่างสำรวจ

  • ก่อนจะเข้าไปว่าเรื่องโปรแกรมมิ่งบนเครื่องคิดเลข ขอซักซ้อมความรู้เซอร์เวย์สักเล็กน้อย มีสองอย่างคือมุม อะซิมัท (Azimuth) และฟังก์ชัน Atan2 สองอย่างนี้เกี่ยวพันกับเรื่องโปรแกรมในด้านการสำรวจเสียส่วนใหญ่ (แต่งานคำนวณแปลงพิกัดนี้ไม่ได้ใช้)
  • มุมอะซิมัทเป็นมุมที่แสดงทิศทางในด้านงานสำรวจของเรา เป็นมุมที่กวาดจากทิศเหนือตามเข็มนาฬิกา สมมติว่ามีจุด A มีค่าพิกัด (x,y,) = (500,500) และจุด B มีค่าพิกัด (x,y) = (586.603,550) คำถามพื้นฐานก็คือ
    • อะซิมัทจากจุด A ไปจุด B เท่าไหร่
    • อะซิมัทจากจุด B ไปจุด A เท่าไหร
    • ระยะทางหรือระยะราบเท่าไหร่ระหว่างจุดทั้งสอง

  • ระยะราบหาได้จากสูตรตรีโกณมิติสามัญพื้นฐาน ระยะราบ = √((500-586.603)² + (500-550)²) = 100 เมตร
  • แล้วอะซิมัทละคำนวณอย่างไร การคำนวณจะมาเกี่ยวพันกับเครื่องคิดเลขของเราอย่างแนบแน่น ฟังก์ชัน Atan2 เรียกกันบนเครื่องคอมพิวเตอร์ (ใครเขียนโปรแกรมบนเครื่องคอมพิวเตอร์จะรู้จักฟังก์ชั่นนี้ดี มีทุกภาษา) เที่ยบเท่าบนเครื่องคิดเลขก็คือ Pol() คือฟังก์ชั่นการที่จะมาช่วยย่นการคำนวณนี้
  • Atan2 ดั้งเดิมจะคำนวณหามุมที่กวาดจากแกน X ทวนเข็มนาฬิกา ดังนั้นในคู่มือคาสิโอ จะเขียนฟังก์ชั่น Pol() แบบนี้ครับ ในวงเล็บ x มาก่อน  y สังเกตว่ามุม θ กวาดจากแกน X

  • แต่สำหรับมุมที่ต้องการสำหรับงานสำรวจคือมุมอะซิมัท(Azimuth) คือมุมคือกวาดจากแกน Y ลงมาตามเข็มนาฬิกา จะทำอย่างไร
  • เทคนิคเวลาใช้งานสลับเอาไว้ค่า Y มาก่อนและ X ตามหลังครับ >> Pol(y,x) จะได้มุมอะซิมัท ผมเขียนรูปใหม่ดังนี้

  • ถ้ามีเครื่องคิดเลขก็ลองกดดูเลย Pol((550-500),(586.603-500))  ผลการคำนวณเครื่องคิดเลขเอาค่าระยะทางไปเก็บไว้ในตัว “I” และมุมอะซิมัทไว้ในตัว “J” ลอง RCL (recall) มาดูจะได้ I = 100.000 และ J = 60.000 มุม 60 ก็คืออะซิมัทจาก A ไป B นั่นเอง
  • จากโจทย์ข้างบนก็ตอบได้นะครับ อะซิมัทย้อน (Backward) ก็ให้เอาอะซิมัทไป (Forward) ± 180 ถ้ามากกว่า 180 ให้เอา 180 ไปลบ ถ้าน้อยกว่า 180 ให้เอา 180 ไปบวก ดังนั้นอะซิมัทจาก B มา A จะได้ = 60 + 180 = 240 
  • มุมอะซิมัทเป็นมุมมหัศจรรย์สำหรับช่างสำรวจ มหัศจรรย์ยังไงตอนหน้ามาว่ากันต่อ ตอนนี้ไปต่อเรื่องโปรแกรมกัน

โค๊ดโปรแกรม UTM2Geo

  • เหมือนเดิมนั่งแกะโปรแกรมทีละเม็ดแล้วเขียนลงในเวิร์ด แล้วตรวจทานสอง สามเที่ยว น้ำตาไหลพราก  ผมก็คิดเหมือนกันว่าผู้อ่านไปคีย์โปรแกรมตามที่ผมลิสต์ออกมาคงไม่ใช่เรื่องสนุก เอาอย่างนี้ ถ้าไม่อยากคีย์โปรแกรมเอง ติดต่อน้องๆที่ท้ายบล็อกผมจะลงชื่อไว้เพื่อขอดูดโปรแกรม มีข้อแม้เล็กๆน้อยๆว่าเครื่องต้องเป็นเครื่อง Casio Fx-5800P รุ่นเดียวกันและพกสายลิ๊งค์มาด้วยตัวเอง

ต้วอย่างที่ 1

  • สำหรับท่านที่ต้องการป้อนโปรแกรมลงในเครื่องคิดเลข วิธีป้อนโปรแกรมเลงเครื่องคิดเลขคงไม่ต้องสาธยายนะครับเพราะคงคุ้นเคยกันอยู่ มาดูการใช้งาน สมมติว่ามีหมุดที่มีค่าพิกัดฉาก UTM ดังนี้
    • Northing = 1,615,517.540 Easting = 395,698.272 Zone 47N อยู่บนพื้นหลักฐาน WGS84
  • เรียกโปรแกรม ด้วยการกด “Prog” แล้วเลือกโปรแกรม “UTM2Geo

  • ป้อนค่าพิกัด Norhting, Easting

  • ต่อไปโปรแกรมจะถาม Zone No ลำดับโซนหมายเลขที่เท่าไหร่ ถ้าโซนอยู่ด้านเหนือเส้นศูนย์สูตรให้ป้อนค่าบวกเช่น 47N ก็ป้อนตัวเลขธรรมดาไปครับ แต่ถ้าอยู่ใต้เส้นศูนย์สูตรป้อนเป็นตัวเลขลบ ในที่นี้ป้อนตัวเลข 47 เข้าไปดังรูป

ผลลัพธ์ของโปรแกรม

  • มาดูผลลัพธ์กันครับ

  • ผมเอาค่าพิกัดฉากนี้ไปป้อนในโปรแกรมแปลงพิกัด UTM-Geo Converter ที่อยู่ใน Surveyor Pocket Tools ก็ได้ตรงกันครับ แต่ทศนิยมในเครื่องคิดเลขที่ฟิลิปดาได้เต็มที่สองตำแหน่ง (น่าเสียดาย ทศนิยมของฟิลิปดาตำแหน่งที่สอง เทียบเป็นหน่วยเมตริกแล้วได้แค่ระดับหลักสิบเซนติเมตร) ถ้าต้องการหลักมิลลิเมตรก็ต้องบนคอมพิวเตอร์แล้วครับ แต่สำหรับเครื่องคิดเลขคิดมาได้ขนาดนี้ผมก็โอเคแล้วครับ

 ตัวอย่างที่ 2

  • สมมติว่าผู้อ่านมีโอกาสไปทำงานต่างประเทศไกลๆ มาลองค่าพิกัดที่อยู่โซนตะวันตกและอยู่ใต้เส้นศุนย์สูตรกันดูครับ สมมติว่าค่าพิกัดนี้อยู่ในบราซิลครับ ชีวิตจริงไม่เคยไปถึงทวีปอเมริกาครับ ไกลสุดแค่ยุโรปกับทวีปอาฟริกา
    •  Northing = 7,721,526.876 Easting = 505,464.207 Zone 24S บนพื้นหลักฐาน WGS84
  • พร้อมแล้วเรียกโปรแกรมป้อนตัวเลขกันเลย

 

  •  ต่อไปหมายเลขโซนให้ป้อนตัวเลขเป็นลบ -24 เพราะอยู่ใต้เส้นศูนย์สูตร

  • มาดูผลลัพธ์กัน จะได้ค่า Latitude = -20°36’19.28″ ค่าเป็นลบแสดงว่าอยู่ใต้เส้นศูนย์สูตร ได้ค่า Longitude = -38°56’51.220″ ได้ค่าเป็นลบแสดงว่าอยู่ทางด้านตะวันตกของตำบลกรีนนิช ของอังกฤษ (ตำบลกรีนนิชค่าลองจิจูด = 0)

  • เปรียบเทียบกับ Surveyor Pocket Tools เท่ากัน

  • ทรรศนะส่วนตัวผมมีโปรแกรมแปลงพิกัดติดเครื่องคิดเลขรุ่นนี้ FX – 5800P ทำให้เครื่องคิดเลขดูเทพขึ้นมาทันตาเห็น 🙂 สองโปรแกรมนี้กินเม็มไปจิ๊บๆครับ
  • ตอนหน้ามาว่าเรื่องยากขึ้นไปอีกนิด การคำนวณระยะทางที่สั้นที่สุดบนทรงรี (Geodesic distance) สูตรลากกันยาวเฟื้อย ตัวแปรบนเครื่องคิดเลขใช้หมดเกลี้ยงต้องไปดึงตัวอนุกรมมาช่วยด้วย ถ้าพิมพ์โปรแกรมตามผมต้องร้องว่า เจ็บกว่านี้มีอีกไหม
  • ตอนหน้ามาว่ากัน แต่ผมบอกก่อนว่าในฐานะช่างสำรวจ เรื่อง  geodesic distance บางครั้งเราใช้มันอย่างไม่รู้ตัว และไม่ใช่เรื่องไกลตัว ขอฝากน้องๆไว้ครับ มีความรู้ก็ใส่ตัวก็ใช่ว่าจะต้องไปเหนื่อยแบกหามตามโบราณที่ว่าไว้

ติดต่อขอลิ๊งค์โปรแกรม

  • ติดต่อคุณนันทวุฒิ อึ้งตระกูลได้ครับสำหรับลิ๊งค์ดูดโปรแกรม ผมจะฝากโปรแกรมไว้ที่นั่น แต่ถ้าใจไม่ร้อน รอบทความอีกสักสอง สามตอนจบก่อนก็ดี (เพราะบางโปรแกรมที่จะนำเสนอยังไม่ได้เขียนลงเครื่องคิดเลข)
  • สังคมจะน่าอยู่ ถ้าแบ่งปันกันและเอื้อเฟื้อเผื่อแผ่สำหรับคนที่มีโอกาสน้อยกว่า พบกันตอนใหม่ครับ

สนุกกับโปรแกรมเครื่องคิดเลขสำหรับงานสำรวจ ตอนที่ 3 โปรแกรมคำนวณระยะทางบนทรงรี สำหรับเครื่องคิดเลข Casio FX 5800P

โปรแกรมคำนวณระยะทางที่สั้นที่สุดบนทรงรี (Geodesic Distance)

  •  สวัสดีครับผู้อ่านกลับมาพบกันอีกครั้ง ครั้งนี้หอบเอาสูตรยาวๆมาฝากกัน เรื่องระยะทางบนทรงรีความจริงจัดอยู่ในหมวด  Geodesy ที่ถือว่าเป็นเรื่องยากสำหรับนักศึกษาสมัยก่อน เพราะคำนวณทีต้องเปิดตารางล็อก สมัยนี้ถ้าทำความเข้าใจก็ไม่ได้ยากแล้วครับ มีตัวช่วยมากมายเช่นเครื่องคอมพิวเตอร์
  • ระยะทางที่สั้นที่สุดบนทรงรีเรียกว่า Geodesic Distance ถือว่าเป็นะระยะทางที่สั้นที่สุดบนทรงรี จัดเป็นสูตรที่มีมานานนมแล้ว นักคณิตศาสตร์สมัยก่อนคิดค้นขึ้นมาเพื่อช่วยในการคำนวณระยะทางที่สั้นที่สุดเช่นสำหรับการเดินเรือเดินข้ามมหาสมุทร เพราะแผนที่ที่เราใช้กัน ถ้าเมืองท่าที่ต้องการเดินทางนั้นอยู่กันไกลหลายพันไมล์ทะเล จะเอาดินสอมาขีดตรงๆเชื่อมกันบนแผนที่เดินเรือ จะได้ระยะทางที่ไม่ใช่ใกล้ที่สุด จะกลายอ้อมไป
  • เคยสังเกตเวลานั่งเครื่องบินไปต่างประเทศไกลๆไหมครับ จะมีรูปเส้นทางบินบนจอมอนิเตอร์ให้ดู จะเห็นเส้นทางบินเป็นเส้นโค้งๆ ไม่ใช่ตรงๆ นั่นเป็นเพราะเส้นโครงแผนที่ ความจริงแนวเครื่องบินก็ไม่ได้เฉไปไหน แต่เมื่อเอาแนวบินมาวาดบนแผนที่ที่ใช้เส้นโครงแผนที่แบบรักษารูปร่าง(Conformal) ที่เราใช้กันในปัจจุบันเช่น UTM เส้นทางบินจะกลายเป็นเส้นโค้งไป

  • ก่อนจะไปต่อ ผมอยากจะพูดถึงระยะทางอีกระยะทางหนึ่งบนทรงกลม เรียกว่า Great Circle Distance คือระยะทางที่สั้นที่สุดบนทรงกลม คนโบราณนำระยะทางนี้มาคำนวณเส้นทางการเดินเรือ เส้นทางการบิน แต่เนื่องจากโลกเราไมได้กลมแต่ทรงคล้ายออกมาทางทรงรีมากกว่า Geodesic distance เลยแม่นกว่า Great circle distance แต่คนก็ยังนิยมใช้ Greate circle distance มากกว่าอยู่ดีถึงจะคลาดเคลื่อนจาก Geodesice distance ไปประมาณ 0.1% แต่ก็คำนวณง่ายกว่า ในสูตรไม่มีการวนลูป เรียกสูตรการคำนวณบนทรงกลมนี้ว่า “Haversine
  • ถ้าสนใจเรื่อง Geodesic distance และ Greate circle distance ในรายละเอียดและโปรแกรมคำนวณบนคอมพิวเตอร์ติดตามได้ในโปรแกรม Survey Pocket Tools ของผมได้ที่บล็อก priabroy.name

การประยุกต์ใช้งาน

  • บางคนอาจจะว่าไกลตัว แต่เวลาเราค้นหาเส้นทางสำหรับโปรแกรมนำทาง (Navigator) บนโทรศัพท์มือถือทั้งหลาย ทราบไหมว่าเขาคำนวณระยะทางได้อย่างไร อย่างของ google maps ไม่มีเอกสารเปิดเผย แต่หลักการคือเส้นทางต่างๆของกูเกิ้ลจะต่อกันเป็นจุดๆ เรียกว่า node แต่ละโหนดจะมีค่าพิกัดแลตติจูด/ลองจิจูด กำกับอยู่ โปรแกรมจะคำนวณหาระยะทางระหว่างแต่ละโหนดด้วยการนำค่าพิกัดดังกล่าวมาเข้าสูตรคำนวณระยะทางที่สั้นที่สุดบนทรงรี (geodesic distance) หรือไม่ก็ระยะทางบนทรงกลม (great circle distance) เมื่อนำระยะทางแต่ละเส้นมารวมๆกันก็จะได้เป็นระยะทางแสดงให้เราดูบนหน้าจอโทรศัพท์มือถือ
  • ส่วนการเลือกเส้นทางจากต้นทางไปจุดหมายปลายทางแต่ละสถานที่ ว่าไปตามถนนเส้นไหนจะสั้นที่สุดอยูในเรื่อง Travelling Salesman Problem (TSP) อันนี้ลึกซึ้งมากครับ ไม่ขอกล่าวถึง
  • ในฐานะช่างสำรวจ เราใช้กันมันเกือบทุกวันโดยที่ไม่รู้ตัว ก็ลองมาศึกษากันหน่อยว่ามันทำงาน คำนวณมาให้ได้อย่างไร แต่ก่อนจะไปกันต่อ มาลองซักซ้อมเรื่องความรู้เซอร์เวย์กันเล็กน้อยก่อน

เกร็ดความรู้เล็กน้อยสำหรับช่างสำรวจ

  • วันนี้มาว่ากันต่อเรื่องมุมอะซิมัทและฟังก์ชั่น Rec() บนเครื่องคิดเลข Casio FX-5800P ฟังก์ชัน Rec() เอาไว้คำนวณหาค่าพิกัดปลายทาง เมื่อทราบค่าพิกัดต้นทาง, ระยะทางและอะซิมัท
  • Rec(r,θ) เขียนใหม่เป็น Rec(ระยะทาง, อะซิมัท) ก่อนจะเข้าวิธีการใช้งาน มาเท้าความกันหน่อย

  • ลองมาดูรูปด้านบน กำหนดมุมอะซิมัท (θ) และระยะทาง (R) ต้องการหาระยะทางไปตามแกน X จากจุด A ไปหาจุด B หา ได้เท่ากับ  ระยะทาง x Sine (มุมอะซิมัท)
    • ΔX = R x Sin(θ)  เรียกว่า “Departure” คุ้นๆไหม
  • ระยะทางไปตามแกน Y จากจุด A ไปจุด B
    • ΔY= R x Cos(θ)  เรียกว่า “Latitude”
  • ดังนั้นค่าพิกัดจุด A หาได้จาก
    • XB  = XA + ΔX = XA + R x Sin(θ)
    • YB  = YA + ΔY = YA + R x Cos(θ) 
  • ถ้าจำสูตรยากหรือขี้เกียจจำ ฟังก์ชั่น Rec() ช่วยได้ มาดูตัวอย่าง

  • ต้องการทราบค่าพิกัด A เมื่อทราบค่า (X,Y) ของจุด B ดังรูปด้านบน ระยะทาง 100 เมตร อะซิมัทจาก B ไป A = 240º
    • แทนค่าลงไปในสูตร Rec(ระยะทาง, อะซิมัท) = > กดเครื่องคิดเลขเลย Rec(100,240) ผลการคำนวณได้ผลลัพธ์มาสองอย่างคือ ΔX เก็บไว้ในตัวแปร “J” ส่วนค่า ΔY เก็บไว้ในตัวแปร “I”
    •  ผู้อ่านจะสังเกตว่าทำไม  ΔX ไม่เก็บไว้ในตัวแปร “I” และ ΔY ไม่เเก็บไว้ในตัวแปร “J” อย่างที่มันควรจะเป็น ต้องไม่ลืมว่ามุมที่เขาเขียนฟังก์ชันตัวนี้มาคือมุมกวาดจากแกน X แต่เราใช้มุมกวาดจากแกน Y มันเลยสลับร่างสร้างรัก ด้วยประการฉะนี้
  • ลอง Recall (RCL) ค่ามาดูจะได้ I = -50 และ J = -86.603
    • XA  = XB + ΔX = 586.603 – 86.603 = 500
    • YA  = YB + ΔY =  550 – 50 = 500
    • คำตอบคือค่าพิกัดจุด A (500,500)
  • มุมอะซิมัทเป็นมุมที่มหัศจรรย์ครับ เวลาคูณ Cos กับ Sin มันจะไปตกควอดแรนท์ที่ถูกต้องให้ โดยที่หัวสมองเราไม่ต้องไปนึกตาม ลองคิดถึงุมุม Bearing สิครับ สยดสยอง แต่โชคดีบ้านเราไม่ได้ใช้
  • ยังมีเกร็ดเล็กเกร็ดน้อยเกี่ยวกับอะซิมัทอีกนิด มาว่ากันต่อตอนต่อไป

โปรแกรมคำนวณระยะทางที่ส้ั้นที่สุดบนทรงรี (Geodesic Distance)

  • มาเข้าเรื่องโปรแกรม ใครที่ไม่ใช่รุ่นหนุ่มๆก็เตรียมยาดมไว้ เผื่อตาลาย ใครที่ชอบความเจ็บปวดก็ไม่ผิดหวังครับ โปรแกรมลากยาวเหยียด เนื่องจากโปรแกรมบนเครื่องคิดเลขไม่สามารถเขียนเป็นบล็อคได้เหมือนภาษาคอมพิวเตอร์บนเครื่องคอมพิวเตอร์ ทำให้เวลาดูโค๊ดยาก มันดูติดกันพรืดไปหมด
  • แต่ถ้าถามว่าเขียนยากไหม ไม่ยากเลยครับ ขอให้มีสูตรคือสิ่งที่สำคัญที่สุด ยุคอินเทอร์เน็ต ถ้าลองค้นหาสูตร Geodesic distance ดู รับรองว่ามากันเยอะ ไม่รู้จะเลือกใช้สูตรไหน บางทีคนเอามาเผยแพร่ก็ลงให้ไม่ครบก็มี ตกไปสักบรรทัดเราเอามาใช้ก็ใช้ไม่ได้แล้ว
  • มาดูโปรแกรมกันเลยครับ

  • การคำนวณจะมีการวนลูปด้วยคำสั่ง For … Next ทุกคร้้งจะมีการเปรียบเทียบค่าใหม่กับค่าเริ่มต้นถ้าค่าต่างกันน้อยกว่า สิบยกกำลังลบสิบสอง (10-12) การคำนวณจะหยุดทันทีแสดงว่าค่าใช้ได้ ผมลองจับจำนวนครั้งที่วนลูปดูประมาณ 3-4 ครั้งแค่นั้น ในตัวโปรแกรมตัวแปรไปดึงตัวแปรอนุกรม Z มาใช้ทั้งหมด 10 ค่า Z[1], Z[2], Z[3], …. Z[10] ตอนประกาศใช้ใช้คำสั่ง 10→DimZ ตอนเลิกใช้ตอนท้ายโปรแกรมประกาศ 0→DimZ เพื่อคืนเมมโมรีให้กับเครื่องคิดเลข
  • เวลาคีย์ชื่อโปรแกรมเนื่องจำกเครื่องคิดเลขจำกัดความยาวตั้งชื่อสั้นว่า “GEODESIC

วิธีการใช้งานโปรแกรม

  • ต้องการระยะทาง Geodesic distance
    • จากจุดที่ 1 ค่า latitude = 14°27’27.0″N longitude = 100°54’12.57″E
    • ไปหาจุดที่ 2 ค่า latitude = 14°36’49.53″N longitude = 98°1’39.63″E
  • เรียกโปรแกรมก่อน กดที่ “File” เลื่อนไปที่ “Geodesic

  • ป้อนค่าพิกัดจุดที่ 1 ค่า latitude = 14°27’27.0″N longitude = 100°54’12.57″E

  • ป้อนค่าพิกัดจุดที่ 2 ค่า latitude = 14°36’49.53″N longitude = 98°1’39.63″E

ผลลัพธ์ของการคำนวณ

  • ผู้อ่านสังเกตไหมเวลากด “EXE” เพื่อคำนวณขั้นสุดท้าย เครื่องจะวูบไปหลายวินาที แต่ถ้าโปรแกรมนี้ถ้าย้ายไปเครื่อง Casio FX-9860G II คงใช้เวลาน้อยกว่าเพราะตามสเป็คแล้วแรงกว่า FX-5800P ประมาณสองเท่า มาดูผลลัพธ์กัน ได้ระยะทาง = 310432.516 เมตร หรือ 310.433 กม.

  • เทียบกับโปรแกรม Geodesic ใน Surveyor Pocket Tools ได้ค่าเท่ากัน ซึ่งหมายเหตุอีกนิดว่าอัลกอริทึ่มที่ใช้คำนวณในโปรแกรม Surveyor Pocket Tools ผมใช้ไลบรารีจาก GeographicLib ซึ่งผลลัพธ์การคำนวณตรงกับสูตรที่เราป้อนในเครื่องคิดเลข ก็ทำให้เรามั่นใจครับว่ามาถูกทาง สูตรถูกต้องแล้ว

  • ตอนหน้าคงเป็นตอนสุดท้ายแล้ว โปรแกรมที่ผมเขียนไว้คำนวณด้านพื้นฐานมีเยอะพอสมควร แต่เนื่องจากผมค้นดูในอินเทอร์เน็ตมีคนเขียนโปรแกรมขายพร้อมเครื่องอยู่หลายๆท่าน เกรงว่าจะไปปิดทางทำมาหากินกัน (พูดอย่างนี้ไม่ใช่โปรแกรมที่ผมเขียนขึ้นมาจะดีกว่านะครับ) ซึ่งผมเคารพในทรัพย์สินทางปัญญาของทุกๆท่าน ผมจึงพยายามเขียนโปรแกรมสำหรับเครื่องคิดเลขฉีกไปในด้าน advance ในประเด็นที่สูตรยากๆที่โปรแกรมคอมพิวเตอร์สามารถทำได้ เครื่องคิดเลขก็สามารถทำได้เช่นกัน ถึงแม้จะช้ากว่า แต่มีดีที่แบตเตอรีอึด ใช้ได้เป็นปี เครื่องก็เบาคุ้มที่จะพกพาไปไหนมาไหน
  • ถึงแม้จะแอพเครื่องคิดเลขบนโทรศัพท์มือถือ จะเอาบวกลบคูนหาร แต่ผมไม่เปิดแอพเครื่องคิดเลขอีกเลย เพราะหยิบโทรศัพท์มือถือมา มันทำให้เสียสมาธิพอสมควร เนื่องจากเปิดหน้าจอมาจะเห็น โปรแกรมต่างๆ เช่นด้านโซเชียลคอยดึงดูดให้กดตามมันไป จนบางครั้งลืมว่าหยิบโทรศัพท์มาทำอะไร
  • พบกันตอนหน้าตอนสุดท้ายครับ อย่าลืมแวะไปเยี่ยมเยียนผมได้ที่เดิม www.priabroy.name ขอบคุณครับ

Geoid Height Pro v1.05 สำหรับ Mac OS X

Geoid Height Pro v1.05 รุ่นสำหรับแมคโอเอส

  • คล้อยหลังที่ปล่อยรุ่นสำหรับวินโดส์ไปแล้ว ผมมานั่งคอมไพล์โปรแกรมสำหรับ Mac ซึ่งก็แก้ไขโค๊ดไปบ้าง แต่ไม่ได้หนักหนาอะไร ทำ installer ด้วย dmgCreator  ฟรี ข้อเสียในรุ่นแมคเทียบกับวินโดส์ก็คือ ขนาดเมื่อบีบอัดแล้วยังปาไปถึง 218 MB ส่วนรุ่นวินโดส์ประมาณ 95 MB เอง

ดาวน์โหลดและติดตั้ง

  • ดาวน์โหลดโปรแกรมได้ที่ GeoidHeightV105.dmg แล้วดับเบิ้ลคลิกแมคจะทำการเมาท์อิมเมจมาให้จากนั้นลาก icon โปรแกรมเข้าโฟลเดอร์ Applications เป็นอันเสร็จ โปรแกรมไม่มีเรียกใช้เฟรมเวิร์ค  (Framework) ใดๆทั้งสิ้นครับ ดังนั้นผมคิดว่านำไปติดตั้งเครื่องไหนน่าจะรันได้ไม่มีปัญหา

geoidheight_mac_01

ลองใช้งาน

  • ติดตั้งแล้วโปรแกรมจะอยู่ที่ Applications พร้อมใช้งาน

myapplications

  • ลองรันดู หน้าตาก็เหมือนรุ่นบนวินโดส์

geoidheight_mac_02

  • ป้อนค่าพิกัดแลตติจูด ลองจิจูดแล้วคลิกคำนวณ (Compute)

geoidheight_mac_03

  • ข้อมูลไฟล์ทดสอบ ผมใส่ไฟล์ข้อมูลตัวอย่าง  bundle ไปในโปรแกรมด้วยวิธีเปิดใช้ Finder ไปที่ Applications หาไอคอนโปรแกรม แล้วคลิกขวาเลือก “Show Package Contents”  คลิกไปที่ Contents/Resources/data จากนั้น copy ไฟล์ไปไว้ที่ใช้งานได้สะดวก

geoidheight_mac_05

  • ลองเปิดไฟล์ดูแล้วรัน

geoidheight_mac_06

  • นี่นับว่าเป็นโปรแกรมแรกของผมที่เขียนใช้บนแมค หลังๆมาผมใช้แมคมากกว่าลีนุกซ์ ส่วนวินโดส์ก็ยังใช้เป็นปกติ แต่ยังไงๆก็ใช้น้อยลงกว่าแต่ก่อน เพราะใช้สมาร์ทโฟนกับแท็ปเล็ตมากขึ้น ก็ยังเป็นที่สงสัยโลกยุคหลังพีซี จะเป็นอย่างไร CPU ตระกูล ARM จะสามารถยึดตลาดได้เบ็ดเสร็จ เหมือน x86 ของอินเทลเคยทำได้เหมือนแต่ก่อนไหม
  • สำหรับโปรแกรมเวอร์ชั่นหน้าตรงแผนที่โลก แสดงสเปคตรัมความสูงจีออยด์ ผมอาจจะเปลี่ยนมาเป็น ลูกโลก 3D ให้ดูน่าสนใจมากขึ้น ผมเตรียมลูกโลกไว้แล้วสำหรับเวอร์ชั่นหน้า

geoidheight_mac_07