2013-05-18 9 views
6

मैं एक ऐसा फ़ंक्शन लिखने की कोशिश कर रहा हूं जो दो ओवरलैपिंग आयत लेता है और आयताकार ए के क्षेत्र को कवर करने वाले आयतों की एक सरणी देता है, लेकिन आयताकार बी के क्षेत्र को बाहर कर देता है। मुझे मुश्किल समय लग रहा है यह एल्गोरिदम क्या दिखता है जैसे संभावित टकराव की संख्या बहुत बड़ी है और इसके लिए जिम्मेदार है।जावास्क्रिप्ट में एक आयताकार

tl; डॉ मैं एक आयताकार का उपयोग करके एक आयताकार क्लिप करने की कोशिश कर रहा हूं जिसके परिणामस्वरूप शेष क्षेत्र को कवर आयताकारों का संग्रह होता है।

|-------------|        |-------------| 
|A   |        |R1   | 
|  |-------|----|       |-----|-------| 
|  |B  | |   To    |R2 | 
|  |  | |   ====>   |  | 
|  |  | |       |  | 
|-----|-------| |       |-----| 
     |   | 
     |------------| 

POSSIBLE OVERLAP PATTERNS 

|-----|   |-----|  |-----|  |-----| 
| |---|-|  |-|---| |  | |-| |  | |-| | 
|-|---| |  | |---|-|  |-|-|-|  | |-| | 
    |-----|  |-----|   |-|   |-----| 

    |-|   |-----|   |-----| 
|-|-|-|  | |---|-|  |-|---| | 
| |-| |  | |---|-|  |-|---| | 
|-----|  |-----|   |-----| 

ध्यान दें कि संभव ओवरलैप पैटर्न डबल है कि दिखाया गया है क्योंकि आयत ए और बी के ऊपर ओवरलैप पैटर्न में से किसी में ईथर आयत हो सकता है।

+0

यह इस के लिए शिखर अंक उपयोग करने के लिए संभव हो सकता है। आप ए – Nikki

+0

से बी में कशेरुक बिंदुओं के बीच की दूरी के आधार पर नए आयताकार निर्देशांक की गणना कर सकते हैं। एक और समस्या है, परिणाम कभी-कभी एक आयताकार से अधिक होता है। एक और नौ के बीच मुझे लगता है। –

+0

निश्चित रूप से एक मानक एल्गोरिदम है? वैसे भी, एक विचार। 4 एक्स निर्देशांक और 4 वाई निर्देशांक हैं, आपके नए क्षेत्र हमेशा इनके संयोजन होंगे। 4 एक्स कॉर्ड कैनवास को 5 लंबवत बैंडों में विभाजित करते हैं, वाई कोयर्स 5 क्षैतिज बैंड में विभाजित होते हैं, यदि सबसे बुरी स्थिति सबसे खराब होती है तो ए, बी, न तो या दोनों से संबंधित 25 गैर-ओवरलैपिंग आयताकार होते हैं। आप केवल ए से संबंधित हैं और सभी को छोड़ दें। – boisvert

उत्तर

3

वहाँ किसी विशेष सेटअप के लिए एक अनूठा समाधान नहीं होगा, लेकिन आप आसानी से इस एल्गोरिथ्म के साथ समाधानों में से एक पा सकते हैं:

  1. एक के भीतर एक आयत का पता लगाएं आयत बी हैं के शीर्ष से ऊपर है कि ए बी से अधिक है (यानी पीएक्स में कम मूल्य है), ऐसा आयताकार है। इस आयताकार द्वारा परिभाषित किया गया है: (ए के बाएं किनारे, ए के शीर्ष किनारे) (ए के दाएं किनारे, बी के शीर्ष किनारे)।
  2. यदि बी का बायां किनारा ए के बाएं किनारे के दाईं ओर है, तो अगला आयताकार है: (ए के बाएं किनारे, न्यूनतम (ए के शीर्ष किनारे, बी के शीर्ष किनारे)) (बी के बाएं किनारे) , अधिकतम (ए के निचले किनारे बी की, निचले किनारे))
  3. बी के दाएं किनारे बी के दाएं किनारे के बाईं, ऊपर
  4. के समान करने के लिए है ... और बी
  5. नीचे संभव आयत

