เส้นต่อรูปหลายเหลี่ยม


11

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

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

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


เส้นตรงหรือไม่ เส้นสามารถข้ามได้หรือไม่? (เช่นมันสะอาดหรือไม่) ถ้าเป็นเช่นนั้นฉันหวังว่าการเรียกใช้กระบวนการนี้ Build จะไม่เฉพาะเจาะจงแอปมากเกินไป
Kirk Kuykendall

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

มีจุดบนเครื่องบินหรือบนทรงกลมหรือไม่?
Kirk Kuykendall

โบสถ์ ... บนเครื่องบินเมตริก x, y พิกัดไม่ใช่พิกัดกลม ตัวอย่างเช่นสมมติว่าคุณมีส่วนของเส้นตรงที่จะสร้างไดอะแกรม voronoi แต่สิ่งที่คุณมีคือส่วนที่เป็นรูปแบบ แต่ไม่ใช่โครงสร้างข้อมูลจริงที่นำไปสู่ กล่าวโดยย่อคือทุกส่วนเชื่อมต่อกันและทุกส่วนมีลักษณะเฉพาะ

คำตอบ:


4

อาจจะ "เติมพื้นที่"? ดูที่นี่และที่นี่

แก้ไข

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

ตัวอย่าง

กราฟต้นฉบับ:

กราฟต้นฉบับ

กราฟสามเหลี่ยม:

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


Bill กำลังจะโหวตเพราะฉันไม่เจอว่า ... ไม่ต้องการจำกัดความคิดเห็นอื่น ๆ จากผู้คนในหลากหลายสาขา

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

@ การเรียงลำดับโดย y หรือ x เป็นสิ่งสำคัญตามที่คุณแนะนำ นอกจากนี้คุณยังถูกต้องที่เกี่ยวข้องกับอัลกอริธึมการกวาดล้างระนาบหรือการปัดกวาดแนวเส้น แต่น่าเสียดายที่นี่เป็นเทคนิคทั่วไปที่ครอบคลุมขั้นตอนการคำนวณเชิงเรขาคณิตเกือบทั้งหมดดังนั้นจึงไม่ใช่คำที่เหมาะสมสำหรับการค้นหาอัลกอริทึมของคุณโดยเฉพาะ โปรดทราบว่าปัญหาเฉพาะนี้ไม่ใช่กราฟเชิงทฤษฎีล้วนๆเพราะมันเกี่ยวข้องกับการฝังโพลีไลน์คอมเพล็กซ์ลงในระนาบ (หรือทรงกลม) ดังนั้นอัลกอริธึมที่ดีต้องรักษาข้อมูลเกี่ยวกับการฝัง: นั่นเป็นเหตุผลว่าทำไมมันจึงเป็นปัญหาการเติมพื้นที่ ที่หัวใจ.
whuber

5

ในทฤษฎีกราฟ , การดำเนินการนี้จะเรียกว่าใบหน้าคำนวณ มันเกี่ยวข้องกับการคำนวณของสองกราฟที่กำหนด

ยกตัวอย่างเช่นในGeOxygèneห้องสมุด Java, กราฟ (เรียกว่าCarteTopo ) มีวิธีการที่จะดึง getFaces ของใบหน้า

สิ่งนี้เรียกว่ารูปหลายเหลี่ยมในJTS


ลิงค์ที่ดี อย่างไรก็ตามพวกเขาเข้าใจว่าปัญหาของ @ Dan ได้รับการแก้ไขแล้ว: การสามารถเรียกกราฟ "ภาพถ่าย" หมายความว่าคุณได้ระบุใบหน้ารูปหลายเหลี่ยมแล้ว เขาต้องการที่จะรู้ว่าใครจะแปลงคอลเลกชั่นของอาร์ค (บนเครื่องบิน) โดยพลการเป็นกราฟระนาบแบบซื่อสัตย์ต่อความดีได้ตั้งแต่แรก สิ่งนี้ต้องการสร้างการแสดงถึง "โทโพโลยี" เช่น DCEL
whuber

