求点集的最小面积外接矩形

本文介绍了一种求解点集最小面积外接矩形的算法,通过旋转坐标系并遍历所有可能的角度来寻找最紧凑的包围矩形。算法首先定义了一个旋转函数,用于将点绕原点旋转特定角度,然后通过遍历0到90度的所有角度,计算每个角度下包围所有点的矩形面积,并保留最小面积及其对应的矩形尺寸。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求点集的最小面积外接矩形

void Rotate(float& x, float& y, float angle) {
  float a = x * cos(angle) - y * sin(angle);
  float b = x * sin(angle) + y * cos(angle);
  x = a;
  y = b;
}

void Rect(const vector<float>& x,
          const vector<float>& y,
          float& length,
          float& width) {
  float area = 1024;
  int size = x.size();
  // rotate 0~90 degree
  for (int i = 0; i < 91; ++i) {
    float tmpx = x[0], tmpy = y[0];
    Rotate(tmpx, tmpy, i);
    float xl = tmpx, xr = tmpx, yt = tmpy, yb = tmpy;
    // traverse all points
    for (int j = 1; j < size; ++j) {
      tmpx = x[j];
      tmpy = y[j];
      Rotate(tmpx, tmpy, i);
      if (tmpx < xl)
        xl = tmpx;
      if (tmpx > xr)
        xr = tmpx;
      if (tmpy < yb)
        yb = tmpy;
      if (tmpy > yt)
        yt = tmpy;
    }
    float xx = xr - xl, yy = yt - yb;
    if (area > xx * yy) {
      area = xx * yy;
      length = xx;
      width = yy;
    }
  }
  //
  if (length < width) {
    float tmp = length;
    length = width;
    width = tmp;
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刀么克瑟拉莫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值