天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 31|回复: 0

实现计算凸包的函数c++-ok

[复制链接]
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

    积分
    1308
    QQ
    发表于 2024-10-5 18:56:28 | 显示全部楼层 |阅读模式

    为了实现计算凸包的函数,我们需要确保 cross 函数和比较函数 cmp 都已经定义好。这里我们使用 AcGePoint2d 类型,它是 AutoCAD ObjectARX 库中的一个点类,包含 x 和 y 坐标。

    首先,我们需要定义 cross 函数来计算两个向量的叉积。然后,我们需要一个比较函数 cmp 来按照字典序对点进行排序(即先按 x 坐标升序排列,如果 x 相同,则按 y 坐标升序排列)。

    1. #include <vector>
    2. #include <algorithm>
    3. #include <acge.h> // 包含 AcGePoint2d 的头文件

    4. // 比较函数,用于按字典序排序
    5. bool cmp(const AcGePoint2d& p1, const AcGePoint2d& p2) {
    6.     return (p1.x() < p2.x()) || (p1.x() == p2.x() && p1.y() < p2.y());
    7. }

    8. // 计算两个向量的叉积
    9. double cross(const AcGePoint2d& O, const AcGePoint2d& A, const AcGePoint2d& B) {
    10.     return (A.x() - O.x()) * (B.y() - O.y()) - (A.y() - O.y()) * (B.x() - O.x());
    11. }

    12. // 计算凸包
    13. std::vector<AcGePoint2d> convexhull(const std::vector<AcGePoint2d>& points) {
    14.     std::vector<AcGePoint2d> result;
    15.    
    16.     if (points.size() < 3)
    17.         return result;
    18.    
    19.     std::vector<AcGePoint2d> tmp_points = points;
    20.     // 首先将所有点按照字典序排序
    21.     std::sort(tmp_points.begin(), tmp_points.end(), cmp);
    22.    
    23.     // 上凸包
    24.     for (const auto& point : tmp_points) {
    25.         while (result.size() > 1 && cross(result[result.size()-2], result.back(), point) <= 0) {
    26.             result.pop_back();
    27.         }
    28.         result.push_back(point);
    29.     }
    30.    
    31.     // 下凸包
    32.     int t = result.size() + 1; // 注意这里的+1是为了区分上下凸包
    33.     for (int i = tmp_points.size() - 2; i >= 0; --i) {
    34.         while (result.size() > t && cross(result[result.size()-2], result.back(), tmp_points[i]) <= 0) {
    35.             result.pop_back();
    36.         }
    37.         result.push_back(tmp_points[i]);
    38.     }
    39.    
    40.     // 删除最后一个重复点
    41.     result.pop_back();
    42.    
    43.     return result;
    44. }
    复制代码

     

     

     

     

    实现计算凸包的函数c++-ok
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-11-1 09:26 , Processed in 0.161330 second(s), 24 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表