एक एल्गोरिथ्म एक सरल (?) सरणी समस्या को हल करने

वोट
7

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

हम जानते है:

  1. कैनवास का आकार
  2. प्रत्येक आयत का आकार
  3. प्रत्येक आयत की स्थिति

तेजी से समाधान बेहतर है! मैं बहुत इस पर अटक कर रहा हूँ और वास्तव में, जहां शुरू करने के लिए पता नहीं है।

वैकल्पिक पाठ http://www.freeimagehosting.net/uploads/8a457f2925.gif

चियर्स

08/07/2010 को 13:23
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


6 जवाब

वोट
2

लाइन्स कि एक दूसरे के समानांतर नहीं हैं कुछ बिंदु पर एक दूसरे को काटना करने के लिए जा रहे हैं। प्रत्येक पंक्ति की ढलानों की गणना करें और फिर तय करते हैं लाइनों के साथ वे एक दूसरे को काटना नहीं होंगे।

उस के साथ प्रारंभ करें, और उसके बाद के लिए कि यह कैसे अनुकूलन करने के लिए देखते हैं। मुझे यकीन है कि कैसे अपने डेटा का प्रतिनिधित्व किया है नहीं कर रहा हूँ और मैं अपनी छवि नहीं देख सकता।

ढलानों का उपयोग करते हुए एक सरल समानता की जांच जो शायद आप डेटा छँटाई का लाभ ले सकते इसका मतलब है। वास्तव में, आप शायद सिर्फ अलग ढलानों का एक सेट बना सकते हैं। आप यह पता लगाने की डेटा ऐसी है कि एक ही आयत के दो ढलानों अन्तर्विभाजक के रूप में नहीं गिने जाते हैं प्रतिनिधित्व करने के लिए कैसे होगा।

संपादित करें: रुको .. कैसे दो आयतों जिनके किनारे अनंत को जाना एक दूसरे को काटना नहीं कर सकते? आयत मूल रूप से दो लाइनों है कि एक दूसरे के लंबवत कर रहे हैं। ऐसा नहीं है कि मतलब यह होना चाहिए अगर उन पंक्तियों के अनंत को बढ़ाया जाता है यह हमेशा दूसरे के साथ काटती है?

08/07/2010 को 13:35
का स्रोत उपयोगकर्ता

वोट
6

बस एक्स और वाई अक्ष से प्रत्येक के लिए अंतराल के सेट बनाने के। फिर प्रत्येक नया आयत के लिए, अगर वहाँ X या Y अक्ष में अन्तर्विभाजक अंतराल होते हैं देखते हैं। यहाँ देखें अंतराल सेट को लागू करने का एक तरीका के लिए।

अपने पहले उदाहरण में, अंतराल क्षैतिज अक्ष पर सेट हो जाएगा { [0-8], [0-8], [9-10] }, और ऊर्ध्वाधर पर:{ [0-3], [4-6], [0-4] }

यह केवल एक संक्षिप्त वर्णन (जैसे आम तौर पर एक, एक अंतराल सेट / पेड़ "जो अंतराल इस एक ओवरलैप" पूछना होगा बजाय "यह एक दूसरे को काटना", लेकिन साध्य कुछ भी नहीं नहीं) है, मैं यहाँ बहुत सी जानकारियां निकाला।

संपादित करें

इस संबंधित एमआईटी व्याख्यान घड़ी कृपया (यह थोड़ा लंबा है, लेकिन पूरी तरह से यह worths)। यहां तक कि अगर आप सरल समाधान खोजने के (एक संवर्धित लाल-काले पेड़ को लागू करने से), यह इन बातों के पीछे एक विचार पता करने के लिए अच्छा है।

08/07/2010 को 13:36
का स्रोत उपयोगकर्ता

वोट
1

जब तक आप भाषा आप समस्या को हल करने के लिए चुना जिक्र नहीं किया था के रूप में, मैं छद्म कोड के कुछ प्रकार का उपयोग करेगा

विचार यह है कि अगर सब कुछ ठीक है, तो एक धुरी के साथ आयत किनारों का एक क्रमबद्ध संग्रह गैर-अतिव्यापी अंतराल के अनुक्रम होना चाहिए।

  1. संख्या अपने सभी आयतों, उन्हें अलग-अलग आईडी बताए
  2. एक खाली द्विआधारी पेड़ संग्रह (बीटीसी) पैदा करते हैं। इस संग्रह की जानकारी के साथ एक पूर्णांक नोड डालने के लिए एक विधि होनी चाहिए बीटीसी :: डालने (कुंजी, मूल्य)
  3. सभी आयतों के लिए, कार्य करें:

foreach rect in rects do
    btc.insert(rect.top, rect.id)
    btc.insert(rect.bottom, rect.id)
  1. अब बीटीसी के माध्यम से पुनरावृति (यह आप एक क्रमबद्ध आदेश दे देंगे)

btc_item = btc.first()
do
    id = btc_item.id
    btc_item = btc.next()
    if(id != btc_item.id)
    then report_invalid_placement(id, btc_item.id)
    btc_item = btc.next()
while btc_item is valid

5,7,8 - दोहराने rect.left और rect.right निर्देशांक के लिए 2,3,4 कदम

08/07/2010 को 13:49
का स्रोत उपयोगकर्ता

वोट
1

मैं इस सवाल की तरह। यहाँ इस पर प्राप्त करने के लिए मेरी कोशिश है:

यदि संभव हो तो: प्रत्येक आयत से कोई बहुभुज बनाएं। अधिकतम लंबाई का एक लाइन है कि काटा जाना चाहिए के रूप में प्रत्येक बढ़त उपचार करें। मौसम की जांच करने के लिए एक कतरन एल्गोरिदम का उपयोग करें या नहीं एक लाइन दूसरे के साथ काटती है। : उदाहरण के इस एक के लिए लाइन कतरन

लेकिन ध्यान रखें: यदि आप एक चौराहे जो शीर्ष स्थान पर है, इसकी एक वैध एक मिल जाए।

08/07/2010 को 14:01
का स्रोत उपयोगकर्ता

वोट
1

यहाँ एक विचार है। इसके बजाय के साथ प्रत्येक आयत बनाने की (x, y, width, height), उनके साथ का दृष्टांत (x1, y1, x2, y2), या कम से कम यह इन मूल्यों की चौड़ाई और ऊंचाई को देखते हुए की व्याख्या की है।

इस तरह, आप की जाँच जो आयत एक समान हो सकता है xया yमूल्य और सुनिश्चित करें कि इसी आयत एक ही माध्यमिक महत्व है बनाते हैं।


उदाहरण:

आयतों आप दे दिया है निम्न मान है:

  • स्क्वायर 1: [0, 0, 8, 3]
  • स्क्वायर 3: [0, 4, 8, 6]
  • स्क्वायर 4: [9, 0, 10, 4]

सबसे पहले, हम तुलना Square 1करने के लिए Square 3(कोई टक्कर):

  • एक्स मानों की तुलना करें
    • [0, 8] को [0, 8] ये बिल्कुल वैसा ही है, इसलिए वहाँ कोई विदेशी है।
  • y मानों की तुलना करें
    • [0, 4] को [3, 6] इन नंबरों में से कोई भी समान हैं, इसलिए वे नहीं एक कारक रहे हैं

इसके बाद, हम तुलना Square 3करने के लिए Square 4(टक्कर):

  • एक्स मानों की तुलना करें
    • [0, 8] [9, 10] इन नंबरों में से कोई भी, इसी तरह के हैं तो वे एक कारक नहीं कर रहे हैं
  • y मानों की तुलना करें
    • [4, 6] को [0, 4] आयतों आम में 4 नंबर है, लेकिन 0! = 6, इसलिए, वहाँ एक टक्कर है

पता तक हम जानते हैं कि एक टक्कर, हो जाएगा तो विधि खत्म हो जाएगा, लेकिन मूल्यांकन कर सकते हैं Square 1और Square 4कुछ अतिरिक्त स्पष्टता के लिए।

  • एक्स मानों की तुलना करें
    • [0, 8] [9, 10] इन नंबरों में से कोई भी, इसी तरह के हैं तो वे एक कारक नहीं कर रहे हैं
  • y मानों की तुलना करें
    • [0, 3] को [0, 4] आयतों आम में संख्या 0 है, लेकिन 3! = 4, इसलिए, वहाँ एक टक्कर है

अगर आप किसी भी अतिरिक्त जानकारी की जरूरत है मुझे पता है :)

08/07/2010 को 14:08
का स्रोत उपयोगकर्ता

वोट
0

हे, लेने अतिव्यापी अंतराल चरम को जवाब, तो आप बस x और y अक्ष के साथ सभी विशिष्ट अंतराल निर्धारण करते हैं। प्रत्येक काटने लाइन के लिए, धुरी यह अंतराल के प्रारंभिक मूल्य के आधार पर कट जाएगा साथ एक ऊपरी बाध्य खोज करते हैं। आप एक अंतराल नहीं मिल रहा है या अंतराल रेखा को विभाजित नहीं करता है, तो यह एक वैध लाइन है।

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

09/07/2010 को 07:53
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more