ภาพการสร้างภาพข้อมูลจากความสนใจเกี่ยวกับเกลียวทรงกลม
(visualrambling.space)- นี่คือการแนะนำแนวคิดเกี่ยวกับวิธีแสดง การเคลื่อนที่ของวัตถุในพื้นที่ 3 มิติ ด้วยฟังก์ชันพาราเมตริก
- อธิบายกระบวนการสร้างเส้นทางเชิงคณิตศาสตร์ที่ค่อย ๆ ซับซ้อนขึ้น ตั้งแต่วงกลม เกลียว ไปจนถึง เส้นทางเกลียวทรงกลม
- สามารถสร้างการเคลื่อนไหวได้หลากหลายด้วยการกำหนดแต่ละแกนพิกัด (x, y, z) ให้เป็นฟังก์ชันของเวลา
- โดยเฉพาะในกรณีของ เกลียวทรงกลม สามารถสร้างเส้นทางเกลียวสามมิติได้ด้วยการคูณฟังก์ชันตรีโกณมิติเพื่อทำให้รัศมีเปลี่ยนแปลง
- เป็นตัวอย่างเชิงสร้างสรรค์ที่แสดงให้เห็นว่าวิธีนี้สามารถใช้ย้ายวัตถุไปตามเส้นทางใดก็ได้
สำรวจการเคลื่อนที่ของวัตถุในพื้นที่ 3 มิติ
บทความนี้เป็นผลจากการสำรวจส่วนตัวเกี่ยวกับวิธีต่าง ๆ ในการทำให้วัตถุเคลื่อนที่ในพื้นที่ 3 มิติ และโดยเฉพาะการนิยามและสร้างเส้นทาง เกลียวทรงกลม (spherical helix) ในเชิงคณิตศาสตร์
พื้นฐานของเฮลิกซ์และการเคลื่อนที่สามมิติ
-
เฮลิกซ์ หมายถึงโครงสร้างสามมิติที่พันเป็นเกลียวคล้ายสปริง
-
เกลียวทรงกลม คือแนวคิดของการหมุนเป็นเกลียวไปตามผิวของทรงกลม
-
ตำแหน่งของวัตถุในพื้นที่ 3 มิติถูกกำหนดด้วย พิกัดบน 3 แกน x, y, z
- แกน x: รับผิดชอบการเคลื่อนที่ซ้ายขวา
- แกน y: เป็นการเคลื่อนที่ขึ้นลง
- แกน z: การเปลี่ยนแปลงในทิศหน้า–หลัง (ความลึก)
-
หากนิยามตำแหน่งของวัตถุด้วยฟังก์ชันทางคณิตศาสตร์ตาม เวลา (t) ก็จะสามารถสร้างเส้นทางการเคลื่อนที่ได้
ฟังก์ชันพาราเมตริกและตัวอย่างเส้นทางอย่างง่าย
-
ตัวอย่าง: หากกำหนดตำแหน่ง x เป็น
10 * cos(πt/2)จะได้ การเคลื่อนที่แบบคลื่นโคไซน์ ที่ไปกลับระหว่าง -10 ถึง 10 ทุก ๆ 2 วินาที -
ในทำนองเดียวกัน หากกำหนดตำแหน่ง y เป็น
10 * cos(πt/2)ก็สามารถสร้างการเคลื่อนที่ขึ้นลงแบบไปกลับได้เช่นกัน -
หากใช้ฟังก์ชันต่างกันกับ x และ y (เช่น x =
10 * cos(πt/2), y =10 * sin(πt/2)) จะได้การเคลื่อนที่ที่มีเฟสต่างกัน และเมื่อรวมกันจะเกิดเป็น เส้นทางวงกลม -
หากคูณฟังก์ชันด้วยพจน์ที่แปรผันตามเวลา (เช่น x =
0.03 * t * cos(πt/2)) ก็จะสร้างรูปแบบที่รัศมีค่อย ๆ ใหญ่ขึ้น หรือก็คือเส้นทางแบบ เกลียว (spiral) ได้
การสร้างเส้นทางเกลียวทรงกลม (spherical helix)
-
ต่างจากเกลียวบนระนาบทั่วไป เกลียวทรงกลม ต้องใช้เส้นทางสามมิติ
- สำหรับค่า z สามารถใช้
10 * cos(0.02 * πt)เป็นต้น เพื่อค่อย ๆ เปลี่ยนตำแหน่งในแนวหน้า–หลัง
- สำหรับค่า z สามารถใช้
-
สำหรับ x และ y ใช้ การคูณฟังก์ชันตรีโกณมิติ อย่าง
sin(0.02 * πt)เพื่อสร้างเอฟเฟกต์ที่รัศมีใหญ่ที่สุดตรงกลางและเล็กลงที่ปลายทั้งสองด้าน -
เมื่อนำการคูณลักษณะนี้ไปใช้กับทั้ง x และ y ก็จะสามารถสร้างเส้นทางที่เคลื่อนที่เป็นวง พร้อมกับไล่ไปตามเกลียวบนผิวของทรงกลม (คือในแบบสามมิติ) ได้
-
การผสมฟังก์ชันในลักษณะนี้ทำให้สามารถสร้าง เส้นทางเกลียวทรงกลม ในเชิงคณิตศาสตร์ได้อย่างสมบูรณ์
สรุปและการนำไปใช้
- ทุกเส้นทางใน 3 มิติสามารถสร้างได้ด้วยการนิยาม x, y, z ให้เป็น ฟังก์ชันพาราเมตริกของเวลา แยกจากกัน
- นั่นหมายความว่าสามารถระบุเส้นทางได้ทางคณิตศาสตร์ ตั้งแต่วงกลม เกลียว ไปจนถึงเส้นทางที่ซับซ้อน
- แนวทางนี้ช่วยให้มองเห็นได้อย่างชัดเจนว่า แม้การเคลื่อนไหวที่ซับซ้อนจะดูวุ่นวาย แต่จริง ๆ แล้ว เป็นเส้นทางคณิตศาสตร์ที่นิยามไว้อย่างชัดเจน ไม่ใช่ความโกลาหล
visualrambling.space คือโปรเจกต์ส่วนตัวของ Damar ที่ใช้เรียนรู้หัวข้อต่าง ๆ และเล่าเรื่องผ่านงานภาพ
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ในการเดินเรือสมัยก่อน เส้นโค้งแบบนี้ (rhumb line, loxodrome) มีความสำคัญมาก
เพราะการรักษาทิศทางเดิมระหว่างการเดินเรือนั้นง่ายกว่ามาก
ดังนั้นกะลาสีจึงพยายามเดินทางตามเส้นทางแบบนี้ให้มากที่สุด
แนวคิดของ rhumb line จึงเกิดขึ้นจากเรื่องนี้
ดูเพิ่มเติมที่ วิกิพีเดีย Rhumb line
แผนที่ Mercator ทำให้การคำนวณทิศทางแบบนี้ง่ายขึ้น
ดูเพิ่มเติมที่ วิกิพีเดีย Mercator projection
การตั้งโจทย์ลักษณะนี้เองก็นำไปสู่การค้นพบทางคณิตศาสตร์ใหม่ ๆ อยู่เสมอ
ตัวอย่างเช่น เมื่อมองใน polar projection มันจะกลายเป็น logarithmic spiral
เมื่อมองจากด้านข้าง มันจะกลายเป็น wave packet
ความน่าสนใจทางคณิตศาสตร์นี้ถึงขั้นทำให้ Paul Erdos อยากลองศึกษาด้วย
บทความอ้างอิง: Spiraling the Earth with C. G. J. Jacobi. Paul Erdös
พูดนอกเรื่องนิดหน่อย แต่วันนี้ดูเหมือนจะเป็นวันที่ Hacker News มีเรื่อง spherical geometry ขึ้นมาเยอะเป็นพิเศษ
ลิงก์กระทู้ที่เกี่ยวข้อง:
1
2
3
เส้นโค้งนี้มีลักษณะที่ระยะห่างบนผิวดูคงที่ แต่ rhumb line ตามนิยามจะตัดเส้นเมริเดียนด้วยมุมคงที่เสมอ จึงมีลักษณะเส้นถี่ขึ้นเมื่อเข้าใกล้บริเวณขั้วโลก
ในเชิงสมการด้วย
x = 10 · cos(π·t/2) · sin(0.02·π·t)
y = 10 · sin(π·t/2) · sin(0.02·π·t)
z = 10 · cos(0.02·π·t)
ถ้าแปลงสมการนี้เป็นพิกัดทรงกลม (R=10) จะได้ว่า
λ(t) = π/2 · t (longitude)
φ(t) = π/2 - 0.02·π·t (latitude)
เมื่อหาอนุพันธ์จะได้ d(λ)/d(φ) = -25 (ค่าคงที่)
แต่ rhumb line จริงจะมี d(λ)/d(φ) ในรูป tan(α) · sec(φ) ซึ่งเปลี่ยนไปตามละติจูด
ดังนั้นเส้นโค้งนี้จึงไม่ใช่ rhumb line
ถ้าสนใจเส้นโค้งที่มุมตัดเปลี่ยนไป แนะนำให้ดู ลิงก์ภาพจำลองนี้
เห็นแล้วนึกสนุก เลยอยากแนะนำโปรเจกต์เกี่ยวกับทรงกลมที่เคยทำไว้เมื่อปี 2022
โปรเจกต์ spheredisksample
คิดว่าเป็นโปรเจกต์ที่เข้ากับกระแสวันนี้พอดี
และขอแนะนำ โปรเจกต์ sphere-resample ที่คนก็น่าจะชอบด้วย
อย่าลืมดู โพสต์นี้ ที่มีคอมเมนต์พูดถึง rhumb line และเรื่องที่เกี่ยวข้องด้วย
คิดว่างานภาพนี้สวยมาก
อีกอย่างที่อยากเห็นเพิ่มเติมคือเรื่อง “จะทำให้มันเคลื่อนที่ด้วยความเร็วคงที่ได้ไหม?”
ถ้าแค่ต้องการวางจุดตามเส้นทางก็คงไม่เป็นไร แต่พอดูการเคลื่อนไหวจริงจะเห็นว่ามันช้าลงมากตรงช่วงต้นกับช่วงท้าย (แทบจะถูกกำหนดด้วยรัศมีเลย)
ถ้าต้องการให้มันเคลื่อนที่ด้วยความเร็วคงที่ หรือถึงขั้นใส่ easing function แบบช้าลงแล้วเร็วขึ้นด้วย จะทำได้อย่างไรบ้างก็น่าสนใจ
เดาว่าน่าจะมีทริกทางคณิตศาสตร์ที่สวยงามอยู่
คร่าว ๆ ผมคิดว่าคงต้องหาอนุพันธ์ของสมการเพื่อสร้างฟังก์ชันความเร็ว จากนั้นใช้ทฤษฎีพีทาโกรัสจัดการกับ dx, dy, dz แล้วใช้ฟังก์ชันผกผันของฟังก์ชันความเร็วเพื่อ reparameterization กลับเป็น t'
แต่ผมไม่ค่อยชำนาญคณิตศาสตร์เท่าไร เลยรู้สึกเหมือนพูดลอย ๆ มากกว่า
ถ้าจะให้เคลื่อนที่ด้วยความเร็วคงที่ ต้องใช้ “Euclidean parameterization”
กล่าวคือ ต้องปรับค่า t ให้แปรผันตามระยะทางแบบ Euclidean ที่เคลื่อนที่ไป
นี่เป็นแนวคิดที่จำเป็นเสมอเวลาให้วัตถุเคลื่อนที่ตามเส้นทางในงานแอนิเมชัน
แต่ส่วนใหญ่แล้วมักไม่มี closed-form solution จึงต้องแก้แบบเชิงตัวเลข
ในทางปฏิบัติ สำหรับแต่ละค่า t เราจะหาค่า dt ที่สอดคล้องกับระยะทางที่ต้องการ (ds) ด้วยวิธีอย่าง binary search หรือ interpolation search
แล้วบันทึกผลลัพธ์เหล่านั้นไว้เพื่อสร้าง polyline จากจุดที่มีระยะห่างเท่า ๆ กัน ซึ่งเป็นวิธีที่ใช้งานได้จริง (ตราบใดที่เส้นโค้งไม่เปลี่ยนไปตามเวลา)
ทริกทางคณิตศาสตร์ที่พูดถึงในคำถามนั้นก็คือ “arc length parameterization”
เป็นการประกอบกับฟังก์ชันผกผันของฟังก์ชันความยาวส่วนโค้ง (arc length) ของเส้นโค้ง
ยกเว้นเพียงบางตระกูลของเส้นโค้ง ส่วนใหญ่แล้วจะไม่มีรูปปิด จึงต้องคำนวณเชิงตัวเลข
สัญชาตญาณที่ว่าให้ขยับ t ช้าลงนั้นถูกต้อง
เพราะแม้ความเร็วเชิงมุมจะคงที่ตาม t แต่รัศมีก็เปลี่ยนไปตาม t เช่นกัน
เป็นแนวคิดแบบ Archimedean spiral ชนิดหนึ่ง
ถ้าทำการ parameterization ให้ขนาดของความเร็วเป็นค่าคงที่ ก็จะได้การเคลื่อนที่ที่สม่ำเสมอขึ้น
แต่เพราะมันเริ่มต้นที่รัศมี 0 จึงจำเป็นต้องจัดการกับค่า limit ไม่ทางใดก็ทางหนึ่ง
ถ้าต้องการให้วัตถุวิ่งตามเส้นทางในเกม เป็นต้น วิธีที่เรียบง่ายและใช้งานได้จริงก็คือเล็งวัตถุให้ตามเส้นทางและเส้นสัมผัสโดยอิงแกน Z แล้วค่อย ๆ ลากมันไปพร้อมจำกัดความเร็วซ้ำ ๆ คล้ายของเล่นลูกปัดเลื่อนตามลวด
สำหรับประโยคที่ว่า “...จริง ๆ แล้วมันไม่ใช่สิ่งที่ chaotic แต่อย่างใด เป็นเพียงเส้นทางที่นิยามด้วยฟังก์ชันทางคณิตศาสตร์”
แม้จะยังไม่แน่ใจว่าฟังก์ชันที่ยกมานั้นแสดงพฤติกรรมแบบ chaos จริงหรือไม่ แต่แนวคิดเรื่อง chaos เองก็เป็นปรากฏการณ์ที่เกิดขึ้นจากฟังก์ชันคณิตศาสตร์แบบกำหนดแน่นอนโดยเนื้อแท้ (คือไวอย่างยิ่งต่อเงื่อนไขตั้งต้น)
เดาว่าผู้เขียนน่าจะเลือกใช้คำว่า “chaotic” แทน “random” หรือ “non-deterministic”
คิดว่าการทักท้วงเชิงเทคนิคแบบนี้สำคัญมาก
สำหรับผู้อ่าน Hacker News เรื่องการแยกความต่างแบบนี้น่าจะน่าสนใจ
ในทางคณิตศาสตร์ chaos คือระบบกำหนดแน่นอนที่ไวอย่างยิ่งต่อเงื่อนไขตั้งต้น
ผลลัพธ์อาจดูเหมือนสุ่ม แต่ในเชิงแนวคิดแล้วต่างจาก randomness โดยสิ้นเชิง
เห็นด้วยว่าคำว่า chaos เป็นคุณสมบัติที่เกิดจากฟังก์ชันคณิตศาสตร์แบบกำหนดแน่นอน
แต่ในความหมายตามพจนานุกรมทั่วไป มันอาจหมายถึง “ความไร้ระเบียบและความสับสนอย่างสิ้นเชิง”, “สภาวะที่โอกาสและความบังเอิญครอบงำ”, หรือ “ความคาดเดาไม่ได้ของระบบธรรมชาติที่ซับซ้อน”
ถ้าจะเขียนให้สอดคล้องกับความคาดหวังและภาษาที่ผู้อ่านทั่วไปใช้กัน การอธิบายด้วยภาษาที่เข้าใจง่ายมากกว่าความเข้มงวดทางคณิตศาสตร์ก็มีความหมายในแบบของมันเช่นกัน
ขอให้ฟีดแบ็กอย่างหนึ่งคือ บนมือถือวิธีนำทางไม่เป็นไปตามที่คาดไว้
ตอนแรกผมลองเลื่อนหน้าจอเพราะไม่รู้ว่าต้องควบคุมอย่างไร
พอแตะหน้าจอแล้วมันไปหน้าถัดไป ผมก็เข้าใจว่า “อ้อ แบบนี้นี่เอง”
พอแตะด้านขวาแล้วไปหน้าถัดไป พอครั้งต่อมาผมเลยแตะด้านซ้ายเพื่อหวังจะย้อนกลับ แต่กลับกลายเป็นว่ามันข้ามไปอีกสองหน้า
เลยพลาดบางหน้าจอไป น่าเสียดายนิดหน่อย
ไม่ใช่ปัญหาใหญ่ แต่ถ้ามีคำแนะนำเพิ่มอีกสักหน่อยก็น่าจะช่วยลดความสับสนและทำให้โฟกัสกับเนื้อหาได้มากขึ้น
แต่ก็น่าจะดีถ้ามีการรองรับการ swipe เพิ่มด้วย (แม้ส่วนตัวผมจะชอบการแตะมากกว่า)
ถ้าต้องการให้คล้ายอินเทอร์เฟซแบบ “card stack” ของแอปโซเชียลมีเดีย การ swipe ก็ดูเป็นธรรมชาติเหมือนกัน
เนื้อหาอยู่ในระดับพื้นฐาน จึงดูเหมาะให้เด็ก ๆ ใช้ประกอบการเรียนคณิตศาสตร์
ถ้ามีการพูดถึงแนวคิดอย่างสูตรวงกลม (
x = r cos t, y = r sin t) แทรกไว้บ้างก็น่าจะดีขึ้นหัวข้อที่ต่อยอดเพิ่มได้ดีคือ polar coordinate และ linear algebra (เวกเตอร์, การแปลง, การแปลงในปริภูมิ 3D ฯลฯ)
ถ้าผู้เขียนยังไม่คุ้นกับหัวข้อเหล่านี้ ขอแนะนำวิดีโอ YouTube ของ 3blue1brown
ในมุมของโปรแกรมเมอร์ เนื้อหายังไม่ได้พูดถึงเรื่องการเขียนโค้ด, การใช้ไลบรารี หรือการจัดการ 3D object จริง ๆ (vertex, deformation ฯลฯ) ดังนั้นถ้าครอบคลุมส่วนนั้นด้วยก็น่าจะดียิ่งขึ้น
ผมสงสัยเรื่อง “ความถูกต้อง” ของการเลื่อนตามแกน z ใน spherical helix
z = c * t อาจใช้เป็นการเลื่อนแบบง่าย ๆ ได้หลายแบบ และแต่ละฟังก์ชันก็จะให้ความหนา ความสม่ำเสมอ และความคงที่ของ “เปลือก” ต่างกัน
ฟังก์ชันที่ใช้ที่นี่ดูสวยในเชิงภาพ แต่ถ้าคิดในมุมของการคงระยะห่างระหว่างเกลียวให้สม่ำเสมอ (หรือการแบ่งพื้นที่อย่างสม่ำเสมอ) ก็น่าสนใจว่าควรตั้งเป้าหมายอย่างไร
อยากรู้ว่าฟังก์ชันนี้ถูกเลือกมาด้วยกระบวนการแบบไหน หรือแค่เลือกเพราะดูสวยเท่านั้น
ผมเดาว่าฟังก์ชันนี้น่าจะถูกเลือกเพราะเขียนโปรแกรมสะดวกและดูดีด้วยตา
ถ้าจะเอาแบบ “ถูกต้อง” จริง น่าจะต้องให้จุดเคลื่อนที่ด้วยความเร็วคงที่ในปริภูมิ 3D (เช่นเดียวกับเรือที่แล่นอยู่บนโลกจริง)
ในกรณีนั้น สมการจะเป็นประมาณนี้ (ดูตัวอย่างโค้ด)
const degrees = Math.PI / 180
const bearing = 5 * degrees
const k = Math.tan(bearing)
const v = 0.001
const phi = (t) => vt/Math.sqrt(1 + kk)
const theta = (t) => k*Math.ln(Math.tan(phi(t)/2))
แล้วค่อยแปลงเป็นพิกัด x, y, z
const x = (t) => Math.sin(phi(t)) * Math.cos(theta(t))
const y = (t) => Math.sin(phi(t)) * Math.sin(theta(t))
const z = (t) => Math.cos(phi(t))
ในทางปฏิบัติจะต้องใช้ถึงลอการิทึมของ
tan(phi/2)ด้วย ซึ่งเป็นรูปที่ได้จากการแก้สมการเชิงอนุพันธ์ผมคิดว่าผู้เขียนคงไม่ได้ใช้วิธีที่ซับซ้อนถึงระดับ
ln(tan(phi/2))แบบนี้ประเด็นสำคัญคือการทำให้ความเร็วตามเส้นทางคงที่
สามารถตั้งอนุพันธ์ให้ความเร็วเป็นค่าคงที่ แล้วแก้หา z หรือทำ reparameterization เป็น t' ก็ได้
การเลือก
z = c * tมีผลทั้งต่อ parameterization ของเส้นทางและวิถีจริงที่ได้แอนิเมชันลื่นไหลมาก น่าประทับใจ
เมื่อไม่นานมานี้ผมต้องทำงานกับปัญหาการกระจายจุดจำนวน N จุดบนผิวทรงกลม และระหว่างนั้นก็เจออัลกอริทึมง่าย ๆ ชื่อ “fibonacci-sphere”
วิธีนี้ก็ใช้สร้างเกลียวบนทรงกลมเพื่อวางจุดได้เหมือนกัน
บทความที่เกี่ยวข้อง: PDF งานวิจัย fibonacci-sphere
แปลกใจที่ยังไม่มีใครพูดถึง Acko.net
มีบล็อกโพสต์ยอดเยี่ยมที่ใช้เครื่องมือคล้ายกันอธิบายจำนวนเชิงซ้อนและ fractal โดยเฉพาะ Julia fractal แบบเห็นภาพมาก
ถ้าสนใจเรื่องนี้แนะนำให้อ่านอย่างยิ่ง
How to fold a julia fractal - บล็อก Acko.net
สามารถลองปรับสมการเส้นโค้งนี้ได้โดยตรงใน Desmos 3D ลิงก์ภาพจำลอง Desmos 3D
สิ่งที่น่าสนใจคือสมการพาราเมตริกของเกลียวนี้มีความเป็นเชิงเส้นในระบบพิกัดทรงกลม
ดูเพิ่มเติมที่ วิกิพีเดียการแปลงพิกัด
ขอบคุณที่แชร์ อ่านแล้วน่าสนใจมาก