कुल मिलाकर, आप 0 से 4 आयत प्राप्त करेंगे।

कुछ हद तक एक असामान्य साथ स्यूडोकोड, लेकिन इस उद्देश्य स्पष्ट, आयत की परिभाषा के लिए:

function getClipped(A, B) { 
    var rectangles = []; 
    if (A.top < B.top) { 
     rectangles.push({ left: A.left, top: A.top, right: A.right, bottom: B.top }); 
    } 
    if (A.left < B.left) { 
     rectangles.push({ left: A.left, top: max(A.top, B.top), right: B.left, bottom: min(A.bottom, B.bottom) }); 
    } 
    if (A.right > B.right) { 
     rectangles.push({ left: B.right, top: max(A.top, B.top), right: A.right, bottom: min(A.bottom, B.bottom) }); 
    } 
    if (A.bottom > B.bottom) { 
     rectangles.push({ left: A.left, top: B.bottom, right: A.right, bottom. A.bottom }); 
    } 

    return rectangles; 
} 

var rectA = { left: nn, top: nn, right: nn, bottom: nn}; 
var rectB = { left: nn, top: nn, right: nn, bottom: nn}; 

var clipped = getClipped(rectA, rectB) ; 
+0

कुछ मामलों को कवर नहीं किया गया है - उदा। यदि बी ए से बड़ा है और दो में कटौती करता है ... – boisvert

+1

@boisvert, यह कवर किया गया है। आपके सभी नौ क्षेत्र पूरी तरह से ढके हुए हैं। गणितीय रूप से आपके स्पष्टीकरण की तरह सुरुचिपूर्ण नहीं है, लेकिन एक बहुत ही सरल एल्गोरिदम के साथ। –

+0

ओह ... मैंने आपके न्यूनतम और अधिकतम उपयोग पर ध्यान नहीं दिया। आप सही हैं, यह बहुत अच्छी तरह से काम करता है। इसके बारे में कुछ भी सुरुचिपूर्ण मत देखो। – boisvert

3

दो आयताकार स्क्रीन को 9 जोनों में विभाजित करते हैं (14 नहीं)। आपके विन्यास की फिर से सोचें:

y1 -> |-------------|  
     |A   |   
y2 -> |  |-------|----| 
     |  |B  | | 
     |  |  | | 
     |  |  | | 
y3 -> |-----|-------| | 
      |   | 
y4 ->  |------------| 
    ^ ^ ^^
     x1 x2  x3 x4 

x निर्देशांक 5 ऊर्ध्वाधर बैंड को परिभाषित, लेकिन इतना है कि आप केवल x1 से x4 करने के लिए 3 बैंड पर काम करने की जरूरत पहले (बाएं) और पिछले (दाएं), अरुचिकर कर रहे हैं। वाई निर्देशांक के लिए वही: y1 से y4 तक तीन क्षैतिज बैंड।

तो यह 9 आयताकार क्षेत्र है जो ए, बी, कोई नहीं या दोनों हैं। आपका उदाहरण इस तरह बांटा गया है:

|-----|-------|----|  
    |A |A  |none| 
    |-----|-------|----| 
    |A |Both |B | 
    |  |  | | 
    |  |  | | 
    |-----|-------|----| 
    |none |B  |B | 
    |-----|-------|----| 

तो ए और बी के निर्देशांक की तुलना, आप जो 9 क्षेत्रों में से केवल ए वे क्षेत्रों रखने के लिए कर रहे हैं के हैं मिल जाएगा।

+0

धन्यवाद, यह बहुत उपयोगी है। चीयर्स! –

+0

लेकिन dan.p के उत्तर को देखें जो आपको एक संपूर्ण समाधान देता है ... – boisvert

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