การแสดงแผนที่ทรงกลม


19

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

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

ฉันเดาว่าฉันสามารถใช้อาเรย์แบบเชิงเส้นเดียวที่เป็นตัวแทนของ N-gons แต่ละอันมีดัชนีของเพื่อนบ้าน N แต่ดูเหมือนว่าจะเสียพื้นที่จำนวนมาก

เกมดังกล่าวมีองค์ประกอบ RTS ดังนั้นฉันจะจัดเก็บสิ่งต่าง ๆ เช่นแผนที่มีอิทธิพลและการแสดง A * pathfinding และ convolution ดังนั้นการแสดงจึงต้องมีประสิทธิภาพ


โทโพโลยีของแผนที่มีความสำคัญอย่างไรเมื่อเทียบกับการปล่อยให้นักแสดงไปในทิศทางเดียวและท้ายที่สุดพวกเขาก็เริ่ม การเป็นตัวแทนที่ง่ายและมีประสิทธิภาพมากที่สุดคือ torus / donut
congusbongus

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

คุณสามารถพยายามแบ่งจัตุรมุขเพื่อสร้างทรงกลม ประกอบด้วยรูปสามเหลี่ยมขนาดเท่ากันและกระจาย
thalador

1
@thalador ขอบคุณสำหรับคำแนะนำ ไม่แน่ใจ แต่ฉันคิดว่า icosahedrons ดีกว่าจัตุรมุขถ้าฉันไปเส้นทางสามเหลี่ยม แต่อย่างไรก็ตาม tesselation ไม่ใช่ปัญหา มันเป็นดัชนีที่มีประสิทธิภาพที่รบกวนฉัน
DaleyPaley

คำตอบ:


12

โอเคสำหรับทุกคนที่สนใจในหัวข้อนี้ตอนนี้ฉันจะให้รายละเอียดการแก้ปัญหาที่ฉันเลือก ขอบคุณทุกคนที่ตอบกลับและให้ความคิดกับฉัน

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

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

ฉันหวังว่าบางคนพบว่าข้อมูลนี้มีประโยชน์ ฉันได้เรียนรู้มากมายและรอคอยที่จะได้รับผลลัพธ์

แก้ไข:

นี่คือภาพที่แสดงผลลัพธ์ของการแบ่งส่วนไอโซเฮดตรอนของฉันและการสลับคู่โดยใช้โครงสร้างข้อมูลแบบครึ่งขอบ

ฉันอาจทำซ้ำสองสามครั้งของการพักผ่อนเพื่อให้บริเวณเซลล์มีความสม่ำเสมอมากยิ่งขึ้น

การแบ่งส่วนแบบ icosahedron


7

มีวิธีการทำเช่นนี้ค่อนข้างหรูหราขึ้นอยู่กับการแบ่งย่อย icosahedron ตามที่คุณแนะนำในคำถามของคุณ icosahedron ทำจากรูปสามเหลี่ยมด้านเท่า 20 รูปสามเหลี่ยมและสามเหลี่ยมเหล่านี้สามารถแบ่งออกเป็น 5 ชุดโดยที่รูปสามเหลี่ยม 4 รูปในรูปแบบรูปสี่เหลี่ยมด้านขนาน:

ป้อนคำอธิบายรูปภาพที่นี่