ขอบคุณมากที่คุณมีความรู้! ฉันสงสัยว่าใครบางคนสามารถฉลาดมากได้
Julien

4

ซอฟต์แวร์โฮสต์ RepRap แปลงรายการของส่วนของเส้น (ในลำดับสุ่มที่ไม่รู้จัก) เป็นรายการรูปหลายเหลี่ยมซึ่งฟังดูคล้ายกับสิ่งที่คุณพยายามทำ

โดยเฉพาะอย่างยิ่งอัลกอริทึม RepRap "จับคู่สิ้นสุด"จัดการกรณีทางพยาธิวิทยาหลายกรณี

อนิจจา, ซอฟแวร์ RepRap ถือว่าทุกซอกทุกมุมมีแม้กระทั่งจำนวนขอบไปมัน - 2 สายจะไปที่มุมบนวัตถุปกติ; 4 เส้นเข้าด้วยกันเมื่อมุมของวัตถุหนึ่งแตะที่มุมของวัตถุอื่น ฯลฯ ฉันไม่รู้ว่ามันยากแค่ไหนที่จะปรับอัลกอริทึมนี้เพื่อจัดการไดอะแกรม voronoi ซึ่งมักจะมี 3 ขอบไปทุกมุม


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

3

คุณสำรวจฐานรหัสของ GRASS เพื่อหาทางแก้ไขปัญหาของคุณหรือไม่? -> http://old.nabble.com/Polyline-to-Polygon-operation-td20257839.html


1
ขอบคุณ ... แต่ฉันไม่ได้กำลังมองหาวิธีแก้ปัญหา "แพคเกจ" เฉพาะ แต่อัลกอริทึมพื้นฐานและ / หรือชื่อซึ่งจะมาในพื้นที่ต่าง ๆ ของ GIS, Comp Geom และ / หรือ Comp Sci ... ให้ความคิดมา

ฉันคิดถึงการดูซอร์สโค้ดที่อยู่เบื้องหลัง 2 กระบวนการที่กล่าวถึงในลิงค์ของฉันโดยเฉพาะอาจช่วยคุณได้
oeon

ฉันเดาว่าฉันจะต้องติดตั้งซอฟต์แวร์เพื่อดูรหัสเนื่องจากฉันไม่เห็นรายชื่อใด ๆ ในหน้าเหล่านั้นเว้นแต่ว่าฉันทำอะไรหายไป

1
คุณสามารถเรียกดูแหล่งที่มาของ GRASS ออนไลน์: trac.osgeo.org/grass/browser
underdark

@underdark ขอบคุณสำหรับตัวชี้ เท่าที่ฉันสามารถบอกได้จากmain.cในv.typeแหล่งที่มาสิ่งที่เกิดขึ้นคือคุณสมบัติถูกติดป้ายใหม่เป็นขอบเขต: ไม่มีการประมวลผลจริงเกิดขึ้น เมื่อมองย้อนกลับไปสิ่งนี้ไม่น่าแปลกใจเกินไป: ถ้า (ฉันไม่รู้แน่ชัด) คุณลักษณะนี้ได้รับการบำรุงรักษาด้วยข้อมูลโทโพโลยี 2 มิติแบบเต็มรูปแบบการคำนวณทั้งหมดเพื่อระบุภูมิภาคเหลี่ยมได้เกิดขึ้นโดยอัตโนมัติระหว่างการสร้างหรือนำเข้าคุณลักษณะ การดำเนินการประมวลผลทางภูมิศาสตร์ทั้งหมด
whuber

3

สวัสดี

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

คุณควรแบ่งปัญหาอย่างน้อย 2 ส่วน 1) ปัญหาเครือข่ายมีมากขึ้นวิธีหาแหวนที่ปิดของ linestrings 2) แสดงความสัมพันธ์ที่ปิดเป็นรูปหลายเหลี่ยม

