2010-03-17 8 views
18

जो मैं विशेष रूप से पकड़ रहा हूं वह सिर्फ ग्राफ का लेआउट नहीं है, लेकिन जब कोई उपयोगकर्ता ग्राफ़ नोड का चयन करता है और उसे स्क्रीन क्षेत्र के चारों ओर खींचने के लिए शुरू होता है, तो यह दर्शाता है कि यह कैसा दिखाई देगा यदि उपयोगकर्ता को नोड जारी करना था। मुझे लगता है कि यह लेआउट एल्गोरिदम का हिस्सा है?ग्राफ़ नोड्स के बीच रेखाओं को रेखांकित करने के लिए कुछ अच्छे एल्गोरिदम क्या हैं?

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

alt text http://img260.imageshack.us/img260/5458/nodesr.png

उत्तर

8

अपने चित्र पागल नहीं हैं, तो पूरा आप इस के लिए एक अतिरिक्त फैंसी एल्गोरिथ्म आवश्यकता नहीं होनी चाहिए, लेकिन सिर्फ कुछ सामान्य ज्ञान का उपयोग करें।

  1. कवर सतह एक आयताकार ग्रिड के साथ और फिर कोण की एक न्यूनतम संख्या के साथ ग्रिड पंक्तियों के साथ सीधे लाइनों के साथ बॉक्स से कनेक्ट करने का रास्ता मिल: यदि बॉक्स एक ही ग्रिड लाइन पर नहीं हैं और आप डॉन ' टी देखभाल जहां आप कनेक्ट करते हैं, आपको बीच में कोई अन्य नोड नहीं होने पर आपको एक कोण की आवश्यकता होती है। यदि उदाहरण हैं नोड्स जिस तरह से आपको कम से कम एक और कोण की आवश्यकता होती है।

  2. फुलर आरेखों के लिए दूसरे चरण के रूप में कोड जोड़ें जो न केवल न्यूनतम किनारों के लिए अनुकूलित करता है बल्कि लाइनों की न्यूनतम लंबाई के लिए भी अनुकूलित करता है। यदि आपके आरेख पूर्ण पागल नहीं हैं तो यह आवेदन प्रतिक्रिया के संदर्भ में शायद ही ध्यान देने योग्य होना चाहिए।

  3. अतिरिक्त आंखों के कैंडी के लिए दोनों पैरों की लंबाई को ध्यान में रखते हुए और सतह पर अन्य वस्तुओं के साथ छेड़छाड़ की जांच करने वाले कोणों के लिए। मैं सर्कल के 90 डिग्री-टुकड़ों का उपयोग करता हूं और सर्कल के त्रिज्या को समायोजित करता हूं (स्पष्ट रूप से ऊपर नहीं किया गया था) - लंबे पैरों के लिए त्रिज्या बड़ा होना चाहिए। हो सकता है कि आप जिस टूलकिट का उपयोग कर रहे हैं वह आपकी मदद कर सकता है।

+1

एक पूर्ण ग्रिड शायद, आवश्यक नहीं है कनेक्ट अंक की एक hanan ग्रिड से और बिट्स पर्याप्त होना चाहिए मुझे लगता है कि –

+0

धन्यवाद, मैं पहिया बदलने की नहीं देख रहा हूँ से बचने के लिए, हालांकि मुझे यकीन है कि हम कर सकते थे सभी बारीक ट्यून किए गए एल्गोरिदम के करीब अनुमान के साथ आते हैं। मैं सोच रहा हूं कि क्या वहां कुछ भी है जो पहले से ही आपके लिए कुछ हद तक करता है? – ApplePieIsGood

+1