(กลุ่มของรูปสามเหลี่ยมสี่รูปที่มี squiggle ที่ลากผ่านพวกมันคือรูปสี่เหลี่ยมขนมเปียกปูนที่ฉันกำลังพูดถึงลูกศรบอกว่าขอบใดที่จะติดกาวเข้าด้วยกัน

หากรูปสามเหลี่ยมเหล่านี้ถูกแบ่งย่อยเป็นรูปสามเหลี่ยมขนาดเล็กทั้งรูปสี่เหลี่ยมด้านขนานสามารถจัดทำดัชนีเหมือนอาร์เรย์สี่เหลี่ยมจัตุรัสขนาด n คูณ 4n (ตัวอย่าง = n = 4 ในตัวอย่าง):

ป้อนคำอธิบายรูปภาพที่นี่

ตัวเลขในแต่ละเซลล์คือหมายเลขคอลัมน์ของอาร์เรย์สี่เหลี่ยม กฎสำหรับการค้นหาเพื่อนบ้านภายในอาเรย์นั้นค่อนข้างง่าย: เพื่อนบ้านแนวนอนเป็นเพียงบวกหรือลบ 1 คอลัมน์ในขณะที่เพื่อนบ้านแนวดิ่งอาจเป็นลบหนึ่งแถวและบวกหนึ่งคอลัมน์หรือบวกหนึ่งแถวและลบหนึ่งคอลัมน์ขึ้นอยู่กับว่า หมายเลขคอลัมน์คือเลขคู่หรือคี่ตามลำดับ

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


นั่นเป็นตัวแทนที่ดีมาก ความกังวลหลักของฉันเกี่ยวกับวิธีการแบบสามเหลี่ยมคือการรักษาอาร์เรย์ที่เป็นรูปสามเหลี่ยมและการเย็บทั้งหมด ยังมีการเย็บเล็ก ๆ ที่นี่ แต่อาร์เรย์เป็นรูปสี่เหลี่ยมผืนผ้า ขอบคุณดีมากที่รู้
DaleyPaley

3

Hmmm - ความคิดเห็นเกี่ยวกับการยืดระบุว่าคุณกำลังเคลื่อนไหวระหว่างการทำแผนที่ทรงกลมและระนาบนั่นคือสิ่งที่นำไปสู่การบิดเบือนที่เสา

หากคุณต้องการให้กระเบื้องมีลักษณะเรียบและสม่ำเสมอคุณถูกต้องแล้วว่า icosahedron โดยเฉพาะ icosahedron ที่ถูกตัดทอนเป็นเรื่องธรรมดา

คุณสามารถค้นหาการแมปที่แตกต่างกันทั้งหมดได้ที่นี่ - Spherical Polyhedrons บนวิกิพีเดีย

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


Ah, icosahedron ที่ถูกตัดทอน ใช่นั่นคือสิ่งที่ฉันต้องการ ขอบคุณ นอกจากนี้ในขณะที่ฉันไม่เคยใช้ปีกที่มีปีกฉันใช้ครึ่งขอบมากในการจัดการกับตาข่ายดังนั้นฉันจึงมีความชำนาญในพื้นที่ ไชโยฉันอยู่ใกล้ทางออก
DaleyPaley

2

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

สิ่งสำคัญที่ต้องเข้าใจที่นี่คือโลกไม่ราบเรียบและดังนั้นการเรียงเครื่องแบบ 100% จะเป็นไปไม่ได้ (ซึ่งตามมาจากทฤษฎีบท Hairy Ball ) สิ่งผิดปกติบางอย่างจะต้องได้รับอนุญาตและสิ่งที่ดีที่สุดที่เราสามารถคาดหวังได้ก็คือการกระจายความผิดปกติเหล่านั้นให้ทั่วพื้นผิวทำให้แต่ละชิ้นมีขนาดเล็กที่สุดเท่าที่จะทำได้

จริงๆแล้วมันค่อนข้างง่ายที่จะทำในลักษณะที่ไม่ได้กำหนดไว้ ก่อนอื่นเลือก N จุดสุ่มแบบสม่ำเสมอทั่วพื้นผิว ตรวจสอบให้แน่ใจว่าจุดเหล่านั้นเหมือนกันจริง ๆ (ดูการเลือกจุดทรงกลมสูตร 9-11) ในขั้นตอนที่สองเราทำให้คะแนนเหล่านั้นสุ่มน้อยลงและสม่ำเสมอมากขึ้น: สมมติว่าคะแนนทั้งหมดนั้นมีประจุไฟฟ้าลบเพื่อที่พวกมันจะผลักกัน จำลองการเคลื่อนที่ของจุดต่าง ๆ ในหลายขั้นตอนจนกระทั่งพวกมันมาบรรจบกันในสภาวะสมดุล การกำหนดค่าจุดสุดท้ายนี้จะทำให้คุณมีตาข่ายซึ่งกระจายอย่างสม่ำเสมอทั่วพื้นผิวของทรงกลม


1
ฉันไม่เคยได้ยินทฤษฎีลูกขนปุยมันน่าสนใจมาก ต้องหยุดตัวเองจากการทำตลกไร้สาระ ฉันเคยกระจายจุดบนทรงกลมมาก่อนเช่นนั้น แต่ปัญหาคือการเรียงหลายเหลี่ยมมันช้ากว่าการแบ่งย่อยโพลิป นอกจากนี้รูปร่างและความจุของเซลล์จะไม่สม่ำเสมอเกินไปสำหรับความชอบของฉัน แต่ขอบคุณล่ะค่ะ
DaleyPaley
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.