精华内容
下载资源
问答
  • 平面分割

    2018-12-11 08:40:15
    平面分割

    描述 Description
    【问题描述】
      同一平面内有n(n≤500)条直线,已知其中p(p≥2)条直线相交于同一点,则这n条直线最多能将平面分割成多少个不同的区域?
    【输入格式】
      两个整数n(n≤500)和p(2≤p≤n)。
    【输出格式】
      一个正整数,代表最多分割成的区域数目。
    【输入样例】
    12 5
    【输出样例】
    73

    此时直线每过一条直线,就能多分割出一块空间,共可分割出n块。

    所以得到递推式:f ( p ) = 2 * p ;

    f(n)=f(n-1)+n;
    
        #include<iostream>
        using namespace std;
        int main()
        {
            int n,m;
            cin>>n>>m;
            int total=2*m;
            for (int i=m+1;i<=n;i++)
            total+=i;
            cout<<total;
        	return 0;
        }
    
    展开全文
  • 平面分割空间

    2016-07-18 17:22:46
    一篇网上找到的分析平面分割空间的很好的文档,分享给个位acmer们看看。
  • 平面分割问题

    2019-09-22 10:03:51
     1.n条直线最多能将一个平面分割成多少个区域?用F(n)来表示。  n-1条直线能将平面分割成F(n-1)个平面。若要第n条直线分割出的平面数最多,则第n条直线应和n-1条直线都相交,且不能相交于一点。那么就会产生n-1个...

      

      1. n条直线最多能将一个平面分割成多少个区域?用F(n)来表示。

      n-1条直线能将平面分割成F(n-1)个平面。若要第n条直线分割出的平面数最多,则第n条直线应和n-1条直线都相交,且不能相交于一点。那么就会产生n-1个交点,第n条直线被n-1条直线分割成n-2条线段和2条射线。他们(线段、射线)各自将经过的区域一分为二。故增加了n-2+2个区域。

      所以有公式:F(n)=F(n-1)+n=F(n-2)+n-1+n+2=....=n*(n+1)/2 + 1

     

      2.n条折线最多能将平面分割成多少个区域?用F(n)表示。

      n-1条折线最多能将平面分割成F(n-1)个区域,同样的,若要第n条折线分割出的平面数最多。第n条折线的两边应和n-1条折线----2*(n-1)条边相交于不同的点。新增的线段数为4*(n-1),射线数为2,不过折线本身的两条线段只能增一个区域。

      故有公式:F(n)=F(n-1)+4*(n-1)+2-1=....=2*(n-1)*n+n+1=2*n2 - n + 1。

     

      3. 封闭曲线分割问题:设有n条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何三条封闭曲线不相交于同一点,问这些封闭曲线把平面分割成的区域个数。


      观察上图,我们发现F(2)-F(1)=2,F(3)-F(2)=4,F(4)-F(3)=6。即F(n)-F(n-1)=2*(n-1)。

      证明如下:n-1条封闭曲线把平面分割为F(n-1)个区域。因为第n条封闭曲线与前n-1条封闭曲线相交产生2*(n-1)个点和2*(n-1)个线段。所以有F(n)=F(n-1)+2*(n-1)=....=n*(n-1)+2。

     

      4. 平面分割空间问题

      由二维的分割问题可知,平面分割与线之间的交点有关,即交点决定射线和线段的条数,从而决定新增的区域数。试想在三维中则是否与平面的交线有关呢?当有n-1个平面时,分割的空间数为F(n-1)。要有最多的空间数,则第n个平面需与前n-1个平面相交,且不能有共同的交线。即最多有n-1 条交线。而这n-1条交线把第n个平面最多分割成g(n-1)个区域。(g(n)为(1)中的直线分平面的个数 )此平面将原有的空间一分为二,则最多增加g(n-1)个空间。

      F=F(n-1)+g(n-1) =.....=(n3 + 5*n)/6 + 1    Ps: g(n)=n(n+1)/2+1 

      

     

    转载于:https://www.cnblogs.com/khan724/articles/4217017.html

    展开全文
  • PCL点云平面分割

    2020-12-24 09:54:17
    PCL点云平面分割平面分割方法封装 /** \brief 多平面分割 * \param[in] cloud_in 待分割点云 * \param[in] maxiter 最大迭代次数 * \param[in] dist 判断是否为平面内点的距离阈值 * \param[in] proportion 非...

    PCL点云平面分割


    多平面分割方法封装

    /** \brief 多平面分割
    * \param[in] cloud_in 待分割点云
    * \param[in] maxiter 最大迭代次数
    * \param[in] dist 判断是否为平面内点的距离阈值
    * \param[in] proportion 非平面点所占点云比例,[0,1]之间取值
    * \param[out] out_plane_vect 分割后的平面模型点云集合
    * \return 0成功,-1失败
    */
    int g_multPlaneSeg(pcl::PointCloud<pcl::PointXYZ>::Ptr & cloud_in, int maxiter, double dist,  float proportion, std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr>& out_plane_vect)
    {
    	pcl::PointCloud<pcl::PointXYZ>::Ptr cloudXYZ(new pcl::PointCloud<pcl::PointXYZ>());
    	pcl::copyPointCloud(*cloud_in, *cloudXYZ);
    	std::vector<int> mapping;
    	pcl::removeNaNFromPointCloud(*cloudXYZ, *cloudXYZ, mapping);
    
    	out_plane_vect.clear();
    	//平面提取,获取平面方程
    	pcl::SACSegmentation<pcl::PointXYZ> seg;
        seg.setModelType(pcl::SACMODEL_PLANE);//平面模型		
    
    	seg.setOptimizeCoefficients(true); //设置对估计的模型参数进行优化处理
    	seg.setMethodType(pcl::SAC_RANSAC); // 设置用哪个随机参数估计方法,分割方法:随机采样法
    
    	seg.setMaxIterations(maxiter);//设置最大迭代次数 
    	seg.setDistanceThreshold(dist);//设置判断是否为模型内点的距离阈值
    
    	size_t nr_points = cloudXYZ->points.size();
    
    	while (cloudXYZ->points.size() > proportion * nr_points)
    	{
    		pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients());
    		pcl::PointIndices::Ptr inliersIndices(new pcl::PointIndices());
    
    		seg.setInputCloud(cloudXYZ);
    		seg.segment(*inliersIndices, *coefficients);
    		if (inliersIndices->indices.size() == 0)//没有提取出点
    		{
    			break;
    		}
    		pcl::PointCloud<pcl::PointXYZ>::Ptr  cloud_inliers(new pcl::PointCloud<pcl::PointXYZ>);
    		pcl::PointCloud<pcl::PointXYZ>::Ptr  cloud_outliers(new pcl::PointCloud<pcl::PointXYZ>);
    		pcl::ExtractIndices<pcl::PointXYZ> extract; //创建点云提取对象
    		extract.setInputCloud(cloudXYZ);//设置输入点云
    		extract.setIndices(inliersIndices);
    		extract.setNegative(false); //设置提取内点而非外点
    		extract.filter(*cloud_inliers);//提取输出存储到cloud_inliers
    		extract.setNegative(true);//提取外点
    		extract.filter(*cloud_outliers);
    		*cloudXYZ = *cloud_outliers;
    		out_plane_vect.push_back(cloud_inliers);
    	}
    	if (out_plane_vect.size() == 0)
    	{
    		return -1;
    	}
    	return 0;
    }
    

    调用如下

    
    int main()
    {
    	std::string filename_ = "bunny.pcd";
    
    	pcl::console::TicToc timecal;
    	timecal.tic();
    	pcl::PointCloud<pcl::PointXYZ>::Ptr model(new pcl::PointCloud<pcl::PointXYZ>());
    	if (pcl::io::loadPCDFile(filename_, *model) < 0)
    	{
    		std::cout << "Error loading model cloud." << std::endl;
    		return (-1);
    	}
    	std::cout << "加载点云成功.耗时:" << timecal.toc() << "ms" << std::endl;
    	//速度慢降采样
    	pcl::VoxelGrid<pcl::PointXYZ> vg;
    	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
    	vg.setInputCloud(model);
    	vg.setLeafSize(0.005f, 0.005f, 0.005f);
    	vg.filter(*cloud_filtered);
    
    	timecal.tic();
    	std::cout << "开始提取平面" << std::endl;
    	std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> outPlaneVect;
    	g_multPlaneSeg(cloud_filtered, 10000, 0.02, 0.2, outPlaneVect);
    	std::cout << "结束提取平面" << std::endl;
    	std::cout << "提取平面个数:" << outPlaneVect.size() <<"。耗时:"<< timecal.toc() << "ms" << std::endl;
    
    
    	// visualization
    	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("Viewer"));
    	pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_color(new pcl::PointCloud<pcl::PointXYZRGB>());
    	srand(time(nullptr));
    	std::vector<unsigned char> color;
    	for (size_t i = 0; i < outPlaneVect.size(); i++)
    	{
    		color.push_back(static_cast<unsigned char>(rand() % 256));
    		color.push_back(static_cast<unsigned char>(rand() % 256));
    		color.push_back(static_cast<unsigned char>(rand() % 256));
    	}
    	int color_index(0);
    	for (size_t i = 0; i < outPlaneVect.size(); i++)
    	{
    		for (size_t j = 0; j < outPlaneVect[i]->points.size(); j++)
    		{
    			if (pcl_isnan(outPlaneVect[i]->points[j].x))
    			{
    				continue;
    			}
    			pcl::PointXYZRGB n_points;
    			n_points.x = outPlaneVect[i]->points[j].x;
    			n_points.y = outPlaneVect[i]->points[j].y;
    			n_points.z = outPlaneVect[i]->points[j].z;
    			n_points.r = color[3 * color_index];
    			n_points.g = color[3 * color_index + 1];
    			n_points.b = color[3 * color_index + 2];
    			cloud_color->push_back(n_points);
    		}
    		color_index++;
    	}
    	viewer->addPointCloud(cloud_color);
    	viewer->spin();
    
    	system("pause");
    	return 0;
    }
    
    展开全文
  • ransac是一种很有效的平面分割方法,根据设定的模型不断迭代找出属于模型的点。同时通过设置距离模型阈值可以起到分割多大地面起伏程度的地面。 3.数据 本例中使用的点云数据(test.pcd)请见百度网盘分享。 链接:...

    1.版本要求

    版本: >PCL1.3

    2.简介

    平面分割可用于地面检测,ransac是一种非常有效的平面分割方法,根据设定的平面模型不断迭代找出属于平面的点。同时通过设定模型距离阈值(setDistanceThreshold)可以检测不同起伏程度的地面。

    3.数据

    本例中使用的点云数据(test.pcd)请见百度网盘分享。
    链接:https://pan.baidu.com/s/1CN3sb1lRylfvT67PnRdKiw
    提取码:kz7q

    4.代码

    #include <pcl/point_types.h>
    #include <pcl/io/pcd_io.h>
    #include <pcl/filters/extract_indices.h>
    #include <pcl/segmentation/sac_segmentation.h>
    #include <pcl/visualization/cloud_viewer.h>
    
    int main(int argc, char** argv)
    {
    	pcl::PCDReader reader;
    	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_plane(new pcl::PointCloud<pcl::PointXYZ>);
    	reader.read("test.pcd", *cloud);  //读取点云
    	
    	pcl::PointIndices::Ptr inliers(new pcl::PointIndices);  //创建平面分割后存储平面点云的索引
    
    	pcl::SACSegmentation<pcl::PointXYZ> seg;  //创建sac分割对象
    	pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
    	seg.setOptimizeCoefficients(true);
    	seg.setModelType(pcl::SACMODEL_PLANE);  //设置模型为平面
    	seg.setMethodType(pcl::SAC_RANSAC);  //设置分割方法为ransac
    	seg.setMaxIterations(100);  //设置最大迭代次数
    	seg.setDistanceThreshold(0.15);  //设置偏离模型距离阈值
    	seg.setInputCloud(cloud);
    	seg.segment(*inliers, *coefficients);  
    
    	if (inliers->indices.size() == 0)  //检查一下是否有平面分割出来
    	{
    		std::cout << "Could not estimate a planar model for the given dataset." << std::endl;
    	}
    
    	pcl::ExtractIndices<pcl::PointXYZ> extract;  //抽取分割得到的平面点云
    	extract.setInputCloud(cloud);
    	extract.setIndices(inliers);
    	extract.setNegative(false);
    	extract.filter(*cloud_plane);
    	std::cout << "PointCloud representing the planar component: " << cloud_plane->size() << " data points." << std::endl;
    
    
    	pcl::visualization::PCLVisualizer viewer("Cloud Viewer");
    	int v1(0);  //创建左窗口显示原始点云
    	viewer.createViewPort(0, 0, 0.5, 1.0, v1);  //左右窗口大小划分,1:1
    	viewer.setBackgroundColor(0, 0, 0, v1);
    	viewer.addText("Cloud Original", 2, 2, "Cloud Original", v1);  //窗口下的标题
    	pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> rgb1(cloud, "z");
    	viewer.addPointCloud<pcl::PointXYZ>(cloud, rgb1, "original cloud", v1);
    	viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "original cloud", v1);
    	viewer.addCoordinateSystem(1.0, "original cloud", v1);
    	int v2(1);  //创建右窗口显示分割后的平面
    	viewer.createViewPort(0.5, 0, 1.0, 1.0, v2);  //左右窗口大小划分,1:1
    	viewer.setBackgroundColor(0, 0, 0, v2);
    	viewer.addText("Cloud Segmentation", 2, 2, "Cloud Segmentation", v2);  //窗口下的标题
    	pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> rgb2(cloud_plane, "z");
    	viewer.addPointCloud<pcl::PointXYZ>(cloud_plane, rgb2, "plane cloud", v2);
    	viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "plane cloud", v2);
    	viewer.addCoordinateSystem(1.0, "plane cloud", v2);
    
    	viewer.spin();
    
    	return (0);
    }
    

    5.效果

    在这里插入图片描述

    展开全文
  • PCL 点云平面分割总结

    2021-01-28 14:11:25
    首先要引入关于平面分割的头文件 #include <pcl/ModeCoefficients.h> //模型系数相关头文件 #include<pcl/sample_consensus/method_types.h> //模型定义头文件 #include<pcl/sample_consensus/...
  • 数学题(平面分割问题)HDU 2050-折线分割平面 题目链接:折线分割平面 基础: 直线分割平面:数学题(分割平面问题)-UVA 10079-Pizza Cutting 思路: 已知:直线分割问题,假设现在已经切n-1次,那么...
  • 蓝桥杯--平面分割

    2021-04-15 20:25:38
    题目描述: 20 个圆和 2020 条直线最多能把平面分成多少个部分? #include<iostream> #include<cstring> #include<...//第一个圆将平面分割为2部分 //接下来的圆都必须两两相交才能使得分
  • pcl关于平面分割

    2019-10-17 10:12:34
    pcl 关于平面分割 做一个记录,方便日后学习 http://pointclouds.org/documentation/tutorials/planar_segmentation.php#planar-segmentation ...
  • 牛客网平面分割问题

    2020-12-21 10:41:57
    #牛客网平面分割问题 题目:设有N条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何三条封闭曲线不相交于同一点,问这些封闭曲线把平面分割成的区域个数。 解: 分析:这是以交点个数来计算的分割...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,233
精华内容 1,293
关键字:

平面分割