深度首先搜索子网格

时间:2017-10-12 15:13:43

标签: c++ json algorithm

我试图打印给定场景节点的所有子网格..它基本上是深度优先搜索。我试图将json值输出为1级,2级,直到最后一个孩子然后输出" "

似乎我错过了一些我无法理解递归的东西

更新:这是另一个试验:

void AssimpLoader::WriteSubMeshesToJson(const aiScene* mScene,  const aiNode* pNode,  Json::StyledWriter &writer, std::ofstream &myfile, int level, Json::Value root )
{
    // if we have meshes
    if( pNode == nullptr)
    {
        // write to disk
        Ogre::LogManager::getSingleton().logMessage(" for mesh '" + Ogre::String( pNode->mName.data ) + "'" );
        Json::Value parameter;
        parameter["level0"];
        root.append(parameter);
        std::string output = writer.write(root);
        myfile << output;
        level = 0;
    }
    else
    {
        Json::Value parameter;
        level++;
        parameter["Level " + std::to_string(level)] = Ogre::String( pNode->mName.data) ;
        root.append(parameter);
        std::string output = writer.write(root);
        myfile << output;
    }
    // Traverse all child nodes of the current node instance
    for( unsigned int childIdx=0; childIdx < pNode->mNumChildren; childIdx++ )
    {
        const aiNode* pChildNode = pNode->mChildren[ childIdx ];
        WriteSubMeshesToJson(mScene, pChildNode, writer, myfile,level, root);


    }



}

我需要json像这样

{
      "Parenting1" : {
         "Parenting2" : {
            "Parenting3" : {}
         }
      }
}

1 个答案:

答案 0 :(得分:0)

你的问题在这里:

void WriteSubMeshesToJson(..., std::ofstream &myfile, int &level)
----------------------------------------------------------^

因为您使用了对level变量的引用,所以在完成打印当前子项后,您的增量在父调用中可见。不应该,打印子网格时,函数中的level值不应更改。

只需删除&即可使用按值传递的参数。

您的Json::Value存在相反的问题,您应该通过引用传递它,以便孩子们可以将自己插入到父json中。您应该修改对WriteSubMeshesToJson的调用以传递当前节点,而不是始终传递root节点。

顺便说一下,你的代码对于C ++来说并不是非常惯用的。所以这里有一个建议:在将字符串发送到文件之前无需手动格式化字符串,您也可以直接在<<上使用std::ostream运算符

std::string output;
level++;
output = "level" +  std::to_string(level) + + pNode->mName.data+ "\n";
myfile << output;

变为:

output << "level" << level << pNode->mName.data << '\n';