最小外接矩形思路以及实现

56 篇文章 3 订阅

最小外接矩形

外接矩形计算

对一个凸多边形进行外接矩形计算,需要知道当前面的最大xy 和最小xy值,即可获得外接矩形

在这里插入图片描述

最小外接矩形计算

对凸多边形的每一条边都绘制一个外接矩形求最小面积。下图展示了计算流程

在这里插入图片描述


计算流程

  1. 旋转基础算法实现

    • 旋转点基础
     /**
         * 旋转点
         *
         * @param point 被旋转的点
         * @param center 旋转中心
         * @param angle 角度
         * @return 旋转后坐标
         */
        public static Coordinate get(Coordinate point, Coordinate center
  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
旋转卡壳(Rotating Calipers)算法用于求解凸包的最小外接矩形(Minimum Bounding Rectangle)。下面是C++实现代码,带有注释说明: ```cpp #include <bits/stdc++.h> using namespace std; const int N = 100010; // 点数的最大值 struct Point { double x, y; Point() {} Point(double x, double y) : x(x), y(y) {} Point operator - (const Point& p) const { return Point(x - p.x, y - p.y); } }; int n; // 输入点数 Point p[N]; // 输入点 // 计算叉积 (P1-P0)x(P2-P0) double cross(const Point& p1, const Point& p2, const Point& p0) { return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y); } // 计算距离的平方 double dis2(const Point& A, const Point& B) { return (A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y); } // 旋转卡壳 double rotating_calipers(Point* p, int n) { double ans = 1e18; // 最小面积 int j = 2; // 第二个点 for (int i = 1; i <= n; i++) { // 以 p[i] 为起点,旋转卡壳 while (cross(p[i + 1], p[j + 1], p[i]) > cross(p[i + 1], p[j], p[i])) { j = j % n + 1; // 旋转 } ans = min(ans, dis2(p[i], p[j])); // 更新答案 } return ans; } int main() { cin >> n; for (int i = 1; i <= n; i++) { cin >> p[i].x >> p[i].y; } sort(p + 1, p + n + 1, [](Point a, Point b) { if (a.x != b.x) return a.x < b.x; return a.y < b.y; }); // 按 x 从小到大排序 double ans = rotating_calipers(p, n); printf("%.2lf\n", sqrt(ans)); // 输出最小面积的平方根 return 0; } ``` 注释中已经详细解释了每一段代码的含义,这里再简单介绍一下旋转卡壳的思路: 1. 将所有点按 x 坐标从小到大排序,取最左边的点 p1; 2. 以 p1 为起点,找到与其构成的向量中,与 y 轴平行的向量(即最上方的向量); 3. 以这个向量的终点作为起点,继续找到与其构成的向量中,与 x 轴平行的向量(即最右边的向量); 4. 以这个向量的终点作为起点,继续找到与其构成的向量中,与 y 轴相反的向量(即最下方的向量); 5. 以这个向量的终点作为起点,继续找到与其构成的向量中,与 x 轴相反的向量(即最左边的向量); 6. 回到起点 p1,以此为起点,继续以上的操作,直到找到最小的外接矩形。 其中,每次找到一个向量,可以通过计算叉积的符号来判断向量是否满足要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值