2010-01-26 13 views
8

मैं एक आवेदन पर काम कर रहा हूं, मुझे उपयोगकर्ता द्वारा खींचे गए दो अतिव्यापी मनमानी आकारों को गठबंधन करने में सक्षम होना चाहिए। यह दो आकारों पर एक संघीय संचालन होगा। परिणामी आकार दो ओवरलैपिंग आकृतियों का सिल्हूट होगा।दो मनमानी आकारों की गणना संघ

आकारों को दक्षिणावर्त तरीके से बिंदुओं के अनुक्रम के रूप में संग्रहीत किया जाता है।

आदर्श रूप से मुझे एक एल्गोरिदम चाहिए जो अंक (x, y) के दो सरणी लेगा और परिणामी आकार की एक सरणी वापस लेगा।

मैं Boolean operations on polygons पर विकिपीडिया पढ़ रहा हूं जो Sweep line algorithm का उल्लेख करता है लेकिन मैं इस और मेरे लक्ष्य के बीच का लिंक नहीं बना सकता, हां, मैं गणितज्ञ नहीं हूं।

मैं एक्शनस्क्रिप्ट 3 में एप्लिकेशन विकसित कर रहा हूं लेकिन मैं सी #, जावा से परिचित हूं और मैं सी और सी ++ के माध्यम से अपना रास्ता चुन सकता हूं।

उत्तर

5

बूलियन परिचालनों को लागू करना सही नहीं है; सौभाग्य से, पुस्तकालय हैं जो पहले से ही इस कार्यक्षमता को लागू करते हैं।

आप किस भाषा का उपयोग कर रहे हैं? यदि यह सी ++ है, तो CGAL, कम्प्यूटेशनल ज्यामिति एल्गोरिदम लाइब्रेरी पर एक नज़र डालें।

+0

धन्यवाद, मैं AS3 में लागू करने रहा हूँ, लेकिन साथ सी # परिचित, जावा –

+0

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

+1

मुझे जीपीसी के जावा पोर्ट के इस (आंशिक) AS3 पोर्ट को http://code.google.com/p/gpcas/ मिला जो यूनियन ऑपरेशंस का समर्थन करता है। आपके सहयोग के लिए धन्यवाद। –

3

को देखते हुए दो अंक (ए और बी) की सूची
- [1] में प्रत्येक पंक्ति के लिए यह बी में एक रेखा को विभाजित करता है
-.- [2] अगर कोई (अधिक) लाइनों एक दूसरे को काटना, वहाँ है कोई ओवरलैप
-.- [3] (ए) में एक लाइन बी में एक पंक्ति काटती है तो
-.-.- [4] उत्पादन में चौराहे के बिंदु जोड़ने
-.-.- [5] ए इंटरसेक्ट बी
-.-।-.- [6] यदि नहीं, तो इसे आउटपुट में जोड़ें (यह बी के अंदर है) गोटो 5
-.-।-.- [7] यदि हां, तो जोड़ें उत्पादन और स्विच सूचियों के लिए छेड़छाड़ ए & बी गोटो 2

Intersection Point Of Two Lines भी देखें। मैं कोड क्षमा करने वाला नहीं हूँ :)

+0

+1: मेरे लिए एक सभ्य दृष्टिकोण की तरह लगता है –

+0

धन्यवाद जॉन ... यह भी कहना चाहिए कि "अनंत लूप से बचने के लिए तर्क जोड़ें" –

+3

सावधान रहें - यह समस्या आपके विचार के जितनी आसान नहीं है। विचार के लिए कुछ भोजन: ए में एक रेखा (या "धार") बी में एक से अधिक किनारे को छेड़छाड़ कर सकती है। दो मूल बहुभुज अलग हो सकते हैं; या ए पूरी तरह से बी के भीतर झूठ बोल सकता है; या बी पूरी तरह से ए के भीतर झूठ बोल सकता है (हालांकि ये तीन मामले समान दिखते हैं यदि आप केवल लाइनों के बीच छेड़छाड़ देख रहे हैं)। बहुभुजों को उत्तल होने की आवश्यकता नहीं होती है, और दो गैर-उत्तल बहुभुजों के संघ में छेद हो सकते हैं। और इसी तरह ... कम्प्यूटेशनल ज्यामिति उन सभी विशेष मामलों के लिए कुख्यात है जिन्हें आप पहले नहीं सोचते हैं। –

2

this algorithm आपके लिए काम करेगा?

+0

+1 मैं इसे पहले टीबीए जाने दूंगा! –

+1

यह एल्गोरिदम चौराहे की गणना करता है; ग्रेग बी संघ की तलाश में है। साथ ही, यह एल्गोरिदम केवल तब काम करता है जब बहुभुज के साथ-साथ उनके छेड़छाड़ दोनों उत्तल होते हैं; ग्रेग बी "मनमाने ढंग से आकार" के बारे में बात करता है, इसलिए मुझे लगता है कि वह गैर-उत्तल बहुभुज को भी संभालने में सक्षम होना चाहता है। –

+0

फेयर पॉइंट मार्टिन। मैंने माना था कि वे उत्तल आकार थे और यह सुझाव दे रहे थे कि दो चौराहे खोजने के लिए प्रारंभिक बिंदु के रूप में एल्गोरिदम। –

1

कैसे के बारे में:

  1. दो आकार के सबसे बाईं ओर बिंदु उठाओ। आकार ए को कॉल करें और इसे वर्तमान आकार बनाएं।
  2. वर्तमान बिंदु के साथ अगले बिंदु पर घड़ी की दिशा में घुमाएं और यह देखने के लिए जांचें कि एक या अधिक रेखाएं छेड़छाड़ की जाती हैं या नहीं।
    • यदि कोई लाइन घुमाती है, तो पहले चौराहे बिंदु ढूंढें और इसे अपने नए आकार में जोड़ें। दूसरे आकार के साथ घुमाने के लिए स्विच करें।
    • यदि कोई रेखा आकार ए में अगले बिंदु पर स्थानांतरित नहीं होती है और इसे अपने नए आकार में बिंदु के रूप में जोड़ती है। वर्तमान आकार के साथ घुमाव जारी रखें।
  3. चरण दोहराएँ 2.

मुझे लगता है कि अगर आप के साथ जो भी आकार वर्तमान है, चौराहों की तलाश में, कि तुम क्या चाहते करना चाहिए घुमावदार रहते हैं। मुझे लगता है कि अवतल आकार के साथ भी सामना करना चाहिए ...

मुझे यकीन है कि मूलभूत कार्य करने के बाद आप बहुत सारे अनुकूलन जोड़ सकते हैं।

1

वहाँ भी एक JavaScript API प्रतीत हो रहा है:

https://github.com/bjornharrtell/jsts/

जो जेटीएस मानक लागू करने के लिए लगता है और कई differnt कार्यान्वयन है:

http://tsusiatsoftware.net/jts/jts-links.html#ports

उन सभी को सक्षम होना चाहिए यूनियन आदि करने के लिए:

http://tsusiatsoftware.net/jts/JTSUser/contents.html

लेकिन csg.js सबसे प्रभावशाली परियोजना है IMO

https://github.com/evanw/csg.js

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