ขั้นตอน…บ้านพร้อมห้องกำเนิด


74

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

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

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

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

โดยเฉพาะอย่างยิ่งข้อกำหนดคือ:

  • มีชุดของห้องที่กำหนดไว้ล่วงหน้า
    ฉันไม่สามารถสร้างกำแพงและประตูได้ในทันที
  • ห้องสามารถหมุนได้ แต่ไม่สามารถปรับขนาดได้
    อีกเพราะฉันมีชุดห้องที่กำหนดไว้ล่วงหน้าฉันสามารถหมุนได้เท่านั้นไม่ปรับขนาด
  • ขนาดของบ้านถูกตั้งค่าและจะต้องเต็มไปด้วยห้อง (หรือห้องโถง)
    ฉันต้องการเติมบ้านขนาด 14x20 ด้วยห้องว่างเพื่อให้แน่ใจว่าไม่มีพื้นที่ว่าง

นี่คือภาพบางส่วนที่จะทำให้ชัดเจนยิ่งขึ้น:

เครื่องกำเนิดดันเจี้ยนทั่วไป คุกใต้ดินที่ไม่มีทางเดิน ผลเครื่องกำเนิดไฟฟ้า

อย่างที่คุณเห็นในบ้าน "พื้นที่ว่าง" ยังคงเดินได้และทำให้คุณจากห้องหนึ่งไปอีกห้องหนึ่ง

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

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


2
คำแนะนำแปลก ๆ : ฉันขอแนะนำอย่างยิ่งให้ตรวจสอบหนังสือของ Christopher Alexander The Timeless Way Of BuildingและA Pattern Languageหนังสือสถาปัตยกรรมที่ก่อให้เกิดรากฐานดั้งเดิมสำหรับแนวคิดของรูปแบบ (ซอฟต์แวร์); พวกเขาอธิบายภาษาที่ชัดเจนสำหรับอาคารและพื้นที่อยู่อาศัยที่สามารถเปลี่ยนเป็นวิธีการก่อสร้างขั้นตอนจากบนลงล่าง
Steven Stadnicki

