void TrajectoryConfigModel::ComputCircleSegmentPoint(const pcl::PointXYZ center,
const pcl::Normal normal,
const float Radius,
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{
float cx = center.x, cy = center.y, cz = center.z;
float r = Radius;
Eigen::Vector3f i(1.0, 0.0, 0.0);
Eigen::Vector3f j(0.0, 1.0, 0.0);
Eigen::Vector3f k(0.0, 0.0, 1.0);
Eigen::Vector3f n(normal.normal_x, normal.normal_y, normal.normal_z);
Eigen::Vector3f a(0.0, 0.0, 0.0);
Eigen::Vector3f b(0.0, 0.0, 0.0);
// 求向量a
a = n.cross(i);
if(a.norm() == 0.0)
{
a = n.cross(j);
}
if(a.norm() == 0.0)
{
a = n.cross(k);
}
// 求向量 b
b = n.cross(a);
// 归一化a,b(圆面两个互垂直向量)
a.normalize();
b.normalize();
//利用空间圆的参数方程生成分割点
int arc_num_point = m_farcnum * 2; //分为8段
float t = 0;
float angle = (t / 180.0) * M_PI;
while (t < 350.0)
{
float xi = cx + r*(a[0]*cos(angle) + b[0]*sin(angle));
float yi = cy + r*(a[1]*cos(angle) + b[1]*sin(angle));
float zi = cz + r*(a[2]*cos(angle) + b[2]*sin(angle));
pcl::PointXYZ seg_point;
seg_point.x = xi;
seg_point.y = yi;
seg_point.z = zi;
cloud -> push_back(seg_point);
t = t + 360 / arc_num_point;
angle = (t / 180.0) * M_PI;
}
}
C++计算空间圆分割点
最新推荐文章于 2024-07-15 13:32:43 发布