2015-11-30 13 views
7

मैं कोड का एक टुकड़ा लिखने की कोशिश कर रहा हूं जिसमें बहुभुज की सूची दी गई है (IntPoints की सूचियों की सूची के रूप में परिभाषित) चेक अगर उनमें से कोई भी स्पर्श करता है और यदि उन्हें एक बहुभुज में विलय करता है । ऐसा करने के लिए मैं पहले से ही निम्नलिखित दो तरीकों की कोशिश की है:गलत परिणाम देने वाले बहुभुज बहुभुज

List<List<IntPoint>> output=new List<List<IntPoint>>(); 
output = Clipper.SimplifyPolygons(input,PolyFillType.pftPositive); 

और

Clipper c = new Clipper(); 
c.AddPaths(input, PolyType.ptClip, true); 
c.Execute(ClipType.ctUnion, output); 

अब इन दोनों को एक साथ काफी आसानी से बहुभुज विलय लेकिन वे किसी भी बहुभुज खुली जगह के रूप में एक सा overzelous हैं अनदेखा कर रहे हैं और खुले क्षेत्रों को केवल एक बहुभुज में जोड़ा जाता है, जिसका अर्थ है कि इस तरह कुछ: Sheer horror as a two polygons that are not touching are merged into a single square devoid of any meaning or life

होता है। अब यह स्पष्ट रूप से गलत है क्योंकि ये दो बहुभुज एक-दूसरे को छूते नहीं हैं। एक ही परिणाम दोनों विधियों के साथ होता है। नतीजा इनपुट के समान होगा। इसे ठीक करने के लिए कोई भी विचार? सोल्शन को क्लिपर लाइब्रेरी का उपयोग नहीं करना पड़ता है (मैं इससे विवाहित नहीं हूं) लेकिन मुझे कुछ ऐसा करने की ज़रूरत है जो पॉलीगोन का उपयोग करता है जो पॉइंट इनपुट की सूची द्वारा परिभाषित किया गया है एक सूची है> जहां एक इंटॉइंट सिर्फ एक स्ट्रक्चर होता है जिसमें एक्स होता है और एक वाई।

संपादित मुझे लगता है कि इस समस्या को भी जब वहाँ अन्य बहुभुज के अंदर कोई बहुभुज है तब होता है नोटिस, तो समाधान हमेशा होता है "भरा" संपादित करें संपादित करें: यहाँ भी क्या इनपुट

input[0][0] 
{ClipperLib.IntPoint} 
    X: -724 
    Y: -472 
input[0][1] 
{ClipperLib.IntPoint} 
    X: 428 
    Y: -472 
input[0][2] 
{ClipperLib.IntPoint} 
    X: 428 
    Y: -472 
    input[0][3] 
{ClipperLib.IntPoint} 
    X: 428 
    Y: 632 
input[0][4] 
{ClipperLib.IntPoint} 
    X: 428 
    Y: 632 
input[0][5] 
{ClipperLib.IntPoint} 
    X: -724 
    Y: 632 
input[0][6] 
{ClipperLib.IntPoint} 
    X: -724 
    Y: 632 
input[0][7] 
{ClipperLib.IntPoint} 
    X: -724 
    Y: -472 
input[0][8] 
{ClipperLib.IntPoint} 
    X: -88 
    Y: -218 
input[0][9] 
{ClipperLib.IntPoint} 
    X: -107 
    Y: -218 
input[0][10] 
{ClipperLib.IntPoint} 
    X: -107 
    Y: -218 
input[0][11] 
{ClipperLib.IntPoint} 
    X: -107 
    Y: -209 
input[0][12] 
{ClipperLib.IntPoint} 
    X: -107 
    Y: -209 
input[0][13] 
{ClipperLib.IntPoint} 
    X: -320 
    Y: -172 
input[0][14] 
{ClipperLib.IntPoint} 
    X: -320 
    Y: -172 
input[0][15] 
{ClipperLib.IntPoint} 
    X: -320 
    Y: 132 
input[0][16] 
{ClipperLib.IntPoint} 
    X: -320 
    Y: 132 
input[0][17] 
{ClipperLib.IntPoint} 
    X: -88 
    Y: 173 
input[0][18] 
{ClipperLib.IntPoint} 
    X: -88 
    Y: 173 
input[0][19] 
{ClipperLib.IntPoint} 
    X: -88 
    Y: -201 
input[0][20] 
{ClipperLib.IntPoint} 
    X: -88 
    Y: -201 
input[0][21] 
{ClipperLib.IntPoint} 
    X: -88 
    Y: -218 
की तरह हो सकता है का एक उदाहरण है

इस descripes इनपुट एक छेद के साथ एक वर्ग है।

+0

