मैं एक पूर्णांक-आधारित क्वाडट्री संरचना लिख रहा हूं जो नोड से बनता है, और नीचे नहीं। ऐसा करने के लिए, मुझे अगले सबसे बड़े नोड को खोजने की ज़रूरत है जिसमें मेरे सभी तत्व शामिल हैं। यदि मेरे पास एक पूर्ववर्ती नोड परिभाषित है, तो उस नोड की सीमाओं के बाहर एक आइटम जोड़ने का प्रयास करें, इसे दोनों को शामिल करने के लिए इसे एक बड़ा नोड बनाने की आवश्यकता है। मेरे पास है (क्या मुझे लगता है कि चालाक है) एक बिंदु के आसपास सीमांकन बॉक्स को खोजने के लिए कोड:सबसे छोटा बाउंडिंग क्वाड्री नोड
public static Rectangle BoundingRectangle(Point p, int magnitude)
{
Rectangle bounds = new Rectangle()
{
X = (p.X & ~((1 << magnitude) - 1)),
Y = (p.Y & ~((1 << magnitude) - 1)),
Width = (1 << magnitude),
Height = (1 << magnitude)
};
return bounds;
}
[ध्यान दें कि बिंदु के आसपास बॉक्स (0,0) एक boxof आकार है (1,1) स्थान पर (0,0), स्थान पर (-.5, - 5), क्योंकि यह सभी पूर्णांक-आधारित है]
यह हमेशा (जो मैं बता सकता हूं,) एक बॉक्स लौटाता हूं जो एक नोड के रूप में एक quadtree में फिट। उदाहरण के लिए, new Rectangle(0,0,2,2)
स्वीकार्य होगा, जैसा कि new Rectangle(2,2,2,2)
होगा, लेकिन new Rectangle(1,1,2,2)
नहीं होगा।
मेरी समस्या यह है कि मैं यह समझ नहीं सकता कि एक बिंदु के बजाय आयताकार के लिए इसे कैसे पूरा किया जाए। एकमात्र समाधान जो मैं सोच सकता हूं, बढ़ती परिमाण के बक्से के माध्यम से लूप करना होगा, लेकिन मुझे यकीन है कि कुछ ओ (1) समाधान होना चाहिए जो मैं सोचने में सक्षम नहीं हूं।
उदाहरण:
Rectangle(X,Y,1,1) -> Rectangle(X,Y,1,1)
Rectangle(0,0,2,2) -> Rectangle(0,0,2,2)
Rectangle(1,1,2,2) -> Rectangle(0,0,4,4)
Rectangle(1,1,3,3) -> Rectangle(0,0,4,4)
Rectangle(0,5,2,2) -> Rectangle(0,4,4,4)
Rectangle(3,3,2,2) -> Rectangle(0,0,8,8)
कार्यान्वयन:
private static int BitScanReverse(int mask)
{
int index = 0;
while (mask > 1)
{
mask >>= 1;
index++;
}
return index;
}
public static Rectangle BoundingRectangle(Point p, int magnitude)
{
Rectangle bounds = new Rectangle()
{
X = (p.X & ~((1 << magnitude) - 1)),
Y = (p.Y & ~((1 << magnitude) - 1)),
Width = (1 << magnitude),
Height = (1 << magnitude)
};
return bounds;
}
public static Rectangle BoundingRectangle(Rectangle r, int magnitude)
{
int msb = BitScanReverse((r.X^(r.X + r.Width - 1)) | (r.Y^(r.Y + r.Height - 1)));
return BoundingRectangle(r.Location, Math.Max(msb + 1, magnitude));
}
बहुत बढ़िया सवाल। अगर घर का जवाब नहीं दिया जाता है तो मैं इस पर घर पर काम करूंगा। – mquander
धन्यवाद।यह मुझे थोड़ी देर के लिए परेशान कर रहा है। मुझे लगता है कि मैं SO में बहुत से स्मार्ट लोगों को रोना चाहता हूं। =] – dlras2
आयताकारों के साथ क्या करना चाहते हैं जो एकाधिक क्वाड्री नोड्स को ओवरलैप करते हैं? यानी (1,1,3,3) चौड़ाई/ऊंचाई के 4 नोड्स ओवरलैप करते हैं 2. यदि आप कहना चाहते हैं कि अंदर है (0,0,4,4) तो आपके पास पेड़ की जड़ में हमेशा छोटी चीजें होंगी (सबसे बड़ा नोड)। – phkahler