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;
}
目录
相关文章
|
5月前
|
C++
C++ PCL 沿着自定义的平面做横截面(直通滤波)
C++ PCL 沿着自定义的平面做横截面(直通滤波)
56 0
|
5月前
|
C++
C++ PCL SACSegmentationFromNormals setAxis 轴向的选择
C++ PCL SACSegmentationFromNormals setAxis 轴向的选择
99 2
|
5月前
|
C++
C++ PCL 将一个点云投影到一个由法向量和点确定的平面
C++ PCL 将一个点云投影到一个由法向量和点确定的平面
143 0
|
5月前
|
C++
C++ PCL 计算多个RT矩阵变换后的变换矩阵
C++ PCL 计算多个RT矩阵变换后的变换矩阵
63 0
|
5月前
|
传感器 算法 C++
C++ PCL 设置法向量的方向
C++ PCL 设置法向量的方向
111 0
|
C++ Python
C++ PCL三维点云物体目标识别
C++ PCL三维点云物体目标识别
880 1
C++ PCL三维点云物体目标识别
【C++】CMake中Visual Studio的MSVC版本与PCL版本对应关系
【C++】CMake中Visual Studio的MSVC版本与PCL版本对应关系
320 0
|
7天前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
43 18
|
7天前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
32 13
|
7天前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
26 5

热门文章

最新文章