C++ PCL 求两个平面的交线

简介: C++ PCL 求两个平面的交线
#include <iostream>
#include <pcl/common/common.h>
#include <pcl/common/geometry.h>
#include <pcl/visualization/pcl_visualizer.h>

int main() {
    // 定义两个平面的法向量
    Eigen::Vector3f normal_plane1(1.0f, 0.0f, 0.0f);  // 第一个平面的法向量
    Eigen::Vector3f normal_plane2(0.0f, 1.0f, 0.0f);  // 第二个平面的法向量

    // 计算平面之间的交线
    Eigen::Vector3f line_direction = normal_plane1.cross(normal_plane2);  // 交线的方向向量

    std::cout << "Direction of intersection line: " << line_direction.transpose() << std::endl;

    // 选择一个平面作为基准点和另一个平面的法向量
    Eigen::Vector3f point_on_plane1(0.0f, 0.0f, 0.0f);  // 第一个平面上的一个点(可以是任意一个)
    float t = 100.0f;  // 参数化方程中的参数 t,可以根据具体需求进行调整

    // 计算交线上的一个点
    Eigen::Vector3f point_on_intersection_line = point_on_plane1 + t * line_direction;

    std::cout << "Point on intersection line: " << point_on_intersection_line.transpose() << std::endl;

    // 可视化部分
    pcl::visualization::PCLVisualizer viewer("Intersection Line Viewer");

    // 添加第一个平面
    pcl::ModelCoefficients plane1_coeff;
    plane1_coeff.values.push_back(normal_plane1.x());
    plane1_coeff.values.push_back(normal_plane1.y());
    plane1_coeff.values.push_back(normal_plane1.z());
    plane1_coeff.values.push_back(0.0);  // 偏移量设为0,表示过原点
    viewer.addPlane(plane1_coeff, "plane1");
    viewer.setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1.0, 0.0, 0.0, "plane1");

    // 添加第二个平面
    pcl::ModelCoefficients plane2_coeff;
    plane2_coeff.values.push_back(normal_plane2.x());
    plane2_coeff.values.push_back(normal_plane2.y());
    plane2_coeff.values.push_back(normal_plane2.z());
    plane2_coeff.values.push_back(0.0);  // 偏移量设为0,表示过原点
    viewer.addPlane(plane2_coeff, "plane2");
    viewer.setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0.0, 1.0, 0.0, "plane2");

    // 添加交线
    pcl::PointXYZ line_start(point_on_plane1.x(), point_on_plane1.y(), point_on_plane1.z());
    pcl::PointXYZ line_end(point_on_intersection_line.x(), point_on_intersection_line.y(), point_on_intersection_line.z());
    viewer.addLine(line_start, line_end, 1.0, 1.0, 1.0, "intersection_line");

    // 设置视角和渲染
    viewer.addCoordinateSystem(1.0);
    viewer.setBackgroundColor(0.1, 0.1, 0.1);
    viewer.initCameraParameters();

    // 显示窗口
    while (!viewer.wasStopped()) {
        viewer.spinOnce();
    }

    return 0;
}
目录
相关文章
|
20天前
|
C++
C++ PCL 沿着自定义的平面做横截面(直通滤波)
C++ PCL 沿着自定义的平面做横截面(直通滤波)
31 0
|
21天前
|
C++
C++ PCL SACSegmentationFromNormals setAxis 轴向的选择
C++ PCL SACSegmentationFromNormals setAxis 轴向的选择
29 2
|
20天前
|
C++
C++ PCL 将一个点云投影到一个由法向量和点确定的平面
C++ PCL 将一个点云投影到一个由法向量和点确定的平面
27 0
|
20天前
|
C++
C++ PCL 计算多个RT矩阵变换后的变换矩阵
C++ PCL 计算多个RT矩阵变换后的变换矩阵
22 0
|
20天前
|
传感器 算法 C++
C++ PCL 设置法向量的方向
C++ PCL 设置法向量的方向
26 0
|
C++ Python
C++ PCL三维点云物体目标识别
C++ PCL三维点云物体目标识别
742 1
C++ PCL三维点云物体目标识别
【C++】CMake中Visual Studio的MSVC版本与PCL版本对应关系
【C++】CMake中Visual Studio的MSVC版本与PCL版本对应关系
255 0
|
1月前
|
C++ 容器
C++中自定义结构体或类作为关联容器的键
C++中自定义结构体或类作为关联容器的键
31 0
|
14天前
|
存储 编译器 C++
C ++初阶:类和对象(中)
C ++初阶:类和对象(中)
|
14天前
|
C++
C++(十六)类之间转化
在C++中,类之间的转换可以通过转换构造函数和操作符函数实现。转换构造函数是一种单参数构造函数,用于将其他类型转换为本类类型。为了防止不必要的隐式转换,可以使用`explicit`关键字来禁止这种自动转换。此外,还可以通过定义`operator`函数来进行类型转换,该函数无参数且无返回值。下面展示了如何使用这两种方式实现自定义类型的相互转换,并通过示例代码说明了`explicit`关键字的作用。