几何算法系列-三维凸包

1.前言

凸包是基础几何算法工具函数,一些场景需要计算并显示凸包,或使用凸包以加速计算。计算三维凸包有多种方法,如增量构建、分治法等,博主采用增量构建方法计算凸包。

有关二维凸包的计算请参考博主此前文章(已经是5年多以前的文章了,时光荏苒......)

[凸包计算]求解点集合的凸包轮廓-CSDN博客文章浏览阅读1.8k次。前提:约定1----平面上两向量基于平面法向的夹角为[0-2π);约定2----下文中路径为有向的;约定3----下文中法向Normal由屏幕内指向屏幕外;当然上述约定并不是绝对的,只是为了表述原理方便,或者说化繁为简而设的条件,当然你可以约定Normal为指向屏幕内,这也是可以的,原理是不变的。根据右手定则,Vector1基于Normal与Vector2夹角如图1为锐角,..._点集合的凸包轮廓https://blog.csdn.net/baidu_38621657/article/details/88069552

2.内容

三维凸包有如下几个重要性质:

  1. 都是凸角点,没有凹角,也没有平角(顶点处于平面上时所形成的角点);
  2. 凸包上的任何面均为凸轮廓;
  3. 凸包对任意方向的投影均为凸轮廓;

上述性质在计算凸包时会用到,

采用增量法构建三维凸包的思路是递推法,

输入为点集lstVerts;

  1. 初始化:构建第一个有效面,通常为三角面,从点集中选取不共线的3个点构建三角面;初始化失败,则返回false;初始化成功则继续;
  2. 遍历点集中的点ptTarget,尝试构建第一个实体,为三棱锥或N棱锥;
    1. )如果ptTarget与此前三角面共面,则,求二维凸包,并更新为此前面;
    2. )如果ptTarget与此前面不共面,则构建第一个棱锥实体;
  3. 继续遍历点集得到ptTarget,用ptTarget去更新此前得到的凸包实体,得到新的凸包实体;
    1. )凸包实体中的一些面对ptTarget是可见的,对于可见面求其外围闭合边缘(见下图),闭合边缘上的每一条边与ptTarget构造三角形,加入到凸包实体中;
      1. ]注意可见面分为两种类型:“完全可见面” 和 “边缘可见面”,对于后者,点与其共面,需要求(ptTarget和当前面的)二维凸包并构造新的面加入到当前凸包实体中;
    2. )将所有可见面从凸包实体中删除;
    3. )不可见面则不动;
  4. 得到凸包实体3DConvexHull;算法结束;

3.代码

bool GeometryUtils::Cal3DConvexHull(const list<Vector3f>& lstVertex, Body& convexHull)
{
    //  增量构建
    Face first;
    if (!ConstructFirstFace(lstVertex, first))
        return false;

    convexHull.lstFace.push_back(first);

    //++itrItem;
    auto itrItem = lstVertex.begin();
    for (;itrItem != lstVertex.end(); ++itrItem)
    {
        UpdateConvexHull(*itrItem, convexHull);
    }
}

4.效果

图:效果概览

 

 

图:效果概览

 

5.写在后面

图形几何、数据处理、并行计算相关研究和研发,公众号:geometrylib,欢迎交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈市雪花

谢谢啦,欢迎关注wx公众号

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值