平面凸多边形和空间凸包络体算法整理

最近毕设项目中用到了最大包络体求算算法,在这里进行简单的整理,为了以后更好的理解。

准备知识

  • 关于点的定义
//空间上任何一个点信息
struct Point {
   
   
	double x, y, z;
	Point(){
   
   } 
	Point(double xx,double yy,double zz):x(xx),y(yy),z(zz){
   
   }
	
	//两向量之差  
    Point operator -(const Point p1)  
    {
   
     
        return Point(x-p1.x,y-p1.y,z-p1.z);  
    } 

	//两向量之和  
    Point operator +(const Point p1)  
    {
   
     
        return Point(x+p1.x,y+p1.y,z+p1.z);  
    }  

    //叉乘  
    Point operator *(const Point p)  
    {
   
     
        return Point(y*p.z-z*p.y,z*p.x-x*p.z,x*p.y-y*p.x);  
    } 
     
	// 数乘
    Point operator *(double d)  
    {
   
     
        return Point(x*d,y*d,z*d);  
    }  

	// 数除
    Point operator / (double d)  
    {
   
     
        return Point(x/d,y/d,z/d);  
    }  

    //点乘  
    double  operator ^(Point p)  
    {
   
     
        return (x*p.x+y*p.y+z*p.z);  
    } 
};


平面凸多边形求算算法

给一系列处于同一平面的空间点,然后求出所有只在最外凸多边形上的所有点集;其实为实现该目标有多种具体的算法, 笔者将通过代码具体实现的方式将其中一种具体实现。

  • 算法步骤
    在这里插入图片描述
  • 代码实现
/*求平面内的最大包络多边形
参数解释:平面内所有点信息,用于存储多边形上下两半的二维数组,平面的法向量
*/
void dealWith(vector<Point> &allPoints, vector<Point> polygon[2], Point n1) {
   
   
	if(allPoints.size() < 2) return;
	Point a, b; //最小和最大两个极端顶点;
	a.x = allPoints[0].x;
	a.y = allPoints[0].y;
	a.z = allPoints[0].z;
	b.x = allPoints[0].x;
	b.y = allPoints[0].y;
	b.z = allPoints[0].z;
	for(int i=1; i<allPoints.size(); i++) {
   
   
		if(a.x - allPoints[i].x > eps) {
   
   
			a.x = allPoints[i].x;
			a.y = allPoints[i].y;
			a.z = allPoints[i].z;
		} else if(fabs(a.x - allPoints[i].x) < eps) {
   
   
			if(a.y - allPoints[i].y > eps) {
   
   
				a.x = allPoints[i].x;
				a.y = allPoints[i].y;
				a.z = allPoints[i].z;
			} else if(fabs(a.y - allPoints[i].y) < eps) {
   
   
				if(a.z - allPoints[i].z > eps) {
   
   
					a.x = allPoints[i].x;
					a.y = allPoints[i].y;
					a.z = allPoints[i].z;
				} 
			}
		}

		if(allPoints[i].x - b.x > eps) {
   
   
			b.x = allPoints[i].x;
			b.y = allPoints[i].y;
			b.z = allPoints[i].z;
		} else if(fabs(b.x - allPoints[i].x) < eps) {
   
   
			if(allPoints[i].y - b.y > eps) {
   
   
				b.x = allPoints[i].x;
				b.y = allPoints[i].y;
				b.z = allPoints[i].z;
			} else if(fabs(b.y - allPoints[i].y) < eps) {
   
   
				if(allPoints[i].z - b.z > eps) {
   
   
					b.x = allPoints[i].x;
					b.y = allPoints[i].y;
					b.z = allPoints[i].z;
				} 
			}
		}
	}

	if (fabs(a.x - b.x) + fabs(a.y - b.y) + fabs(a.z - b.z) < eps) {
   
   
		polygon[0].push_back(a);
		printf("两极值点相距过近,返回了直接");
		return;
	}

	polygon[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值