2011-11-27 16 views
11

मुझे सी # में एक कॉरपोरेट स्ट्रक्चर पेड़ (एक पारिवारिक पेड़ की तरह) खींचने की जरूरत है। सभी सहायक कोड वहाँ है। यह रंगीन, संवादात्मक, और फैंसी है। एकमात्र परेशानी एल्गोरिदम है जो वास्तव में तय करती है कि प्रत्येक नोड को कहां रखना है मुझे बहुत दुख है।एल्गोरिदम?

इस पल के लिए, बॉक्स आकार में 100x50 हैं, और मेरे पास StaffNode नामक एक वर्ग है जो एक विशेष एक्स, वाई समन्वय में एक कर्मचारी सदस्य का प्रतिनिधित्व करती है।

एल्गोरिदम को उचित x और y के साथ List<StaffNode> बनाने की आवश्यकता है।

यह अविश्वसनीय रूप से मुश्किल है।

असल में एल्गोरिदम कॉर्पोरेट संरचना के साथ पुनरावर्ती है, इसलिए बाएं-> दाएं, फिर शीर्ष-> पेड़ के साथ नीचे। स्पष्ट रूप से यह बुरा है अगर दो नोड एक दूसरे के शीर्ष पर हैं।

मैं कुछ एल्गोरिदम कि कुछ इस तरह का उत्पादन हो सकता है के बारे में सोच सकते हैं:

  * 
    o   O 
o o o o o  O 
o   O O O O O 
       O 

जबकि कुछ इस तरह बेहतर होगा, क्योंकि पेड़ बहुत बड़ी है और अंतरिक्ष बहुत सीमित है:

 * 
    o  O 
o o o o o O 
o  O O O O O 
      O 

क्या आप में से किसी को भी पहले इस तरह का पेड़ खींचना था? यदि आपको लगता है कि मुझे यकीन है कि आप मुझे मिली कई बाधाओं में आ गए हैं। कोई सुझाव? अब तक मैंने पूरे दिन बिताया है।

+0

तुम क्या करने कोशिश कर रहे हैं नहीं मिल सकता है? यह माइक्रोसॉफ्ट visio या कुछ में नहीं किया जाना चाहिए ?? – DrStrangeLove

+0

कुछ टेट्रिस सॉल्वर लें ... – Dialecticus

+0

@DrStrangeLove नहीं, मैं एक इंटरैक्टिव विज़ुअलाइज़ेशन लिख रहा हूं। – user1002358

उत्तर

12

पेड़ खींचने के लिए कई अच्छे एल्गोरिदम हैं, जिनमें से प्रत्येक पेड़ों की कुछ अलग संपत्ति दिखाता है। यदि आप पदानुक्रम दिखाना चाहते हैं, तो this code for WPF that draws hierarchies है। these lecture slides पर ऐसे कई एल्गोरिदम का विवरण देने पर विचार करते हुए, ग्राफ और पेड़ों को आकर्षित करने के बारे में अधिक सामान्य चर्चा के लिए। इसी तरह की सामग्री को कवर करने वाले these excellent slides भी हैं।

आशा है कि इससे मदद मिलती है!

+2

यह बिल्कुल सही है! मुझे जिस चीज की जरूरत थी।यह रीनिंगोल्ड-टिलफोर्ड एल्गोरिदम का उपयोग करता है। – user1002358

+1

@ user1002358 उस टिप्पणी के लिए धन्यवाद। मुझे यहां सूचीबद्ध उत्तर से एल्गोरिदम को समझने में परेशानी थी, हालांकि "रींगोल्ड-टिलफोर्ड एल्गोरिदम" गूगलिंग ने मुझे [इस सवाल] (http://stackoverflow.com/q/13128750/302677) का नेतृत्व किया, जिसे मैंने और अधिक उपयोगी पाया। मैंने एल्गोरिदम को कोड करने के लिए चरणों का भी सारांश दिया [यहां] (http://rachel53461.wordpress.com/2014/04/20/algorithm-for-drawing-trees/) यदि कोई और एक साधारण स्पष्टीकरण की तलाश में है – Rachel

1

आप एक पुनरावृत्ति दृष्टिकोण का उपयोग कर सकते हैं। ऊपर इस्तेमाल किए गए पहले उदाहरण की तरह कुछ का उपयोग कर पेड़ को बाहर रखें। फिर नोड्स या सबट्री को एक-दूसरे के करीब ले जाएं, जबकि सुनिश्चित करें कि कोई बाधाओं का उल्लंघन नहीं किया जाता है (उदाहरण: नोड्स ओवरलैप नहीं हो सकते हैं, बाल नोड्स पैरेंट नोड्स के नीचे होना चाहिए)।

सकारात्मक:

  • सरल एल्गोरिथ्म।
  • एक अच्छा पर्याप्त समाधान प्राप्त करता है।
  • लगातार बदलते पेड़ पर लागू किया जा सकता है।
  • ठंडा दिखने के लिए बनाया जा सकता है।

विपक्ष:

  • अच्छे लग रहे बनाने के लिए कई पुनरावृत्तियों पड़ सकता है।
  • इष्टतम समाधान (हो जाता है एक स्थानीय अधिकतम में पकड़ा)
+0

आप एक ही पुनरावृत्ति में ऐसा कुछ कर सकते हैं। –

+0

सहमत है, लेकिन कभी-कभी एक पुनरावृत्ति अनुकूलन दृष्टिकोण उपयोगी हो सकता है यदि एक एकल पास एल्गोरिदम बड़ी संख्या में नोड्स के लिए कम्प्यूटेशनल रूप से अक्षम है। – geofftnz