2012-01-24 16 views
7

मैं D3.js पुस्तकालय का उपयोग कर रहा है और बल निर्देशित ग्राफ डेमो को देखकर:D3.js - क्या बल-निर्देशित ग्राफ और नोड-लिंक पेड़ के बीच एनिमेट करना संभव है?

http://mbostock.github.com/d3/ex/force.html

enter image description here

मैं भी नोड लिंक पेड़ से देख रहा हूँ:

http://mbostock.github.com/d3/ex/tree.html

enter image description here

मैं करना चाहते हैं क्या है:

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

क्या किसी ने पहले ऐसा कुछ किया है, या लेने के लिए सबसे अच्छा तरीका है? मैं D3.js के लिए नया हूं और मुझे कोई जानकारी नहीं है कि यह ढांचे द्वारा समर्थित है या नहीं।

+0

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

+0

मुझे यकीन नहीं है कि मैं यहां इरादे को समझता हूं। जब आप एक पदानुक्रमित संरचना से निपट नहीं रहे हैं, तो "इसके कनेक्शन इसके चारों ओर व्यवस्थित होते हैं, और उनके आसपास उनके कनेक्शन" होते हैं, यह एक बल-निर्देशित लेआउट करता है। क्लिक करने के बाद सभी नोड्स और लिंक अभी भी दिखाई दे सकते हैं? – nrabinowitz

+0

संभवतः, आप बीच में निश्चित स्थिति के साथ एक अदृश्य नोड हो सकता है; और जब भी उपयोगकर्ता नोड का चयन करता है - आप इसके बीच (अदृश्य मध्य) और चयन के बीच एक लिंक जोड़ते हैं (बल के साथ बहुत अधिक बल के साथ)।(भी, जब भी उपयोगकर्ता नया नोड चुनता है - पिछले लिंक को हटाने की जरूरत है) – alm

उत्तर

7

आपको क्या करना है बल को रोकना और मौजूदा लेआउट को दूसरे लेआउट से प्राप्त एक्स-वाई में बदलने के लिए लागू करना है। तो अपने समारोह इस प्रकार दिखाई देगा:

force.stop(); 
d3.selectAll("g.nodes").transtion().duration(500) 
    .attr("translate","transform("+newLayoutX+","+newLayoutY+")" 

फिर अपने नोड्स सरणी के माध्यम से पुनरावृति और नए X और Y प्रतिबिंबित करने के लिए x, y, px, py मूल्यों को निर्धारित।

https://gist.github.com/emeeks/4588962

यह नहीं करता है: इस बल लेआउट के लिए वर्तमान x और y स्थिति पता करने के लिए जब आप force.start()

चलाने आप इस उदाहरण में plotLayout() समारोह पर एक नज़र ले जा सकते हैं अपने नोड्स सेट हो जाएगा हालांकि, दूसरे d3.layout पर भरोसा करें। जिस समस्या में आप भाग लेंगे वह यह है कि आपको पेड़ लेआउट के लिए एक पदानुक्रमित डेटासेट की आवश्यकता होती है, जिसके लिए आपको पदानुक्रम लेआउट में अपेक्षित के रूप में अपने नोड्स को बदलने और डेटा को node.children की सरणी में बदलने की आवश्यकता होती है। जिस तरह से मैं इसे करता हूं वह डेटासेट को डुप्लिकेट करना और मैन्युअल रूप से इसे फ़्लैट करना है, लेकिन एक और अधिक सुरुचिपूर्ण समाधान हो सकता है जिसे मैं अनजान हूं।