1.随机采样

 1     samples.vn = want_sample_num;
 2 
 3     vector<int> nCard = GlobalFun::GetRandomCards(original.vert.size());
 4     for(int i = 0; i < samples.vn; i++) 
 5     {
 6         int index = nCard[i]; //could be not random!
 7 
 8                 if (!use_random_downsample)
 9                 {
10                   index = i;
11                 }
12 
13         CVertex& v = original.vert[index];
14         samples.vert.push_back(v);
15         samples.bbox.Add(v.P());
16     }    

 

 1 vector<int> GlobalFun::GetRandomCards(int Max)
 2 {
 3     vector<int> nCard(Max, 0);
 4     srand(time(NULL));
 5     for(int i=0; i < Max; i++)
 6     {
 7         nCard[i] = i;
 8     }
 9     random_shuffle(nCard.begin(), nCard.begin() + Max);
10 
11 
12     return nCard;
13 }

 2.将平面点云投影到XOY平面

 1 //增加仿射变换
 2         planefit fit;
 3         fit.setInputPointCloud(ptsArray);
 4         fit.extractMeanAD();
 5         Eigen::Vector3d normal = fit.getPlane().getNormal();
 6         Eigen::Vector3d center = fit.getPlane().getCenter();
 7         Eigen::Vector3d virtical = Eigen::Vector3d::UnitZ();
 8         //计算叉积
 9         Eigen::Vector3d axis = normal.cross(virtical);
10         double theta = acos(normal.dot(virtical) / normal.norm());
11         Eigen::AngleAxisd rotation_vector(theta, axis);
12         Eigen::Matrix3d rotation_matrix = rotation_vector.toRotationMatrix();
13         //转换到XOY平面
14         std::vector<POINT_REGIS> ptsRotateArray;
15         for (int i = 0; i < ptsArray.size();i++)
16         {
17             POINT_REGIS pt = ptsArray[i];
18             Eigen::Vector3d pt1(pt.x, pt.y, pt.z);
19             Eigen::Vector3d pt2=pt1 - center;
20             Eigen::Vector3d vpt = rotation_vector*pt2;
21             POINT_REGIS vpt1;
22             vpt1.x = vpt.x();
23             vpt1.y = vpt.y();
24             vpt1.z = vpt.z();
25             ptsRotateArray.push_back(vpt1);
26         }

 3.参数

 1 double DataMgr::getInitRadiuse()
 2 {
 3     double init_para = para->getDouble("Init Radius Para");
 4     if (!isOriginalEmpty())
 5     {
 6         Box3f box = original.bbox;
 7         if ( abs(box.min.X() - box.max.X()) < 1e-5 ||   
 8             abs(box.min.Y() - box.max.Y()) < 1e-5 ||   
 9             abs(box.min.Z() - box.max.Z()) < 1e-5 )
10         {
11             double diagonal_length = sqrt((box.min - box.max).SquaredNorm());
12             double original_size = sqrt(double(original.vn));
13             init_radius = 2 * init_para * diagonal_length / original_size;
14         }
15         else
16         {
17             double diagonal_length = sqrt((box.min - box.max).SquaredNorm());
18             double original_size = pow(double(original.vn), 0.333);
19             init_radius = init_para * diagonal_length / original_size;
20         }
21     }
22 
23  
24   global_paraMgr.setGlobalParameter("CGrid Radius", DoubleValue(init_radius));
25   global_paraMgr.setGlobalParameter("Initial Radius", DoubleValue(init_radius));
26 
27     return init_radius;
28 }
View Code

相关文章:

  • 2022-12-23
  • 2021-08-17
  • 2021-09-14
  • 2021-04-17
  • 2021-04-27
  • 2022-02-24
  • 2021-05-22
  • 2022-02-25
猜你喜欢
  • 2021-09-07
  • 2022-12-23
  • 2021-09-09
  • 2021-10-11
  • 2021-04-24
  • 2021-07-02
相关资源
相似解决方案