कोई भी यह भी जानता है कि इस समस्या का वर्णन कैसे किया जाए? बहुभुज में बहुभुज विलय किया जा रहा है? Enclaves के लिए अनुमति नहीं है? – Thijser

+0

मुझे लगता है कि मुझे सोल्शन मिल सकता है लेकिन यह https://stackoverflow.com/questions/34263601/algoritm-for-translating-list-of-wallsections-into-coherent-polygon – Thijser

उत्तर

2

निष्पादन से पहले में में PolyType.ptSubject (आपके कोड से गायब) और PolyType.ptClip होने की आवश्यकता है।

private void Form1_Paint(object sender, PaintEventArgs e) 
    { 
     clip = new List<List<IntPoint>>(); 
     clip.Add(pol2); 

     input = new List<List<IntPoint>>(); 
     input.Add(pol1); 

     output = new List<List<IntPoint>>(); 

     Clipper c = new Clipper(); 
     c.AddPaths(input, PolyType.ptSubject, true); 
     c.AddPaths(clip, PolyType.ptClip, true); 
     c.Execute(clipType, output); 

     DrawPolygon(output, e.Graphics, Pens.Red); 
    } 

XOR:

enter image description here

संघ:

enter image description here

चौराहे इसके अलावा, आप, जिन्हें आप नीचे ClipType कि परिणाम आप चाहते हैं का उत्पादन करेगा का चयन करने की जरूरत है:

enter image description here

अंतर: pol1 - pol2

enter image description here

अंतर: pol2 - pol1

enter image description here

+0

के उत्तर पर निर्भर करेगा। समस्या के मुकाबले एक अनुचित इनपुट प्रारूप के साथ क्या करना है? – Thijser

+0

मुझे लगता है कि ऐडपैथ स्वचालित रूप से उन्हें वहां से विषयों के रूप में जोड़ देंगे, फिर भी 2 (और कुछ स्थितियों में केवल 1) बहुभुज हैं। – Thijser

-3

एक और बात आप में स्थानिक डेटाटाइप्स एसक्यूएल सर्वर 2008 जब में शुरू की है दिखाई दे सकता है ज्यामितीय आकार को संभालना।

https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.types.sqlgeometry.stintersection.aspx

भूगोल उसी यूआरएल है, लेकिन बजाय sqlgeography sqlgeometry

आप चौराहों को पुनः प्राप्त करने .STIntersects() == 1 और .STIntersection (AnotherShape) का उपयोग कर सकते है। उपरोक्त के समान परिणाम देने के लिए अन्य विधियां भी हैं।

इसका लाभ यह है कि यदि आप इसे अपने डेटाबेस के साथ शामिल करते हैं, तो आप इसे स्थानिक बनाने के लिए स्थानिक इंडेक्स का उपयोग कर सकते हैं।

https://msdn.microsoft.com/en-us/library/bb934196.aspx

+0

उपयोगी लेकिन इस सॉफ़्टवेयर में डेटाबेस से संबंधित कुछ भी शामिल नहीं है और मुझे नहीं लगता कि लोगों को डेटाबेस स्थापित करने के लिए मजबूर करना एक अच्छा विचार है। – Thijser

+0

मैं आपकी चिंता को समझता हूं लेकिन इसी तरह EntityFramework के साथ काम करने के लिए, आप .NET Framework (DbGeometry/DbGeography) में शामिल कक्षाओं का उपयोग कर सकते हैं और उन्हें मैन्युअल रूप से पॉप्युलेट कर सकते हैं। इसके लिए किसी डेटाबेस या किसी भी प्रकार की डेटा एक्सेस की आवश्यकता नहीं होती है। यह सिर्फ उन कक्षाओं की कार्यक्षमता में बनाया गया है जो स्थानिक डेटाटाइप के साथ काम करने के लिए डिज़ाइन किए गए थे। –

+0

इस उत्तर के पास ओपी पूछ रहा है के साथ कुछ भी नहीं है। – Randy

1

ऐसा लगता है कि पुस्तकालय की तरह निष्पादित विधि के PolyTree संस्करण, और क्लिपर वस्तु में बहुभुज की कुछ और अधिक जटिल निर्माण, कि ध्यान में रखा जाता इनपुट छेद होता है कि क्या के कुछ संयोजन की जरूरत है।

यह छेद के साथ हरे रंग की बहुभुज की तरह दिखता नहीं है, केवल बिंदुओं की एक सरणी के रूप में दर्शाया जाता है, यह बाहरी बहुभुज और आंतरिक छेद बहुभुज के साथ पॉलीट्री होना चाहिए।

+0

कोई विचार है कि मैं उससे कैसे संपर्क करूंगा? – Thijser

+0

मैंने इनपुट प्रारूप के उदाहरण में भी जोड़ा है। – Thijser

संबंधित मुद्दे