2013-03-16 4 views
1

Прежде всего, я покажу примерно то, что я пытался сделать здесь. The desired effect. Обратите внимание, что это не так, потому что текущая система не работает. Вот почему я здесь.Сортировка массива визуальных узлов

Я пытался решить эту проблему в течение некоторого времени. Я получил этот код до сих пор, но он работает неправильно.

public double UpdateChildPosition(bool fromParent) 
    { 
     if (children.Count == 0) 
      return 0; 

     if (!fromParent && parentnode != null) 
     { 
      parentnode.UpdateChildPosition(false); 
      return 0; 
     } 

     double cwidth = 0; 
     if ((fromParent && children.Count > 0) || parentnode == null) 
      children.ForEach((n) => cwidth += n.UpdateChildPosition(true)); 

     double width = children.Sum((n) => n.rectangle1.Width + 10) + cwidth/2; 
     double x = 0 - width/2; 
     foreach (MindmapNode node in children) 
     { 
      node.x = x; 
      x += node.rectangle1.Width + 10 + cwidth/children.Count; 
      node.y = 50; 
     } 
     return width; 
    } 

Вместо этого, он создает это:

Picture of the current effect http://img29.imageshack.us/img29/9660/effectg.png

Я дал возможно немного слишком мало информации, но я точно не знаю, сколько нужно. Запросите дополнительную информацию. Спасибо!

Не разрешил мне отправлять изображения из-за новой учетной записи.

EDIT Я забыл сказать, что в моей системе координаты относительно родителя.

EDIT2 Я немного продвинулся вперед. Текущая проблема: при изменении размеров узлов (да, они динамические) они перекрываются.

List<MindmapNode> children; 
public double UpdateChildPosition(bool fromParent) 
    { 
     if (children.Count == 0) 
      return rectangle1.Width + 10; 

     if (!fromParent && parentnode != null) 
     { 
      parentnode.UpdateChildPosition(false); 
      return 0; 
     } 

     double[] childrenwidth = new double[children.Count]; 

     //if ((fromParent && children.Count > 0) || parentnode == null) 
     List<MindmapNode> rchildren = (from n in children 
             where n.moved == false 
             select n).ToList(); 
     (from n in children 
     where rchildren.Contains(n) == false 
     select n).ToList().ForEach((n) => n.UpdateChildPosition(true)); 

     int i = 0; 
     rchildren.ForEach((n) => childrenwidth[i++] = 
      Math.Max(n.UpdateChildPosition(true), (n.children.Count > 0) ? n.rectangle1.Width * 2 : 0)); 

     double width = childrenwidth.Sum(); 
     double x = -width/2; 
     i = 0; 
     foreach (MindmapNode node in rchildren) 
     { 
      x += childrenwidth[i]/2; 
      node.x = x; 
      x += childrenwidth[i]/2; 
      node.y = 50; 
      i++; 
      node.SetOrigin(); 
     } 
     return width; 
    } 
+0

С какой проблемой вы столкнулись? Я не вижу никакой разницы между текущим и желаемым. –

+0

@PieterGeerkens он хочет, чтобы каждая группа дочерних узлов была центрирована под своим родительским узлом, похоже. Я не могу сказать, хочет ли он, чтобы зеленые узлы или фиолетовые узлы были равномерно распределены; выбор между этими двумя подразумевает разные подходы к проблеме. – Random832

+0

@ Random832: Получил это сейчас; TY. –

ответ

0

Это должно работать для каждого родителя:

X = ((children.Last.Right - children.First.Left)/2) - Width/2; 

Мне кажется, что это определение того, что желательно, перевод прямо в код.

+0

Я не могу понять, как это реализовать. – Rare

+0

Вы хотите разместить родителя относительно детей (как мне кажется) или детей относительно родителя? –

+0

«Детские узлы распределены равномерно, рекурсивные над слоями узлов». Вероятно, должен был быть добавлен относительно родителя. Обратите внимание, что это рекурсивно, потому что узел под узлом под узлом под узлом может быть узлом - размер динамический. – Rare

Смежные вопросы