में स्क्रीन की जरूरत क्षेत्र
का उपयोग करते हुए एक ओर जहां अच्छा जवाब के एक नंबर यहाँ हैं पर विचार करें, और आप शायद @WearyAdventurer जैसे तत्वों को स्थानांतरित करने पर विचार करना चाहें, अन्य उत्तरों में से कोई भी वास्तव में मूल प्रश्न को संबोधित नहीं करता है:
मैं इस तरह से तत्व कैसे बना सकता हूं कि वे अन्य तत्वों के चारों ओर घूमते हैं?
उस प्रश्न का उत्तर सबसे अच्छा एक क्षेत्र नामक एक डेटा प्रकार का उपयोग कर हल किया जाता है। कि क्षेत्र के साथ इस क्षेत्र कम्बाइन और फिर घटाना एक और क्षेत्र, और फिर आयतों मैं प्रदान कर सकते हैं का एक सेट में परिणाम कर दें: क्षेत्र आप आसानी से 2-डी स्क्रीन स्थान का हिस्सा का उपयोग कर सेट कार्य करने की अनुमति। क्षेत्र अधिकांश विंडो सिस्टम (एमएस विंडोज, एक्स विंडोज, क्लासिक मैकोज़, दूसरों के बीच) में मौजूद हैं, और तत्वों को प्रतिपादित करने के लिए अधिकांश ब्राउज़रों के आंतरिक यांत्रिकी में भारी उपयोग किया जाता है, लेकिन वे जावास्क्रिप्ट में आश्चर्यजनक रूप से अनुपस्थित हैं।
या जब तक मैं इसे करने के लिए लाइब्रेरी नहीं लिखता तब तक वे अनुपस्थित थे।
क्षेत्रों का अंतर्निहित तर्क कुछ हद तक जटिल है। कई कोने के मामले हैं, और उत्पन्न होने वाले सभी परिदृश्यों को संभालना चुनौतीपूर्ण हो सकता है। मेरा कार्यान्वयन, Region2D, विचित्र आयत (1-आयामी क्षेत्रों) की विचित्र पंक्तियों (बैंड) का उपयोग करता है, जो वही है जो कई एक्स विंडोज सर्वर इसे करते हैं। अन्य कार्यान्वयन विशाल विभाजन विभाजन एल्गोरिदम का उपयोग करते हैं, और फिर भी अन्य (जैसे आधुनिक मैकोज़) क्षेत्रों के बजाय पथ या बहुभुज-प्रतिपादन तकनीकों का उपयोग करते हैं।
बेसिक आइडिया
जो कार्यान्वयन आप उपयोग के बावजूद, मूल विचार ही रहता है। अपने मामले में, आप एक बड़े आयत से शुरू करते हैं जो स्क्रीन को कवर करता है, और फिर बस दो (या तीन, या चार, या जो कुछ भी) आयताकारों को घटा देता है, और उसके बाद उस क्षेत्र से पूछें जो उन परिचालनों से आयताकार परिणाम देता है। जावास्क्रिप्ट में, मेरा Region2D लाइब्रेरी का उपयोग कर, यह इस तरह दिखता है:
var screenRegion = new Region([0, 0, viewportWidth, viewportHeight]);
var elemRegion1 = new Region(element1);
var elemRegion2 = new Region(element2);
var coverRegion = screenRegion.subtract(elemRegion1).subtract(elemRegion2);
var coverRectangles = coverRegion.getRects();
आयतों की जिसके परिणामस्वरूप सरणी है, तो आप सिर्फ साधारण वस्तुओं है कि x
/y
/width
/height
/top
/left
/right
/bottom
निर्देशांक हैं प्रत्येक से <div>
तत्व बनाएं, और आप कर चुके हैं।
// Generate regions for each of the objects.
var containerRegion = new Region2D($(".container")[0]);
var target1Region = new Region2D($(".target1")[0]);
var target2Region = new Region2D($(".target2")[0]);
// Subtract the targets from the container, and make an array of rectangles from it.
var coverRegion = containerRegion.subtract(target1Region).subtract(target2Region);
var coverRects = coverRegion.getRects();
// Create gray <div> elements for each rectangle.
for (var i = 0, l = coverRects.length; i < l; i++) {
var coverRect = coverRects[i];
var coverElement = $("<div class='cover'>");
coverElement.css({
left: (coverRect.x - 1) + "px", top: (coverRect.y - 1) + "px",
width: coverRect.width + "px", height: coverRect.height + "px"
});
coverElement.appendTo($(".container"));
}
.container, .target1, .target2, .cover { position: absolute; top: 0; left: 0; box-sizing: border-box; }
.target1, .target2 { border: 1px solid red; }
.container { width: 330px; height: 230px; border: 1px solid blue; }
.target1 { top: 40px; left: 40px; width: 100px; height: 80px; }
.target2 { top: 100px; left: 180px; width: 100px; height: 80px; }
.cover { background: rgba(0, 0, 0, 0.5); border: 1px solid #000; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://unpkg.com/[email protected]/plain/region2d.min.js"></script>
<div class="container">
<div class="target1"></div>
<div class="target2"></div>
</div>
:
कार्यान्वयन कार्य तो यहाँ वास्तविक समस्या, प्रस्तुत के रूप में मेरे Region2D लाइब्रेरी का उपयोग कर भारी एल्गोरिथम उठाने करने के लिए के लिए एक समाधान की एक काम कार्यान्वयन है
एक ऐसा फ़ंक्शन लिखें जो किसी अन्य से आयताकार को घटाए, सीआर बदले में छोटे आयतों की एक सूची खा रहे हैं। अब, उस फ़ंक्शन को बाउंडिंग बॉक्स और पहले हाइलाइट किए गए आयत पर लागू करें। फिर, उस कॉल को पिछले कॉल से लौटाए गए प्रत्येक आयत में लागू करें। धोये और दोहराएं। अधिक इष्टतम एल्गोरिदम –
हे के लिए https://en.wikipedia.org/wiki/Constructive_solid_geometry भी देखें! मैंने एक कामकाजी समाधान प्रस्तुत किया, क्या आप इसे देख सकते हैं? –
जो आप वास्तव में खोज रहे हैं उसे _Region_ डेटा प्रकार कहा जाता है। क्षेत्र 2-डी स्पेस के आयताकार-बाध्य हिस्सों पर यूनियन/चौराहे/घटाव करते हैं, और डिज़ाइन किए गए हैं ताकि आप उन्हें आयताकारों से आसानी से बना सकें और उनसे आयताकारों को रद्द कर सकें। मैंने पहले ऐसा करने के लिए सी में कोड लिखा है, और यह सामान्य मामले में जटिल है। अधिकांश जीयूआई में मूल रूप से एक क्षेत्र प्रकार (विंडोज़, एक्स, और मैक सभी शामिल हैं) शामिल हैं और अधिकांश प्रतिपादन के लिए इसका उपयोग करते हैं, लेकिन ऐसा लगता है कि एक जावास्क्रिप्ट कार्यान्वयन नहीं है जो मुझे मिल सकता है: हैरानी की बात है कि कोई एनपीएम पैकेज उपलब्ध नहीं है यह करने के लिए। –