पर कमजोर-सरल-बहुभुज विभाजित करें मैं कमजोर-सरल बहुभुज को सरल बहुभुज में विभाजित करना चाहता हूं।सच सरल बहुभुज या बहुभुज
पृष्ठभूमि
उपयोग के मामले बहुभुज कि सरलीकृत कर रहे हैं (Unioned) Javascript Clipper का उपयोग कर सरल करने के लिए है। जावास्क्रिप्ट क्लिपर के साथ-साथ original Clipper'sSimplifyPolygon()
फ़ंक्शन स्वयं-छेड़छाड़ को हटा देता है और सामान्य किनारों को जोड़ता है, लेकिन यह वास्तविक सरल बहुभुज उत्पन्न नहीं कर सकता है। आउटपुट का उपयोग तीन.जेएस में किया जाता है, जिसमें TriangulateShapes()
है जो बहुभुज को सरल होने की आवश्यकता है। Three.js बहुभुज संरचनाओं को स्वीकार करता है जिनमें एक समोच्च और शून्य या एकाधिक छेद होते हैं।
इनपुट, कमजोर-सरल बहुभुज
दुर्बलता-सरल बहुभुज अनुक्रमिक-डुप्लिकेट-कोने (सच डुप्लिकेट अंक), और न ही छेद (द्वीप) और न ही स्वयं चौराहों (अन्य किनारे पर बढ़त को पार) नहीं हो सकता, लेकिन गैर-अनुक्रमिक-बहु-चरणीय हो सकते हैं (शिखर जिनके पास बिल्कुल समान समन्वय है लेकिन अनुक्रमिक नहीं है)। इनपुट बहुभुज में या तो सीडब्ल्यू या सीसीडब्ल्यू घुमावदार आदेश हो सकता है, जिसका अर्थ है कि सीडब्ल्यू इनपुट बाहरी बहुभुज है और सीसीडब्ल्यू एक छेद है। इनपुट या तो सीडब्ल्यू या सीसीडब्ल्यू बहुभुज है। अंक गिने जा रहे हैं
और यहाँ है, जहां आप:
इनपुट बहुभुज अंक उदा .:
// This is a true example of weakly-simple polygon: var input = [{"X":270,"Y":520},{"X":130,"Y":490},{"X":210,"Y":250},{"X":60,"Y":170},{"X":130,"Y":490},{"X":20,"Y":410},{"X":60,"Y":300},{"X":60,"Y":20},{"X":780,"Y":40}, {"X":680,"Y":180},{"X":460,"Y":130},{"X":210,"Y":250},{"X":320,"Y":100},{"X":220,"Y":80}, {"X":210,"Y":250},{"X":520,"Y":250},{"X":680,"Y":180},{"X":770,"Y":480},{"X":540,"Y":470}, {"X":520,"Y":250},{"X":380,"Y":280},{"X":430,"Y":390},{"X":540,"Y":470},{"X":270,"Y":520},{"X":330,"Y":350},{"X":210,"Y":250}];
यह एक छवि के रूप में ऊपर input
बहुभुज है की एक सरणी है आसानी से देख सकते हैं कि कौन से बिंदु डुप्लिकेट हैं:
जैसा कि आप देख, ऊपर बहुभुज, कई मायनों में बांटा जा सकता है जैसे .:
- पांच बाहरी बहुभुज एक के बाद एक छेद है, जिनमें से
आउटपुट, के रूप में सरल बहुभुज - पाँच छेद के साथ एक बाहरी पॉलीगॉन एक exPolygon संरचना
सरल बहुभुज एक बहुभुज है जिसमें कोई आत्म-चौराहे नहीं है, कोई डुप्लिकेट निर्देशांक नहीं है कि वे अनुक्रमिक या अनुक्रमिक थे, कोई छेद नहीं था। आउटपुट के साधारण बहुभुज में सीडब्ल्यू या सीसीडब्ल्यू घुमावदार आदेश हो सकता है। सीडब्ल्यू का मतलब बाहरी और सीसीडब्ल्यू छेद है।
आउटपुट में (और कई बार होगा) छेद हो सकता है, लेकिन कुछ मामलों में आउटपुट में कोई छेद नहीं होता है। आउटपुट में कम से कम एक बाहरी बहुभुज होता है, लेकिन कई बाहरी बहुभुज भी हो सकते हैं जिनमें शून्य या अधिक छेद होते हैं।
आउटपुट exPolygon ऑब्जेक्ट्स की एक सरणी होनी चाहिए जिसमें गुण "बाहरी" और "छेद" हों। "बाहरी" बिंदु वस्तुओं की एक सरणी है, "छेद" बिंदु वस्तुओं के सरणी की एक सरणी है। यदि "छेद" आबादी है, तो इसमें छेद exPolygon ऑब्जेक्ट में "बाहरी" बहुभुज के छेद होना चाहिए।
उत्पादन का उदाहरण:
// This is an example of output, but the points are random: [ { "outer": [{"X":54,"Y":4},{"X":2,"Y":50},{"X":30,"Y":5},{"X":10,"Y":50}], "holes": [ [{"X":0,"Y":8},{"X":60,"Y":13},{"X":21,"Y":2},{"X":3,"Y":1}], [{"X":21,"Y":2},{"X":50,"Y":2},{"X":6,"Y":1}] ] }, { "outer": [{"X":54,"Y":4},{"X":2,"Y":50},{"X":30,"Y":5},{"X":10,"Y":50}], "holes": [ [{"X":0,"Y":8},{"X":60,"Y":13},{"X":21,"Y":2},{"X":3,"Y":1}], [{"X":21,"Y":2},{"X":50,"Y":2},{"X":6,"Y":1}] ] }, { "outer": [{"X":54,"Y":4},{"X":2,"Y":50},{"X":30,"Y":5},{"X":10,"Y":50}], "holes": [] } ];
आउटपुट के "बाहरी" बहुभुज सीडब्ल्यू, और "छेद" हैं सीसीडब्ल्यू हैं।
बहुभुज में बिंदुओं की संख्या, exPolygons वस्तुओं की गिनती और छेद की गिनती की कोई सीमा नहीं है।
विभाजन
यहाँ का उदाहरण इनपुट बहुभुज का एक उदाहरण है::
यहाँ है
यहाँ कमजोर सरल बहुभुज के अन्य उदाहरण हैं इसे कैसे विभाजित किया जा सकता है:
कुछ अन्य बहुभुज आधार पर ouput के कई संभावित विकल्पों जहां छद्म डुप्लिकेट-अंक हैं हो सकता है।
मेरा प्रश्न
कैसे बहुभुज इस तरह से और वांछित उत्पादन संरचना हासिल विभाजित किया जा सकता? मैं पूरा कोड नहीं पूछ रहा हूं (लेकिन यदि आपके पास कुछ खाली समय है और यह दिखाना चाहता है कि यह संभव है)। संभावित एल्गोरिदम के विचार भी स्वागत है।
मैंने घंटों के समाधान की खोज की है और एक एल्गोरिदम खोजने की कोशिश की है।
यदि आप समाधान का प्रयास करना चाहते हैं, तो मेरे पास एक कोड है जिसे मैंने डुप्लीकेट खोजने के लिए उपयोग किया है: http://jsbin.com/unuyev/7/edit। यह एसवीजी में बहुभुज दिखाता है और अंक को लाल मंडल और प्रत्येक बिंदु की सरणी अनुक्रमणिका के रूप में दिखाता है (बटन "जेएस के साथ चलाएं" दबाकर)।
यहाँ ही है, लेकिन 12 उदाहरण बहुभुज (जावास्क्रिप्ट विंडो में परिवर्तन pindex
बहुभुज को बदलने के लिए) के साथ: http://jsbin.com/unuyev/4/edit
संपादित करें: Javascript Clipper 6 अब उपलब्ध है और StrictlySimple
के लिए समर्थन नहीं है। लेकिन दस्तावेज़ीकरण के मुताबिक "वर्तमान में कोई गारंटी नहीं है कि 'सरलीकरण' के बाद बहुभुज सख्ती से सरल होंगे क्योंकि अभी भी प्रगति पर एक काम है"। मैंने StrictlySimple का परीक्षण किया है और यह कुछ मामलों में विफल रहता है: Orientation problems और lack of rotation invariance। हमें आशा है कि ये जल्द ही तय हो जाएंगे और StrictlySimple
अपेक्षित कार्य करता है।
उत्तर के लिए धन्यवाद! दुर्भाग्यवश, मुझे समझ में नहीं आता कि यह प्रश्न से कैसे जुड़ता है: साधारण बहुभुजों को कमजोर-सरल-बहुभुज को विभाजित करने और समोच्चों और छेदों की संरचना का उत्पादन कैसे करें। लेकिन ऐसा इसलिए हो सकता है कि मैं उस क्षेत्र को नहीं जानता जो आप बात कर रहे हैं। –
@ टिमो आप अपने बहुभुजों को ग्राफ के रूप में पॉलीगोन शिखर के साथ ग्राफ के रूप में वर्णित कर सकते हैं। तो यदि आपके पास वर्टेक्स है, तो उसके पास एक आसन्नता सूची होगी, जिसका अर्थ यह है कि यह अन्य शीर्षकों की एक सूची है जो उससे जुड़ा हुआ है। अब इस संरचना का उपयोग करके आप अपने बहुभुज में छेद का भी वर्णन कर सकते हैं। तो आप बहुभुजों के साथ समाप्त हो जाएंगे जिन्हें आप अभिव्यक्ति चरम पर आधारित कर सकते हैं, और इन विभाजित बहुभुज में भी छेद हो सकते हैं। –
यह अच्छी तरह से अच्छी और कुशल विधि लगता है। क्या आपको लगता है कि आपके द्वारा वर्णित एल्गोरिदम का उपयोग करके exPolygon संरचना निकाली जा सकती है? मेरा मतलब है कि इसके माता-पिता के छेद संबंध। क्योंकि द्वीप नहीं हो सकते हैं (नॉन-टचिंग बहुभुज), संबंध बहुस्तरीय नहीं हो सकता है। –