Как суммировать дочерние значения, которые начинаются от дочерних до корневых в древовидной структуре?

Я хочу получить абсолютные значения каждого узла. Абсолютное значение означает, что расстояние от корня.

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

коренные дети

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

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

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

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

Благодарю.

1 ответ

Решение

Похоже, у вас есть проблема в вашей рекурсии. Пытаться

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;
}
Другие вопросы по тегам