2015-03-12 3 views
0

Я хочу получить абсолютные значения каждого узла. Абсолютное значение означает, что расстояние от корня.Как суммировать дочерние значения, которые начинаются с child на root в древовидной структуре?

если у меня есть скелет модели.

корневые Чайлдс являются

root 
left hip - child 
left knee - child 
left foot - child 

assume that all the bones lengths are equal to 1. 
root to hip = 1 
hip to knee = 1 
knee to foot = 1 

Так что, если я хочу, чтобы получить положение стопы сустава от корня, оно должно быть 3. я прав?

root to foot = root to hip + hip to knee + knee to foot = 3 

так это подпрограммы, которые я использую ..

void ComputeAbs() 
{ 
    for(unsigned int i=1; i<nNodes(); i++) 
    { 
     node* b = getNode(i); 
     if(b) 
     { 
      b->nb = ComputeAbsSum(b); 
     } 
    } 
} 

int ComputeAbsSum(node *b) 
{ 
    int m = b->nb; 
    if (b->child != NULL) 
    { 
     m *= ComputeAbsSum(b->child); 
    } 
    return m; 
} 

результат будет как

root to hip = 3 
root to knee = 2 
root to foot = 1 

But I want in a reverse way, i should get like this 

root to hip = 1 
root to knee = 2 
root to foot = 3 

Как я могу достичь этого результата? как добавить значения дочерних элементов дерева начинается с child на root?

Конечная цель - получить окончательную позу, вычислив абсолютную трансформацию сустава.

bonePoseAbsolute[i] = bonePoseAbsolute[parentIndex] * bonePoseRelative[i]; 

Спасибо.

+0

Есть некоторые серьезные недостатки. Во-первых, откуда можно получить стоимость края? Всегда ли это единица? Тогда решение от Kane @ правильное. Просьба указать, как получить стоимость края между b и b-> дочерним. – Fallen

ответ

0

Похоже, что у вас возникла проблема в вашей рекурсии. Попробуйте

int ComputeAbsSum(node *b) 
{ 
    int result = 1; 
    if (b->child != NULL) 
     result += ComputeAbsSum(b->child); 
    return result; 
} 

* редактировать: если вы хотите, чтобы перемещаться по дереву в обратном направлении,

int ComputeAbsSumReverse(node *b) 
{ 
    int result = 1; 
    if (b->parent != NULL) 
     result += ComputeAbsSum(b->parent); 
    return result; 
} 
+0

No Kane, Он просто подсчитывает количество детей. Я не хочу подсчитывать детей в дереве. Я хочу добавить значения всех родителей к конкретному ребенку. Например, у ноги есть родитель колена, а у коленки есть бедра, поэтому значение footchild-> value + = kneeparent-> value + hipparent->. – furqan

+0

на основе вашего комментария, замените int result = 1 на int result = b-> value –

+0

Да, я уже делаю это, используя эту функцию int ComputeAbsSum (node ​​* b) ... вы можете это увидеть. Эта функция добавляет от root к child, что означает, что она добавляет все значения childs и хранится в родительском. Например, бедро + = колено + нога, затем колено + = нога, но я хочу в обратном направлении, ногу + = колено + бедро, а колено + = бедро .. вот так. То, что я хочу, такое же, как и std :: reverse (vector.begin(), vector.end()); но проблема связана с таким списком, в котором у вас есть родительские и дочерние отношения, как я могу перейти от ребенка к родительскому? от родителя к ребенку легко, но от ребенка к родительскому? – furqan