天气与日历 切换到窄版

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

将凸包多边形a优化为外接四边形b

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-5-21 09:44:37 | 显示全部楼层 |阅读模式
要将凸包多边形a优化为外接四边形b,需要找到a的四个顶点,也就是距离凸包中心最远的点。具体实现可以采用旋转卡壳算法,该算法的主要思想是在凸包上选择一条边,然后将其与凸包上的其它边依次进行配对,以此得到凸包上任意两个点间的距离,并找到距离最大的两个点。这样就可以得到一个外接矩形,其四个顶点就是凸包中距离最远的四个点。
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cmath>
  4. using namespace std;
  5. struct Point{
  6.     double x, y;
  7. };
  8. double cross(Point a, Point b, Point c){
  9.     return (b.x-a.x)*(c.y-a.y) - (b.y-a.y)*(c.x-a.x);
  10. }
  11. double dist(Point a, Point b){
  12.     return sqrt((b.x-a.x)*(b.x-a.x) + (b.y-a.y)*(b.y-a.y));
  13. }
  14. void rotating采用calipers(Point p[], int n, Point res[]){
  15.     int j = 1, k = 1;
  16.     for(int i=0; i<n; i++){
  17.         while(cross(p[i], p[(i+1)%n], p[j]) > cross(p[i], p[(i+1)%n], p[(j+1)%n])){
  18.             j = (j+1)%n;
  19.         }
  20.         while(dist(p[i], p[k]) < dist(p[i], p[(k+1)%n])){
  21.             k = (k+1)%n;
  22.         }
  23.         if(i==0) res = p[i];
  24.         if(i==n-1) res = p[i];
  25.         if(dist(p[i], p[j]) > dist(res, res)){
  26.             res = p[i];
  27.             res = p[j];
  28.         }
  29.         if(cross(p[(i+1)%n], p[i], p[k]) > cross(p[(i+1)%n], p[i], p[(k+1)%n])){
  30.             while(cross(p[(i+1)%n], p[i], p[k]) > cross(p[(i+1)%n], p[i], p[(k+1)%n])){
  31.                 k = (k+1)%n;
  32.             }
  33.             if(dist(p[i], p[k]) > dist(res, res)){
  34.                 res = p[k];
  35.             }
  36.             if(dist(p[j], p[(k+1)%n]) > dist(res, res)){
  37.                 res = p[(k+1)%n];
  38.             }
  39.         }
  40.         else{
  41.             while(cross(p[(i+1)%n], p[i], p[j]) < cross(p[(i+1)%n], p[i], p[(j+1)%n])){
  42.                 j = (j+1)%n;
  43.             }
  44.             if(dist(p[j], p[i]) > dist(res, res)){
  45.                 res = p[j];
  46.             }
  47.             if(dist(p[k], p[(j+1)%n]) > dist(res, res)){
  48.                 res = p[(j+1)%n];
  49.             }
  50.         }
  51.     }
  52. }
  53. int main(){
  54.     int n;
  55.     cin >> n;
  56.     Point* p = new Point[n];
  57.     for(int i=0; i<n; i++){
  58.         cin >> p[i].x >> p[i].y;
  59.     }
  60.     sort(p, p+n, [](Point a, Point b){
  61.         return a.x < b.x || (a.x==b.x && a.y < b.y);
  62.     });
  63.     Point* res = new Point;
  64.     rotating采用calipers(p, n, res);
  65.     cout << "The four vertices of the optimized rectangle are: " << endl;
  66.     for(int i=0; i<4; i++){
  67.         cout << "(" << res[i].x << ", " << res[i].y << ")" << endl;
  68.     }
  69.     delete[] p;
  70.     delete[] res;
  71.     return 0;
  72. }
复制代码

 

 

 

 

将凸包多边形a优化为外接四边形b
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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