อัลกอริทึมในการสร้างขอบและจุดยอดออกไปด้านนอกจากจุดเริ่มต้นที่มีหลายหลากสูงสุดเท่ากับ 3


11

ฉันกำลังสร้างเกม 2d สำหรับเว็บไซต์ที่มีขนาดใหญ่มาก (โดยทั่วไปมีขนาดใหญ่มาก) เริ่มแรกจักรวาลประกอบด้วยดาว 6 ดวงที่อยู่ห่างจากจุดกำเนิดเท่ากัน (0, 0) งานของฉันคือการสร้างดาวให้มากขึ้นซึ่งจะมี "เส้นทาง" (ขอบ) ที่เชื่อมต่อซึ่งกันและกัน ฉันจะออกแบบอัลกอริทึมที่ตรงตามข้อ จำกัด เหล่านี้ได้อย่างไร:

  1. ดวงดาวถูกสร้างแบบสุ่มออกไปด้านนอก (เช่น (x, y) พิกัดสำหรับดาวดวงใหม่จะค่อยๆออกไปด้านนอกจาก (0, 0) ในทุกทิศทางโดยเฉพาะในรูปแบบเกลียว
  2. ขอบจะไม่ข้าม
  3. แม้ว่าจะมีความแตกต่างบ้าง แต่ดาวดวงใหม่ไม่ควรอยู่ไกลหรืออยู่ใกล้ดาวดวงอื่นมากเกินไป (เช่นต้องมีรัศมีต่ำสุด)
  4. ไม่มีดาว / จุดควรมีหลายหลากมากกว่า 3
  5. ระบุว่าทั้งหมดนี้จะถูกเก็บไว้ในฐานข้อมูลอัลกอริทึมไม่สามารถมีราคาแพงเกินไป กล่าวอีกนัยหนึ่งฉันชอบที่จะได้รับสิ่งที่ซับซ้อน O (n) (ฉันไม่รู้ว่าสิ่งนี้เป็นไปได้หรือไม่)

โดยพื้นฐานแล้วสิ่งที่ฉันกำลังมองหาคือกาแลคซีที่มีลักษณะเป็นดาวหางโดยที่ดวงดาวเป็นจุดบนกราฟและการเดินทางระหว่างดวงดาวจะถูกแสดงด้วยขอบระหว่างดาวเหล่านั้น

ขั้นตอนเฉพาะที่ฉันต้องแก้ไขคือ:

  1. สร้างจุดในบริเวณใกล้เคียงกับดวงดาวอื่นที่ยังไม่ได้เป็น 3 เท่า
  2. ค้นหาดาวดวงแรกที่ยังไม่มีพหุคูณเท่ากับ 3 ซึ่งจะไม่สร้างความขัดแย้งให้กับขอบ
  3. หากดาวอยู่ห่างจากหน่วย x อย่างน้อยที่สุดให้สร้างขอบระหว่างจุดสองจุด

ฉันพยายามหาวิธีแก้ปัญหา แต่ทักษะคณิตศาสตร์ของฉัน (และความรู้เกี่ยวกับทฤษฎีกราฟ) ต้องการงานจำนวนมาก นอกจากนี้ทรัพยากรใด ๆ / ลิงค์ในเรื่องนี้จะได้รับการชื่นชมอย่างมาก

นี่คือรหัสหลอกที่ฉันคิดถึง แต่ฉันไม่แน่ใจว่ามันจะใช้ได้หรือไม่และฉันมั่นใจว่ามันจะทำงานได้ไม่ดีนักหลังจากดาวฤกษ์ 10,000 ดวงและอื่น ๆ

newStar = randomly generated (x, y) within radius of last star from origin
while(newStar has not been connected):
    for (star in the known universe):
        if(distance between newStar and star > x units):
            if(star has < 3 multiplicity):
                if(path from newStar to star does not intersect another path):
                    connect the star to the other star
                    break;

    newStar = new random (x, y) coordinate

นอกจากนี้หากใครมีคำแนะนำเกี่ยวกับวิธีการที่ฉันควรเก็บไว้ในฐานข้อมูล MySQL ฉันก็จะขอบคุณที่

สุดท้ายในกรณีที่ไม่มีเหตุผลใดที่เหมาะสมฉันได้รวมภาพของสิ่งที่ฉันต้องการให้บรรลุด้านล่าง:และอื่น ๆ อีกมากมาย ...


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

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

1
คุณจะทำอย่างไรถ้าดาวแต่ละดวงที่สร้างขึ้นมีหลายหลากเท่ากับ 3 ดังนั้นขั้นตอนที่ 1 จะล้มเหลว ทำไมในรูปภาพของคุณถึงจุดหนึ่งด้วยหลายหลากของ 4 นั่นคือข้อผิดพลาดหรือไม่?
Doc Brown

1
ไม่ถ้าคุณสามารถสร้างดวงดาวในแบบที่คาดเดาได้มันก็จะเป็นราวกับว่าพวกเขาอยู่ที่นั่นเสมอถ้าคุณออกไปแล้วกลับมา มันเป็นแค่อัลกอริธึมและเมล็ดที่ไม่เปลี่ยนแปลง
Neil

2
@JF ดูไม่มีมนุษย์ท้องฟ้า ผู้ชายสร้างจักรวาลอย่างแท้จริง เขาบันทึกเฉพาะดาวเคราะห์ที่ผู้เล่นเข้าเยี่ยมชมและยังมีดาวเคราะห์อยู่ในจุดเดียวกัน มันขึ้นอยู่กับการใช้เมล็ดพันธุ์ที่เหมาะสมที่ใช้ในการสร้างตัวเลขสุ่ม
Neil

คำตอบ:


2

คำแนะนำ: ให้เครือข่ายจักรวาลภายในสั่งอย่างสมบูรณ์แบบอัลกอริทึมและค่อนข้างง่าย คุณจะต้องจักรวาลจะมองแบบสุ่มเมื่อมันปรากฏบนหน้าจอผู้ใช้ ใช้การออฟเซ็ตแบบสุ่มกับตำแหน่งดาวสำหรับการแสดงผลของผู้ใช้

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

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

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

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