Пример #1
0
TEST (PCL, Octree2Buf_Test)
{

  // create octree instances
  Octree2BufBase<int> octreeA;
  Octree2BufBase<int> octreeB;

  // set octree depth
  octreeA.setTreeDepth (8);
  octreeB.setTreeDepth (8);

  struct MyVoxel
  {
    unsigned int x;unsigned int y;unsigned int z;
  };

  unsigned int i, j;
  int data[256];
  MyVoxel voxels[256];

  srand (time (NULL));

  // generate some voxel indices
  for (i = 0; i < 256; i++)
  {
    data[i] = i;

    voxels[i].x = i;
    voxels[i].y = 255 - i;
    voxels[i].z = i;

    // add data to leaf node voxel
    octreeA.add (voxels[i].x, voxels[i].y, voxels[i].z, data[i]);

  }

  ASSERT_EQ (256, octreeA.getLeafCount());

  int TreeData;

  for (i=0; i<128; i++)
  {
    // retrieve and check data from leaf voxel
    octreeA.get(voxels[i].x,voxels[i].y,voxels[i].z, TreeData);
    ASSERT_EQ (TreeData, data[i]);
  }

  for (i=128; i<256; i++)
  {
    // check if leaf node exists in tree
    ASSERT_EQ ( octreeA.existLeaf(voxels[i].x,voxels[i].y,voxels[i].z) , true);

    // remove leaf node
    octreeA.removeLeaf(voxels[i].x,voxels[i].y,voxels[i].z);

    //  leaf node shouldn't exist in tree anymore
    ASSERT_EQ ( octreeA.existLeaf(voxels[i].x,voxels[i].y,voxels[i].z) , false);
  }



  ////////////

  // test serialization

  std::vector<char> treeBinaryA;
  std::vector<char> treeBinaryB;

  std::vector<int> leafVectorA;
  std::vector<int> leafVectorB;

  // serialize tree - generate binary octree description
  octreeA.serializeTree(treeBinaryA);

  // deserialize tree - rebuild octree based on binary octree description
  octreeB.deserializeTree(treeBinaryA);


  // check if leafs exist in octrees
  for (i=0; i<128; i++)
  {
    ASSERT_EQ ( octreeB.existLeaf(voxels[i].x,voxels[i].y,voxels[i].z) , true);
  }

  // these leafs should not exist..
  for (i=128; i<256; i++)
  {
    ASSERT_EQ ( octreeB.existLeaf(voxels[i].x,voxels[i].y,voxels[i].z) , false);
  }

  // checking deleteTree();
  octreeB.deleteTree();
  octreeB.setTreeDepth (8);

  // octreeB.getLeafCount() should be zero now;
  ASSERT_EQ (0,octreeB.getLeafCount());

  for (i=0; i<128; i++)
  {
    ASSERT_EQ ( octreeB.existLeaf(voxels[i].x,voxels[i].y,voxels[i].z) , false);
  }


  // test tree serialization
  octreeA.serializeTree(treeBinaryA, leafVectorA);

  // make sure, we retrieved all data objects
  ASSERT_EQ (leafVectorA.size(), octreeA.getLeafCount());

  // check if leaf data is found in octree input data
  bool bFound;
  for (i=0; i<128; i++)
  {
    int leafInt = leafVectorA.back();
    leafVectorA.pop_back();

    bFound = false;
    for (j=0; j<256; j++)
    if ( data[j]==leafInt )
    {
      bFound = true;
      break;
    }

    ASSERT_EQ (bFound, true);
  }

  // test tree serialization
  octreeA.serializeLeafs(leafVectorA);

  for (i=0; i<128; i++)
  {
    int leafInt = leafVectorA.back();
    leafVectorA.pop_back();

    bFound = false;
    for (j=0; j<256; j++)
    if ( data[j]==leafInt )
    {
      bFound = true;
      break;
    }

    ASSERT_EQ (bFound, true);
  }

  // test tree serialization with leaf data vectors
  octreeA.serializeTree(treeBinaryA, leafVectorA);
  octreeB.deserializeTree(treeBinaryA, leafVectorA);

  ASSERT_EQ (octreeA.getLeafCount(),octreeB.getLeafCount());
  ASSERT_EQ (128,octreeB.getLeafCount());

  octreeB.serializeTree(treeBinaryB, leafVectorB);

  // test size and leaf count of reconstructed octree
  ASSERT_EQ (leafVectorB.size(), octreeB.getLeafCount());
  ASSERT_EQ (leafVectorA.size(), leafVectorB.size());

  for (i=0; i<leafVectorB.size(); i++)
  {
    ASSERT_EQ ( (leafVectorA[i] == leafVectorB[i]), true );
  }

}
Пример #2
0
TEST (PCL, Octree2Buf_Base_Double_Buffering_XOR_Test)
{

#define TESTPOINTS 3000

  // create octree instances
  Octree2BufBase<int> octreeA;
  Octree2BufBase<int> octreeB;

  std::vector<char> treeBinaryA;
  std::vector<char> treeBinaryB;

  std::vector<int> leafVectorA;
  std::vector<int> leafVectorB;

  octreeA.setTreeDepth (5);
  octreeB.setTreeDepth (5);

  struct MyVoxel
  {
    unsigned int x;unsigned int y;unsigned int z;
  };

  unsigned int i, j;
  int data[TESTPOINTS];
  MyVoxel voxels[TESTPOINTS];

  srand (time (NULL));

  const unsigned int test_runs = 15;

  for (j = 0; j < test_runs; j++)
  {
    for (i = 0; i < TESTPOINTS; i++)
    {
      data[i] = rand ();

      voxels[i].x = rand () % 4096;
      voxels[i].y = rand () % 4096;
      voxels[i].z = rand () % 4096;

      // add data to octree

      octreeA.add (voxels[i].x, voxels[i].y, voxels[i].z, data[i]);
    }

    // test serialization - XOR tree binary data
    octreeA.serializeTree (treeBinaryA, leafVectorA, true);
    octreeB.deserializeTree (treeBinaryA, leafVectorA, true);
    octreeB.serializeTree (treeBinaryB, leafVectorB, true);

    // check leaf count of rebuilt octree
    ASSERT_EQ (octreeA.getLeafCount(),octreeB.getLeafCount());
    ASSERT_EQ (leafVectorB.size(), octreeB.getLeafCount());
    ASSERT_EQ (leafVectorA.size(), leafVectorB.size());
    ASSERT_EQ (treeBinaryA.size(), octreeB.getBranchCount());
    ASSERT_EQ (treeBinaryA.size(), treeBinaryB.size());

    // check if octree octree structure is consistent.
    for (i=0; i<leafVectorB.size(); i++)
    {
      ASSERT_EQ ( (leafVectorA[i] == leafVectorB[i]), true );
    }

    // switch buffers
    octreeA.switchBuffers();
    octreeB.switchBuffers();

  }

}
Пример #3
0
TEST (PCL, Octree2Buf_Base_Double_Buffering_Test)
{

#define TESTPOINTS 3000

  // create octree instances
  Octree2BufBase<int> octreeA;
  Octree2BufBase<int> octreeB;

  std::vector<char> treeBinaryA;
  std::vector<char> treeBinaryB;

  std::vector<int*> leafVectorA;
  std::vector<int*> leafVectorB;

  octreeA.setTreeDepth (5);
  octreeB.setTreeDepth (5);

  struct MyVoxel
  {
    unsigned int x;
    unsigned int y;
    unsigned int z;
  };

  unsigned int i, j, k, runs;
  int data[TESTPOINTS];
  MyVoxel voxels[TESTPOINTS];

  srand (static_cast<unsigned int> (time (NULL)));

  const unsigned int test_runs = 20;

  for (j = 0; j < test_runs; j++)
  {
    octreeA.deleteTree ();
    octreeB.deleteTree ();
    octreeA.setTreeDepth (5);
    octreeB.setTreeDepth (5);

    runs = rand () % 20 + 1;
    for (k = 0; k < runs; k++)
    {
      // switch buffers
      octreeA.switchBuffers ();
      octreeB.switchBuffers ();

      for (i = 0; i < TESTPOINTS; i++)
      {
        data[i] = rand ();

        voxels[i].x = rand () % 4096;
        voxels[i].y = rand () % 4096;
        voxels[i].z = rand () % 4096;

        // add data to octree

        int* container = octreeA.createLeaf(voxels[i].x, voxels[i].y, voxels[i].z);
        *container = data[i];

      }

      // test serialization
      octreeA.serializeTree (treeBinaryA, leafVectorA, true);
      octreeB.deserializeTree (treeBinaryA, leafVectorA, true);
    }

    octreeB.serializeTree (treeBinaryB, leafVectorB, true);

    // check leaf count of rebuilt octree
    ASSERT_EQ (octreeA.getLeafCount (), octreeB.getLeafCount ());
    ASSERT_EQ (leafVectorB.size (), octreeB.getLeafCount ());
    ASSERT_EQ (leafVectorA.size (), leafVectorB.size ());

    // check if octree octree structure is consistent.
    for (i = 0; i < leafVectorB.size (); i++)
    {
      ASSERT_EQ (*leafVectorA[i], *leafVectorB[i]);
    }

  }

}