Как суммировать дочерние значения, которые начинаются от дочерних до корневых в древовидной структуре?
Я хочу получить абсолютные значения каждого узла. Абсолютное значение означает, что расстояние от корня.
если у меня есть модель скелета.
коренные дети
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;
}