उत्तर स्वयं से निपटने के लिए कुछ गैर-मामूली मुद्दों को प्रस्तुत करता है (यह एक प्रक्रिया बताता है लेकिन "कैसे करें" भागों की कमी है। क्या इसे कवर करने के लिए "शास्त्रीय" एल्गोरिदम हैं? – gpilotino

0

क्या आप Graphviz से परिचित हैं? मुझे यकीन नहीं है कि लेआउट एल्गोरिदम कैसे "गतिशील" और पुन: प्रयोज्य हैं, लेकिन यह एक अच्छा प्रारंभिक बिंदु हो सकता है।

0

@ होंक उत्तर का विस्तार करने के लिए: चिकनी वक्र के लिए आप केवल 3 या 4 पिवट पॉइंट ले सकते हैं और उन्हें वर्ग/क्यूबिक बेजियर लाइनों का उपयोग करके कनेक्ट कर सकते हैं।

इस

वहाँ वास्तव में कुछ भी सीधे कार्तीय निर्देशांक पर ड्राइंग परे नाटकीय के लिए एक की जरूरत नहीं है एक example in javascript from raphael plotting library

0

है। सरल हेरिस्टिक का उपयोग पथ को संभालने के लिए किया जा सकता है और अधिकांश समय के अधिकतम न्यूनतम कोणों को हिट करने की संभावना है, लेकिन संभवतः सबसे कम लंबाई पथ भी अधिक बार होता है। यह सब आपको गतिशील रूप से किया जा सकता है जैसा कि आपको चाहिए, लेकिन स्क्रीन को तोड़ने के बिना ग्राफिक्स की सटीकता को बनाए रखने के दौरान इसे अधिक विचलित रूप से (पिक्सल को सबसे अलग स्तर रखना चाहिए) और जटिल एल्गोरिदम की आवश्यकता के बिना।

ओवरले के लिए, बस अपनी पिक्सेल को अपनी लाइनों के रंग में सेट करें और अल्फा चैनल बिट्स को पारदर्शी या अपारदर्शी में संशोधित करें, इस पर निर्भर करता है कि पिक्सेल लाइन का हिस्सा है या नहीं। यह पता लगाने के लिए कि लाइन के भाग वाले किन बिट्स की थोड़ी-थोड़ी ज्यामिति की आवश्यकता होती है, लेकिन जब आपके पास सबकुछ होता है तो यह केक का एक टुकड़ा होता है।

अल्फा चैनल पर अपनी रेखा को आकर्षित करने के तरीके को जानने के लिए, आपको अपनी लाइनों की शैली को समझने की आवश्यकता होगी। आप जो कुछ करेंगे वह शैली पर निर्भर करता है। एक आम शैली सीधी रेखाओं का उपयोग कर रही है जो क्षैतिज रूप से हैं और सही कोणों के लिए चौथाई चक्रों के साथ veritcally गठबंधन हैं।

"टालना" एल्गोरिदम के लिए, इन्हें लागू करने में बहुत मुश्किल नहीं है जब आप अपने नोड्स का प्रतिनिधित्व करने वाले "बक्से" से बचना चाहते हैं ... अपनी सभी लाइनों को अस्वीकार करने के लिए एक कार्य और थोड़ा कुछ है यहां तक ​​कि Visio भी नियोजित नहीं है। बक्से/नोड्स से बचने के लिए, बॉक्स के किनारों के बीच मध्यबिंदु का उपयोग करना (जैसे कि भौगोलिक और भौगोलिक 3 के बीच लंबवत किनारों) समरूपता के लिए करना अच्छा होता है और फिर गैर-कनेक्टिंग लाइनों को रखने के लिए एक सरल पूर्वनिर्धारित दूरी चुनना (जो रेखाएं हैं जो उस विशेष बॉक्स से कनेक्ट नहीं होते हैं) बक्से से दूर भी अच्छी तरह से काम करता है। इसके लिए एक सामान्यीकृत एल्गोरिदम करना सरल है, लेकिन यहां वर्णन करने के लिए थोड़ा वर्बोज़ है, लेकिन यह अनिवार्य रूप से सामान्यीकृत चेक और स्विच का क्षैतिज और ऊर्ध्वाधर रूप से लाइनों और तिमाही मोड़ों पर संरेखित स्विच का एक सेट है। यदि आप इसे कैसे करें इस बारे में अधिक जानकारी चाहते हैं, तो बस इस उत्तर पर एक टिप्पणी पोस्ट करें।

यदि आप कुछ ऐसा ढूंढ रहे हैं जो आपके लिए पहले से ही बनाया गया है, तो कनेक्शन का प्रकार और पुनर्व्यवस्थित जो आप चाहते हैं वास्तव में आवेदन पर निर्भर करता है और बहुत से लोग ऐसे मांग नहीं करते हैं जो कम मांग में हैं या मांग के विशिष्ट हैं । स्पष्ट रूप से इस प्रकार का सॉफ़्टवेयर वहां से बाहर है क्योंकि Visio और अन्य इसे नियोजित करते हैं, लेकिन यह ओपन सोर्स या कुछ अन्य मुफ्त पुस्तकालयों के हिस्से के रूप में उपलब्ध है या नहीं, मैं निश्चित नहीं हूं।

1 के लिए
संबंधित मुद्दे

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