โดยส่วนตัวแล้วฉันจะพยายามทำให้อัลกอริทึมเหมือนคำตอบของ egarcias เริ่มต้นด้วยการสร้างตัวยึดตำแหน่งของห้องพัก (พื้นที่ขนาดใหญ่ที่สามารถเติมจำนวนห้องที่แตกต่างกันได้แต่ละตำแหน่งของที่วางต้องมีช่องว่างขนาดเฉพาะ (หรือสุ่มด้วยขอบเขตที่ต่ำกว่า) ช่องว่างระหว่าง 'ช่องว่าง' คือสิ่งที่จะเป็น ถือว่าเป็นโถงทางเดินนั่นคือพื้นที่ที่อยู่ในบ้าน แต่ไม่ใช่ในห้องและผู้ถือห้องจะเต็มไปด้วยห้องขนาดสุ่มคล้ายกับ 'ดันเจี้ยนที่ไม่มีตัวอย่างของคุณ'
Benjamin Danger Johnson

@pek โปรดสร้างคำตอบสำหรับวิธีการแก้ปัญหาของคุณอย่าใส่ไว้ในคำถาม
MichaelHouse

@ Byte56 เรียบร้อยแล้ว เพื่อความชัดเจนฉันทำอย่างนั้นเพราะฉันไม่ต้องการรับเครดิตเพราะฉันทำตามที่คนอื่นแนะนำเท่านั้น ฉันเข้าใจว่าทำไมจึงไม่เหมาะกับรูปแบบของเว็บไซต์ดังนั้นฉันจึงเพิ่มคำตอบ
pek

ขอบคุณ @pek ไม่ต้องกังวลเกี่ยวกับการได้รับเครดิตมันสมควรได้รับและเป็นประโยชน์กับผู้ที่มาที่เว็บไซต์เพื่อดูวิธีแก้ปัญหา
MichaelHouse

คำตอบ:


50

ฉันคิดว่านี่เป็นกรณีที่ดีสำหรับการใช้พื้นที่พาร์ติชันไบนารีหรือไตรภาคการ

ในการผ่านครั้งแรกแบ่งพื้นที่บ้านเป็นห้องโถงและ {บล็อกของห้อง} รับก้อนใหญ่ชิ้นถัดไปแยกเป็น {ฮอลล์และก้อน} หรือ {2 ชิ้นและห้องโถงระหว่างพวกเขา} ในทุกขั้นตอนหมุนทิศทางการแบ่ง 90 องศา หยุดเมื่อ {เหลือชิ้นเหลืออีกมาก} หรือ {พื้นที่โถงทั้งหมดถึงขีด จำกัด }

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

หากห้องโถงใดที่หันหน้าไปทางห้องโถงที่เก่าแก่มากให้วางผนัง (หรือผนังที่มีประตู) ที่นั่น

เชื่อมต่อห้องกับห้องโถงโดยตรงหรือผ่านห้องอื่นที่เชื่อมต่อแล้ว

ตัวอย่างเช่นคุณสามารถดูด้วยตนเองที่สร้างขึ้นของฉันผลหรือ C ++ - เหมือนกันบางส่วนทำหลอกรหัส นัดสุดท้าย:

นัดสุดท้าย


นั่นคือสิ่งที่การวิจัยของฉันส่งผลให้เกิดการแบ่งพื้นที่ ตัวอย่างของคุณที่มีโค้ดให้การเริ่มต้นที่ดีมากแก่ฉัน ฉันกำลังอ่านอัลกอริทึม แต่คำถามหนึ่งข้อ: หนึ่งในความต้องการของฉันคือห้องถูกกำหนดไว้ล่วงหน้า (เช่นมีห้อง 2x2 ประตูเดียว 1x1 ประตูสองบาน แต่ไม่มี 2x2 ประตูสามบาน) ดังนั้นฉันจึงไม่สามารถเริ่มแบ่งพาร์ติชันแล้วตัดสินใจว่าจะวางประตูที่ไหน . ฉันคิดว่าฉันต้องจำข้อ จำกัด ของตัวเองในขณะที่กำลังแบ่ง คุณมีคำแนะนำสำหรับฉันจะไปเกี่ยวกับเรื่องนี้? ในกรณีใด ๆ ขอบคุณมากสำหรับคำตอบและความพยายามของคุณ!
pek

@pek ฉันไม่แน่ใจว่าปุถุชนเพียงสามารถหาวิธีแก้ปัญหาทางวิชาการสำหรับปัญหานี้ คุณสามารถลองตั้งค่าเงื่อนไขเพิ่มเติมสำหรับตัวแยกตัวแยกและตัวแยกกล่องแล้วสร้างและวางระดับจนกว่าคุณจะพบเงื่อนไขที่ตรงตามเงื่อนไขทั้งหมด
Shadows In Rain

ใช่ฉันหวังว่าฉันจะหายไปบางสิ่งบางอย่าง วิธีแรกของฉันคือการใช้ A * เพื่อหาวิธีปรับขนาดของห้องในพื้นที่ที่กำหนด แต่มันไม่มีตรรกะสำหรับห้องโถง ตอนนี้ฉันคิดว่าฉันสามารถใช้ BSP เพื่อวางฮอลล์แล้วใช้ A * กับบล็อก สิ่งที่ฉันกังวลเป็นส่วนใหญ่คืออาจแพงเกินไปและไม่ให้ผลลัพธ์เสมอไป แต่ฉันจะต้องทดสอบสิ่งนี้ก่อน บางทีมันอาจจะไม่แย่เท่าไหร่?
pek

2
@pek ฉันพบสิ่งที่มีประโยชน์หากคุณยังสนใจ ดูนี่สิ google L-systemด้วย
Shadows In Rain

24

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

  1. ออกแบบทางเดินและ "ช่องว่างขนาดใหญ่" สำหรับห้องพัก
  2. เติมเต็ม "พื้นที่ขนาดใหญ่" แต่ละห้องด้วยห้องพัก

2 ขั้นตอน

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


15

ดังนั้นนี่คือวิธีที่ฉันแก้ไขปัญหานี้ แต่ก่อนอื่นฉันอยากจะขอบคุณ @Shadows In Rain และ @egarcia สำหรับคำตอบของพวกเขา พวกเขาให้ทิศทางที่ดีซึ่งช่วยให้ฉันได้ผลลัพธ์

ฉันใช้การแบ่งพื้นที่ของ Shadows In Rain เพื่อสร้างบ้านขั้นพื้นฐานจากนั้นทำตามคำแนะนำของ egarcia เพื่อเติมเต็มห้องพัก

การแบ่งช่องว่างค่อนข้างตรงไปตรงมาเนื่องจาก 90% ของรหัสนั้นทำโดย Shadows ส่วน "เติมห้องพัก" นั้นท้าทายเล็กน้อย ฉันตัดสินใจใช้ระบบการวางแผน AI หลอกที่ใช้ A * เพื่อจัดตำแหน่งห้องอย่างเหมาะสม สิ่งที่ดีเกี่ยวกับการใช้การวางแผนแทนเพียง A * คือเงื่อนไขเบื้องต้นช่วยลดพื้นที่การค้นหาลงอย่างมาก

นี่คือภาพหน้าจอบางส่วนที่มีผลลัพธ์:

เฟสการสร้างแผนชั้น เฟสการสร้างแผนชั้น

เฟสการจัดวางห้อง เฟสการจัดวางห้อง

ขณะนี้มีประตูเชื่อมต่อ!
ขณะนี้มีประตูเชื่อมต่อ!


11

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

งานของพวกเขาได้รับการออกแบบรอบ ๆ สมมติฐานที่ทำให้เข้าใจง่ายดังต่อไปนี้:

  • จัดการกับอาคารอพาร์ตเมนต์เท่านั้น
  • ไม่มีระดับแยก
  • การ จำกัด รูปร่างของอาคาร (ซองจดหมาย) จะต้องเป็นรูปหลายเหลี่ยม
  • ไม่มีรูในซองจดหมาย
  • ความหนาของซองจดหมายที่คล้ายกันหรือเปลี่ยนแปลงเป็นเชิงเส้น (IE ไม่มีรูปร่างนาฬิกาทราย)
  • จัดการเฉพาะอาคารที่ต้องการทางเดิน

นี่คือภาพรวมคร่าวๆของกระบวนการ:

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

    • น้ำหนักเมล็ดถูกใช้เพื่อกำหนดขนาดห้อง มีการเพิ่มเมล็ดที่ประตูและหน้าต่าง มีการเพิ่มเมล็ดเพิ่มเติมโดยทั่วไปหนึ่งรายการต่อห้องที่ต้องการ; ในขณะที่ไม่ได้ระบุไว้อย่างชัดเจนดูเหมือนว่าเมล็ดถูกวางไว้ตามผนังด้านนอกของอพาร์ตเมนต์
    • เริ่มต้นด้วยจุดที่ไกลที่สุดเส้นแบ่งระหว่างเมล็ดที่กำหนดและจุดอื่น ๆ ทั้งหมดจะถูกคำนวณแล้วแบ่งเป็นระยะทางเทียบกับน้ำหนักของจุดสิ้นสุดที่เกี่ยวข้อง (EG ถ้า A & B มีน้ำหนัก 1 & 4 จุดตัดจะเป็น 1/4 ของทางจาก A ถึง B) คอลเลกชันของเส้นแบ่งครึ่งพร้อมกับผนังด้านนอกแล้วรูปแบบเซลล์สำหรับเมล็ด
    • ถัดไปโครงกระดูกผนัง S-Space (ตาม Peponis et al 1997) ถูกสร้างขึ้นโดยการแบ่งพื้นที่ที่มีเส้นเกิดขึ้นในแนวตั้งฉากจากจุดกึ่งกลางระหว่างคู่ผนังด้านนอก (หน้าต่างหรือประตู)
    • ในที่สุดผนังจะถูกเลือกจากโครงกระดูก S-space ที่ 'สอดคล้องกับผนังเซลล์ Voronoi'

3
คุณรวมรูปภาพได้ไหม มันจะดีมาก. ฉันอ่านกระดาษและห้องที่พวกเขาสร้างนั้นดูดีจากมุมมองทางสถาปัตยกรรม
congusbongus

วิธีการที่น่าสนใจมากฉันจะต้องตรวจสอบตัวเองอย่างใกล้ชิดมากขึ้นสำหรับความคิดใด ๆ ที่ฉันสามารถนำออกไปได้
Draco18s

ฉันมาที่นี่เพื่อพักผ่อนจากการทำงาน ... เซอร์ไพรส์หัวข้อการวิจัยของฉันออกมา ฉันขี้เกียจเกินไปที่จะเขียนคำตอบจากงานวิจัยของฉันเอง (ฉันเพิ่งออกแบบโครงกระดูกเปลือยของ algoirthm ดังนั้นมันจึงไม่คุ้มค่าเลย) หรืออธิบายวิธีการของ Danil Nagy ต่อปัญหาดังนั้นฉันจะทิ้งมันไว้ที่นี่autodeskresearch.com/publications/…
Felipe Gutierrez
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.