Estoy tratando de crear un diagrama de nodo tipo árbol, como el example image here. Tengo el siguiente código:Creando un diagrama de nodo de árbol
private void DrawNode(Graphics g, Node<T> node, float xOffset, float yOffset)
{
if (node == null)
{
return;
}
Bitmap bmp = (from b in _nodeBitmaps where b.Node.Value.Equals(node.Value) select b.Bitmap).FirstOrDefault();
if (bmp != null)
{
g.DrawImage(bmp, xOffset, yOffset);
DrawNode(g, node.LeftNode, xOffset - 30 , yOffset + 20);
DrawNode(g, node.RightNode, xOffset + 30, yOffset + 20);
}
}
Mi código casi funciona. El problema que estoy teniendo es que algunos de los nodos se superponen. En la imagen de arriba, los nodos 25 y 66 se superponen. La razón, estoy seguro, se debe a que matemáticamente los nodos derechos y los nodos derechos tienen el mismo espacio, por lo que el nodo derecho del padre se superpone con el nodo izquierdo del padre adyacente. ¿Como puedo solucionar este problema?
ACTUALIZACIÓN:
Ésta es la actualización de código que hice después de la sugerencia de DTB:
int nodeWidth = 0;
int rightChildWidth = 0;
if (node.IsLeafNode)
{
nodeWidth = bmp.Width + 50;
}
else
{
int leftChildWidth = 0;
Bitmap bmpLeft = null;
Bitmap bmpRight = null;
if (node.LeftNode != null)
{
bmpLeft =
(from b in _nodeBitmaps where b.Node.Value.Equals(node.LeftNode.Value) select b.Bitmap).
FirstOrDefault();
if (bmpLeft != null)
leftChildWidth = bmpLeft.Width;
}
if (node.RightNode != null)
{
bmpRight =
(from b in _nodeBitmaps where b.Node.Value.Equals(node.RightNode.Value) select b.Bitmap).
FirstOrDefault();
if (bmpRight != null)
rightChildWidth = bmpRight.Width;
}
nodeWidth = leftChildWidth + 50 + rightChildWidth;
}
g.DrawImage(bmp, xOffset + (nodeWidth - bmp.Width)/2, yOffset);
if (node.LeftNode != null)
{
DrawNode(g, node.LeftNode, xOffset, yOffset + 20);
}
if (node.RightNode != null)
{
DrawNode(g, node.RightNode, xOffset + nodeWidth - rightChildWidth, yOffset + 20);
}
Aquí está una captura de pantalla de este código:
No estoy seguro de cómo nos gustaría saber cómo solucionar el problema, ya que se puede manejar cualquier manera lo que quiere es: reducir los nodos ¡Cambia a los padres! Permitir la superposición Simplemente decida sobre una estrategia, calcule cuándo se necesitará esa estrategia e impleméntela. – dlev
@dlev - no es tan fácil. Si cambio a los padres, el mismo problema les sucede a los niños (que también son padres) debajo de él. Reducir los nodos tampoco ayuda ... eso solo los encoge, pero aún se superpone. Tiene que ser algún tipo de solución matemática. – Icemanind
No me refiero a ser flip: pasé por alto el "calcular cuándo se necesitará esa estrategia", pero ese es realmente el quid de esta cuestión. Es difícil decir más sin saber exactamente cómo desea exponer todo. – dlev