2012-01-27 6 views
8

मेरे पास एक समाधान है जो मानचित्र पर बिंदुओं के समूह का प्रतिनिधित्व करने के लिए स्थानिक डेटा का उपयोग करता है। मुझे उन निर्देशांकों का उपयोग करने की आवश्यकता है जो क्लस्टर के विस्तार का प्रतिनिधित्व करते हैं ताकि न्यूनतम बाउंडिंग आयत को ढूंढ सकें जिसमें अंक के समूह शामिल हो सकते हैं।कोऑर्डिनेट्स द्वारा 2 डी आकार के न्यूनतम बाउंडिंग आयत की गणना

क्या कोई साधारण एल्गोरिदम इस गणना करने में सक्षम है या यह प्राप्त करने के लिए सी # में कार्यक्षमता में कोई भी निर्मित है। मुझे NetTopologySuite से अवगत है, लेकिन मुझे यकीन नहीं है कि मैं एक ही लक्ष्य को प्राप्त करने के लिए इसका उपयोग कैसे कर सकता/सकती हूं। मेरे पास निर्देशांक की एक सूची है इसलिए मुझे इसमें स्ट्रिंग्स की इस सूची को पास करने और एमबीआर आउट प्राप्त करने की आवश्यकता होगी।

+0

दुर्भाग्य से मुझे नहीं पता कि इस समस्या से कहां से शुरुआत करें। मैं उस चरण में हूं जहां मेरे पास टाइप स्ट्रिंग की सूची में मेरे निर्देशांक हैं और मैं यहां से कैसे आगे बढ़ना चाहता हूं, इस बारे में अनिश्चित हूं। – CSharpened

+1

@Well आपके पास दो प्रकार हैं: अक्ष-संरेखित बाध्यकारी बॉक्स; जो केवल न्यूनतम x/y और अधिकतम x/y ढूंढकर पाया जाता है। या आपके पास मनमाने ढंग से उन्मुख बाध्यकारी बॉक्स है जो अधिक जटिल है (http://en.wikipedia.org/wiki/Minimum_bounding_box_algorithms)। यदि आपको पृथ्वी के वक्रता को ध्यान में रखना आवश्यक है (जो मुझे आशा है कि आप नहीं करते हैं), हालांकि तकनीकी रूप से आप अभी भी एक बॉक्स बना रहे हैं, लेकिन यह वास्तव में इसके बजाय एक क्षेत्र की सतह का एक भाग है (आपको जो चाहिए वह शायद बहुत अधिक है) –

+0

मैं देखता हूं। मुझे एक ऐसा फ़ंक्शन चाहिए जो बॉक्स के लिए 4 निर्देशांक प्रदान करेगा। तो दो एक्स मान और दो वाई मान। क्या आप सुझाव देंगे कि ऐसा करने का सबसे अच्छा तरीका मेरे निर्देशांक को विभाजित करना होगा और फिर सबसे कम एक्स मान और न्यूनतम वाई मान खोजने के लिए उन सभी की तुलना करें? अगर मैं ऐसा करना चाहता था तो मुझे लगता है कि मुझे केवल एक मिनीएक्स वैल्यू और अधिकतम मूल्य मिलेगा?उन दो आंकड़ों से दूसरे एक्स और वाई मानों की गणना करना संभव है? क्षमा करें अगर मैं थोड़ा खो गया लगता है। स्थानिक मेरा क्षेत्र बिल्कुल नहीं है। – CSharpened

उत्तर

10

सबसे आसान समाधान, और मुझे लगता है कि जिसकी आपको सबसे अधिक संभावना है, वह अक्ष-संरेखित बाध्यकारी बॉक्स की गणना करना है, जो कि न्यूनतम/अधिकतम x & y मानों को ढूंढने का मामला है, फिर उनसे एक बॉक्स का निर्माण।

मैं तुम्हें, उस के लिए छद्म कोड देंगे, यह देखते हुए कि आप प्रकार है कि अपने ज्यामिति में ...

type point { float x; float y; } 
type box { point topleft; point topright; point bottomleft; point 

function bounding_box(points) 
{ 
    xmin = min(points.x) 
    xmax = max(points.x) 
    ymin = min(points.y) 
    ymax = max(points.y) 

    return new box{ 
    topleft = { x = xmin, y = ymax }, 
    topright = { x = xmax, y = ymax }, 
    bottomleft = { x = xmin, y = ymin }, 
    bottomright = { x = xmax, y = ymin } 
    }; 
} 

व्यक्त किया जाता है तो इन दी पोस्ट नहीं किया है:

point[] points = [[x = -2, y = 0], [x = 1, y = 2], [x = 1, y = 1], [x = -1, y = -2]]; 
box bounds = bounding_box(points); 

निम्न में से सब सच हो जाएगा:

bounds.topleft == [x = -2, y = 2]; 
bounds.topright == [x = 1, y = 2]; 
bounds.bottomleft == [x = -2, y = -2]; 
bounds.bottomright == [x = -1, y = -2]; 
बेशक

, अगर समन्वय प्रणाली टी में सबसे कम निर्देशांक सेशन (उदा। एक ठेठ प्रदर्शन की तरह) - तो आपको गणना को उलटा करना होगा; या ऑब्जेक्ट-स्पेस में परिणाम की गणना करें और फिर बाद में लॉजिकल स्पेस में अनुवाद करें।

नोटिस मैं भविष्य में एक मनमाने ढंग से गठबंधन बॉक्स में अपडेट करने के लिए भविष्य में निर्णय लेने के मामले में सभी चार कोनों को व्यक्त करने वाले बॉक्स के लिए एक प्रकार के लिए गया हूं (हालांकि उसी टोकन से आप केवल एक बिंदु का उपयोग कर सकते हैं उस के लिए + 2 वैक्टर)।

+0

यह ठीक दिखता है कि मैं क्या कर रहा हूं। धन्यवाद। – CSharpened

6

एक संभव है, हालांकि सरल, जिस तरह से यह करने के लिए इस तरह हो सकता है:

public Rectangle Test(List<Point> points) 
{ 
    // Add checks here, if necessary, to make sure that points is not null, 
    // and that it contains at least one (or perhaps two?) elements 

    var minX = points.Min(p => p.X); 
    var minY = points.Min(p => p.Y); 
    var maxX = points.Max(p => p.X); 
    var maxY = points.Max(p => p.Y); 

    return new Rectangle(new Point(minX, minY), new Size(maxX-minX, maxY-minY)); 
} 

बेशक यह करता है कि आप एक आयत है कि अनुलंब और क्षैतिज संरेखित है के लिए देख रहे मान। तो यदि आप सबसे छोटे संभव आयताकार की तलाश में हैं, इससे कोई फर्क नहीं पड़ता कि यह कैसे घुमाया जाता है, यह आपके लिए नहीं है।

0

कोशिश जी # http://www.ceometric.com/products/g.html

पर यह कम से कम क्षेत्र और न्यूनतम परिधि संलग्न आयतों और भी कम से कम संलग्न हलकों है।

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