Algorithm for drawing a trees where nodes can attach to others with a depth greater than itself + 1











up vote
0
down vote

favorite
1












This is not a duplicate of the Reingold-tolford, since that's just for drawing normal tree like structures. specifically I am looking for an algorithm where a node can link to a node thats not only on the level below it.



I'm building a tree like structure within a canvas control in WPF.
Currently I have a structure built like this(ignore the collisions of boxes I have that fixed) that generates automatically from my data.



While this structure isn't to bad, it'd be nice to work towards something with less collisions.



Therefore are there any algorithms I can follow and work with to draw a graph like this with less collisions.



I'm calculating all positions of the boxes like this currently,



flattenedList is a List < List< Object>> hence the i, j itteration. and that object has a treePosition Property with an X and Y double.



var canvasWidthFinder = new List<int>();
//Loop through all componentversions, use indexes to calc their positions.
for (int i = 0; i < flattenedList.Count; i++)
{
canvasWidthFinder.Add(flattenedList[i].Count);
for (int j = 0; j < flattenedList[i].Count; j++)
{
flattenedList[i][j].TreePosition.YPosition = (i * 150) + 25;
flattenedList[i][j].TreePosition.XPosition = ((Canvas.ActualWidth / (flattenedList[i].Count + 1)) * (j + 1)) - (125 / 2);
}
}
Canvas.Width = (canvasWidthFinder.Max() * 160);


These values are then used to draw borders with text inside and lines drawn between the connecting ones.



Tree like graph structure.










share|improve this question
























  • Possible duplicate of What are the step to the Reingold-Tilford algorithm and how might I program it?
    – Peregrine
    Nov 14 at 11:58















up vote
0
down vote

favorite
1












This is not a duplicate of the Reingold-tolford, since that's just for drawing normal tree like structures. specifically I am looking for an algorithm where a node can link to a node thats not only on the level below it.



I'm building a tree like structure within a canvas control in WPF.
Currently I have a structure built like this(ignore the collisions of boxes I have that fixed) that generates automatically from my data.



While this structure isn't to bad, it'd be nice to work towards something with less collisions.



Therefore are there any algorithms I can follow and work with to draw a graph like this with less collisions.



I'm calculating all positions of the boxes like this currently,



flattenedList is a List < List< Object>> hence the i, j itteration. and that object has a treePosition Property with an X and Y double.



var canvasWidthFinder = new List<int>();
//Loop through all componentversions, use indexes to calc their positions.
for (int i = 0; i < flattenedList.Count; i++)
{
canvasWidthFinder.Add(flattenedList[i].Count);
for (int j = 0; j < flattenedList[i].Count; j++)
{
flattenedList[i][j].TreePosition.YPosition = (i * 150) + 25;
flattenedList[i][j].TreePosition.XPosition = ((Canvas.ActualWidth / (flattenedList[i].Count + 1)) * (j + 1)) - (125 / 2);
}
}
Canvas.Width = (canvasWidthFinder.Max() * 160);


These values are then used to draw borders with text inside and lines drawn between the connecting ones.



Tree like graph structure.










share|improve this question
























  • Possible duplicate of What are the step to the Reingold-Tilford algorithm and how might I program it?
    – Peregrine
    Nov 14 at 11:58













up vote
0
down vote

favorite
1









up vote
0
down vote

favorite
1






1





This is not a duplicate of the Reingold-tolford, since that's just for drawing normal tree like structures. specifically I am looking for an algorithm where a node can link to a node thats not only on the level below it.



I'm building a tree like structure within a canvas control in WPF.
Currently I have a structure built like this(ignore the collisions of boxes I have that fixed) that generates automatically from my data.



While this structure isn't to bad, it'd be nice to work towards something with less collisions.



Therefore are there any algorithms I can follow and work with to draw a graph like this with less collisions.



I'm calculating all positions of the boxes like this currently,



flattenedList is a List < List< Object>> hence the i, j itteration. and that object has a treePosition Property with an X and Y double.



var canvasWidthFinder = new List<int>();
//Loop through all componentversions, use indexes to calc their positions.
for (int i = 0; i < flattenedList.Count; i++)
{
canvasWidthFinder.Add(flattenedList[i].Count);
for (int j = 0; j < flattenedList[i].Count; j++)
{
flattenedList[i][j].TreePosition.YPosition = (i * 150) + 25;
flattenedList[i][j].TreePosition.XPosition = ((Canvas.ActualWidth / (flattenedList[i].Count + 1)) * (j + 1)) - (125 / 2);
}
}
Canvas.Width = (canvasWidthFinder.Max() * 160);


These values are then used to draw borders with text inside and lines drawn between the connecting ones.



Tree like graph structure.










share|improve this question















This is not a duplicate of the Reingold-tolford, since that's just for drawing normal tree like structures. specifically I am looking for an algorithm where a node can link to a node thats not only on the level below it.



I'm building a tree like structure within a canvas control in WPF.
Currently I have a structure built like this(ignore the collisions of boxes I have that fixed) that generates automatically from my data.



While this structure isn't to bad, it'd be nice to work towards something with less collisions.



Therefore are there any algorithms I can follow and work with to draw a graph like this with less collisions.



