找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 33|回复: 0

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

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 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. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-27 07:04 , Processed in 0.109459 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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