天气与日历 切换到窄版

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

凸多边形最小面积矩形四边形包围盒

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-5-21 22:13:25 | 显示全部楼层 |阅读模式
  1. #include <vector>
  2. #include <utility>
  3. #include <cmath>
  4. // 点的结构体定义
  5. struct Point {
  6.     double x, y;
  7.     Point(double x = 0, double y = 0) : x(x), y(y) {}
  8. };
  9. // 向量的运算
  10. Point operator-(const Point& a, const Point& b) {
  11.     return Point(a.x - b.x, a.y - b.y);
  12. }
  13. double cross(const Point& a, const Point& b) {
  14.     return a.x * b.y - a.y * b.x;
  15. }
  16. // 多边形的Graham扫描算法求解凸包
  17. std::vector<Point> convexHull(const std::vector<Point>& points) {
  18.     if (points.size() <= 3) return points;
  19.     std::vector<Point> hull;
  20.     // 以x坐标排序,x坐标相同则按y坐标排序
  21.     std::vector<Point> sorted = points;
  22.     std::sort(sorted.begin() + 1, sorted.end(), [](const Point& a, const Point& b) {
  23.         return a.x < b.x || (a.x == b.x && a.y < b.y);
  24.     });
  25.     // 初始化栈
  26.     std::vector<std::pair<Point, int>> stack;
  27.     stack.push采用back({sorted[0], 1});
  28.     stack.push采用back({sorted[1], 1});
  29.     for (int i = 2; i < sorted.size(); ++i) {
  30.         while (stack.size() > 1 && cross(stack.rbegin()[1].first - stack.rbegin()[1].first, sorted[i] - stack.rbegin()[1].first) <= 0) {
  31.             stack.pop采用back();
  32.         }
  33.         stack.push采用back({sorted[i], 1});
  34.     }
  35.     // 将栈中的点加入凸包
  36.     for (int i = stack.size() - 1; i >= 0; --i) {
  37.         hull.push采用back(stack[i].first);
  38.     }
  39.     return hull;
  40. }
  41. // 最小面积四边形的求解
  42. double minAreaRect(const std::vector<Point>& points) {
  43.     if (points.size() < 3) return 0.0; // 至少需要三个点
  44.     std::vector<Point> convexHullPoints = convexHull(points);
  45.     double minArea = std::numeric采用limits<double>::max();
  46.     for (size采用t i = 0; i < convexHullPoints.size(); ++i) {
  47.         for (size采用t j = i + 1; j < convexHullPoints.size(); ++j) {
  48.             Point v = convexHullPoints[j] - convexHullPoints[i];
  49.             for (size采用t k = 0; k < convexHullPoints.size(); ++k) {
  50.                 Point u = convexHullPoints[k] - convexHullPoints[i];
  51.                 Point w = Point(v.y, -v.x); // 计算垂直向量
  52.                 if (cross(u, w) == 0.0) continue; // 不在同一侧,跳过
  53.                 double t = cross(u, convexHullPoints[j] - convexHullPoints[i]) / cross(u, w);
  54.                 Point p = Point(convexHullPoints[i].x + u.x * t, convexHullPoints[i].y + u.y * t);
  55.                 double area = std::abs(cross(convexHullPoints[i], p) / 2.0);
  56.                 minArea = std::min(minArea, area);
  57.             }
  58.         }
  59.     }
  60.     return minArea == std::numeric采用limits<double>::max() ? 0.0 : minArea;
  61. }
  62. // 主函数示例
  63. int main() {
  64.     std::vector<Point> points = {{0, 0}, {0, 2}, {2, 0}, {2, 2}}; // 例子中的点集
  65.     double minArea = minAreaRect(points);
复制代码

 

 

 

 

凸多边形最小面积矩形四边形包围盒
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-5 12:29 , Processed in 0.135784 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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