ส่วนที่สองคือ "การแปลงบรรทัดเป็นรูปหลายเหลี่ยม" ขึ้นอยู่กับรูปแบบมากกว่าการแสดงรูปหลายเหลี่ยม / linestring ฉันหมายถึงการไปจาก:

LINESTRING (1 1, 2 2)
LINESTRING (2 2, 2 1)
LINESTRING (2 1, 1 1)

ถึง:
POLYGON ((1 1,2 2,2 1,1 1))

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

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

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

ใน PostGIS ฟังก์ชันนี้เรียกว่าST_Polygonize ฟังก์ชันนั้นสร้างรูปหลายเหลี่ยมที่เป็นไปได้ทั้งหมดจาก linestrings ที่คุณให้

ดำเนินการโดย GEOS เพื่อให้คุณสามารถค้นหาอัลกอริทึมที่อยู่เบื้องหลังทั้งในรหัส GEOS และ JTS

แค่ความคิดบางอย่าง

/ Nicklas


1

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


1
ฉันจะแสดงความคิดเห็นที่นี่แม้ว่าความคิดเห็นนี้จะกล่าวถึงโซลูชันอื่น ๆ ที่เสนอเช่นกัน: ปัญหาไม่สามารถแสดงในเครือข่าย (หรือกราฟ) มันต้องมีข้อมูลเกี่ยวกับวิธีเส้นที่มีการเชื่อมต่อภายในพื้นผิวสองมิติ ดังนั้นการเป็นตัวแทนดาวไปข้างหน้า / ถอยหลังจะใช้เพียงเล็กน้อย DCEL หรือสิ่งที่ต้องการ
whuber

@ โฮเบอร์ - ฉันสันนิษฐานว่าความคิดเห็นของแดนว่า "ข้อบกพร่อง" ทั้งหมดถูกลบออกโดยนัยว่าเส้นนั้นสะอาด ด้วยเหตุนี้จึงเป็นไปได้ที่จะลดสิ่งนี้เป็นปัญหาการสำรวจเส้นทางกราฟในการค้นหาวัฏจักรทั้งหมดในกราฟ ตอนแรกฉันคิดว่าดาวดวงหน้าจะช่วยในอัลกอริทึมที่เดินไปรอบ ๆ กราฟที่เลี้ยวขวาสุดที่คมชัดที่สุดที่แต่ละโหนด อย่างไรก็ตามการมองอีกเล็กน้อยปรากฏว่ามีวิธีที่ดีกว่า stackoverflow.com/questions/261573/… แต่ถึงกระนั้นก็ถือว่าปัญหานี้สามารถระบุอีกครั้งเป็นกราฟ
Kirk Kuykendall

1
การค้นหารอบในกราฟนั้นไม่เหมือนกับการค้นหาใบหน้าในกราฟระนาบ พิจารณากราฟนามธรรมที่มีจุดยอด {a, b, c, d} และขอบ {a, b}, {a, c}, {b, c}, {b, d}, {c, d} พื้นฐานสำหรับวงจรประกอบด้วย a-> b-> d-> c-> a และ a-> b-> c-> a ในระนาบการฝัง -> (0,1), b -> (2,2), c -> (2,0), d -> (3,1) (ที่ขอบทั้งหมดเป็นส่วนของเส้น) รอบ a-> b-> d-> c-> a ไม่ใช่ใบหน้า แต่ถ้าเราย้าย d ไปที่ (1,1) จะเป็นใบหน้า นี่แสดงให้เห็นว่าทำไมแนวคิดของ "ใบหน้า" จึงต้องการให้กราฟฝังอยู่ในระนาบและทำไมใบหน้าไม่สามารถคำนวณได้อย่างหมดจดจากโครงสร้างนามธรรมของกราฟ
whuber
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.