จะกำหนดอ่าวและช่องแคบได้อย่างไรในแผนที่ที่สร้างขึ้นตามขั้นตอน


40

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

ปัจจุบัน

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

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

ช่องแคบเป็นทางน้ำที่แคบและก่อตัวขึ้นตามธรรมชาติซึ่งเชื่อมระหว่างสองส่วนของมหาสมุทร โดยพื้นฐานแล้วที่ซึ่งที่ดินสองผืนเกือบจะสัมผัสและมีมหาสมุทรทั้งสองด้าน เรียกอีกอย่างว่า "ช่อง"

สำหรับการพิจารณาคุณสมบัติฉันสามารถวนลูปผ่านคุณสมบัติใด ๆ ตามประเภทดังนี้:

for each (var feature:Object in geography.getFeaturesByType(Geography.LAND))
  // loop through lands
  for each (var cell:Cell in feature.cells)
  // loop through cells
    for each (var neighbor:Cell in cell.neighbors)
    // loop through a cell's neighbors
      trace(neighbor.hasFeatureType(Geography.LAND));

8
ฉันแนะนำลักษณนามของ baysian
สะสม

1
@ การคำนวณนี่คือการเล่นสำนวนใน "อ่าว" หรือนี่คือข้อเสนอแนะที่จริงจัง? หากหลังคุณควรเขียนคำตอบที่เหมาะสมเกี่ยวกับเรื่องนี้
Philipp

ฉันชอบ 99% ว่าเขาล้อเล่น
Olin Kirkland

คำตอบ:


29

วิธีที่ Dragons Abound ระบุอ่าวคือการเดินไปตามแนวชายฝั่งและหาจุดสองจุดบนแนวชายฝั่งที่ระยะทางตรงระหว่างจุดนั้นน้อยกว่าระยะทางตามแนวชายฝั่งระหว่างจุด นี่คือความผิดปกติของแนวชายฝั่งระหว่างสองจุด ด้วยการเลือกขีด จำกัด และข้อ จำกัด สำหรับระยะทางเส้นตรงระหว่างจุดคุณสามารถระบุอ่าวลึกแคบอ่าวตื้นตื้น ฯลฯ

ในภาพนี้จุดสีแดงและสีม่วงแสดงจุดรับสมัครสองจุดและเส้นสีเขียวคือแนวชายฝั่งระหว่างจุด ความบาปคืออัตราส่วนของความยาวทั้งสอง:

ตัวอย่างของอ่าว

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

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

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

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

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


3
ฉันควรจะได้รู้จักกับมังกรมากมายจะมีคำตอบที่ฉันต้องการ
Olin Kirkland

48

นี่เป็นแนวคิดคร่าวๆที่ใช้การแปลงการประมวลผลภาพเพื่อแยกคุณสมบัติที่น่าสนใจ:

  1. ใช้น้ำท่วมเติมจากเซลล์มหาสมุทรเพื่อทำหน้ากากของเซลล์มหาสมุทรทั้งหมด คุณอาจต้องเพิ่มระดับความสูงหรือเกณฑ์การกวาดล้างพิเศษเพื่อป้องกันไม่ให้หน้ากากทะเลไหลจากบก ;)

    หน้ากากทะเล

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

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

    ชายฝั่งทะเลเรียบ

  3. เปลี่ยนหน้ากากเป็นสนามระยะไกลโดยที่แต่ละเซลล์เก็บระยะทางจากแนวชายฝั่งที่ราบเรียบ

    สนามระยะทาง

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

ไฮไลท์สันเขา

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

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

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


9
สิ่งนี้ดูเจ๋งจริงๆและอาจเร่งความเร็วได้มากโดยใช้โครงสร้างเซลล์โดยตรงเพื่อใช้ขั้นตอนต่าง ๆ แทนการแสดงแบบกราฟิก!
เควนติน

7
วิธีที่สอง (กำหนด ID ที่แตกต่างกันของแต่ละทวีปและจำแนกตามว่าเป็นทวีปเดียวกันทั้งสองข้างของร่างกายน้ำหรือไม่) ดูเหมือนว่าสิ่งที่ง่ายที่สุดในการทำ ..
Monty Harder

"landmass ID" เป็นความคิดที่ดีเพราะคุณจะต้องใช้มันในการทำแผนที่เพื่อสร้างชื่อเกาะ
MSalters

6

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

อ่าว

  • เซลล์มหาสมุทรใด ๆ ที่เชื่อมต่อกับเซลล์มหาสมุทรอื่น ๆ เพียงเซลล์เดียว
  • หรือ: เซลล์มหาสมุทรใด ๆ ที่เชื่อมต่อกับพื้นดินมากกว่าเซลล์มหาสมุทรโดยมีเซลล์มหาสมุทรทั้งหมดอยู่ติดกัน
  • หรือ: เหมือนข้างต้น แต่มีเกณฑ์ตามความยาวชายแดน (เช่นที่ดินสองเท่าของเส้นขอบน้ำ)

ช่องแคบ

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

2
เมื่อช่องแคบนำไปสู่อ่าวดังนั้นทั้งสองเข้าด้วยกันอาจถูกระบุว่าเป็นฟยอร์ด
ฟิลิปป์

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

ใช่การปรับขนาดเป็นปัญหาเล็กน้อยและจะส่งผลกระทบต่อวิธีการกำหนดสิ่งต่าง ๆ และประกาศ 'เซลล์' พิจารณาแผนที่ของแคนาดาและเปรียบเทียบสิ่งต่อไปนี้: อ่าวฮัดสัน, อ่าวเจมส์, อ่าวเซนต์ลอว์เรนซ์, และอ่าวแห่ง Fundy คุณใช้กฎเหล่านี้อย่างน่าเชื่อถือเพื่อรับชื่อที่เกี่ยวข้องที่ต้องการได้อย่างไร - มี "ตรง" ระหว่าง Newfoundland และ Nova Scotia หรือไม่?
TheLuckless
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.