I'm calculating all positions of the boxes like this currently,



flattenedList is a List < List< Object>> hence the i, j itteration. and that object has a treePosition Property with an X and Y double.



var canvasWidthFinder = new List<int>();
//Loop through all componentversions, use indexes to calc their positions.
for (int i = 0; i < flattenedList.Count; i++)
{
canvasWidthFinder.Add(flattenedList[i].Count);
for (int j = 0; j < flattenedList[i].Count; j++)
{
flattenedList[i][j].TreePosition.YPosition = (i * 150) + 25;
flattenedList[i][j].TreePosition.XPosition = ((Canvas.ActualWidth / (flattenedList[i].Count + 1)) * (j + 1)) - (125 / 2);
}
}
Canvas.Width = (canvasWidthFinder.Max() * 160);


These values are then used to draw borders with text inside and lines drawn between the connecting ones.



Tree like graph structure.







c# wpf algorithm canvas graph-algorithm






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 14 at 12:13

























asked Nov 14 at 11:40









user8478480

19011




19011












  • Possible duplicate of What are the step to the Reingold-Tilford algorithm and how might I program it?
    – Peregrine
    Nov 14 at 11:58


















  • Possible duplicate of What are the step to the Reingold-Tilford algorithm and how might I program it?
    – Peregrine
    Nov 14 at 11:58
















Possible duplicate of What are the step to the Reingold-Tilford algorithm and how might I program it?
– Peregrine
Nov 14 at 11:58




Possible duplicate of What are the step to the Reingold-Tilford algorithm and how might I program it?
– Peregrine
Nov 14 at 11:58












1 Answer
1






active

oldest

votes

















up vote
1
down vote













You could represent links that skip layers by creating dummy items in the intermediate layers. Then when you display the tree you could replace each dummy item with a vertical line instead of a block.






share|improve this answer





















  • It's not a bad idea though unfortunately I don't think that will work in this scenario, there are to many possibilities for boxes to be linking to other layers and after looking into it in a large amount of cases it's not helpful, and still collides. I think really this isn't even a tree so much and may not even be possible.
    – user8478480
    Nov 14 at 13:17











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53299415%2falgorithm-for-drawing-a-trees-where-nodes-can-attach-to-others-with-a-depth-grea%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes








up vote
1
down vote













You could represent links that skip layers by creating dummy items in the intermediate layers. Then when you display the tree you could replace each dummy item with a vertical line instead of a block.






share|improve this answer





















  • It's not a bad idea though unfortunately I don't think that will work in this scenario, there are to many possibilities for boxes to be linking to other layers and after looking into it in a large amount of cases it's not helpful, and still collides. I think really this isn't even a tree so much and may not even be possible.
    – user8478480
    Nov 14 at 13:17















up vote
1
down vote













You could represent links that skip layers by creating dummy items in the intermediate layers. Then when you display the tree you could replace each dummy item with a vertical line instead of a block.






share|improve this answer





















  • It's not a bad idea though unfortunately I don't think that will work in this scenario, there are to many possibilities for boxes to be linking to other layers and after looking into it in a large amount of cases it's not helpful, and still collides. I think really this isn't even a tree so much and may not even be possible.
    – user8478480
    Nov 14 at 13:17













up vote
1
down vote










up vote
1
down vote









You could represent links that skip layers by creating dummy items in the intermediate layers. Then when you display the tree you could replace each dummy item with a vertical line instead of a block.






share|improve this answer












You could represent links that skip layers by creating dummy items in the intermediate layers. Then when you display the tree you could replace each dummy item with a vertical line instead of a block.







share|improve this answer












share|improve this answer



share|improve this answer










answered Nov 14 at 12:45









Robin Bennett

1,382112




1,382112












  • It's not a bad idea though unfortunately I don't think that will work in this scenario, there are to many possibilities for boxes to be linking to other layers and after looking into it in a large amount of cases it's not helpful, and still collides. I think really this isn't even a tree so much and may not even be possible.
    – user8478480
    Nov 14 at 13:17


















  • It's not a bad idea though unfortunately I don't think that will work in this scenario, there are to many possibilities for boxes to be linking to other layers and after looking into it in a large amount of cases it's not helpful, and still collides. I think really this isn't even a tree so much and may not even be possible.
    – user8478480
    Nov 14 at 13:17
















It's not a bad idea though unfortunately I don't think that will work in this scenario, there are to many possibilities for boxes to be linking to other layers and after looking into it in a large amount of cases it's not helpful, and still collides. I think really this isn't even a tree so much and may not even be possible.
– user8478480
Nov 14 at 13:17




It's not a bad idea though unfortunately I don't think that will work in this scenario, there are to many possibilities for boxes to be linking to other layers and after looking into it in a large amount of cases it's not helpful, and still collides. I think really this isn't even a tree so much and may not even be possible.
– user8478480
Nov 14 at 13:17


















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.





Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


Please pay close attention to the following guidance:


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53299415%2falgorithm-for-drawing-a-trees-where-nodes-can-attach-to-others-with-a-depth-grea%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Biblatex bibliography style without URLs when DOI exists (in Overleaf with Zotero bibliography)

ComboBox Display Member on multiple fields

Is it possible to collect Nectar points via Trainline?