缩小矩形后的坐标点

缩小一个矩形后的坐标点

在一个坐标系中给出一个矩形的四个顶点坐标,求将这个矩形缩小一定范围后的坐标。
矩形要求:四个定点按顺时针或者逆时针排列P0,P1,P2,P3。

具体操作步骤

1、旋转

以P0为旋转点,以P0指向P1向量的角度为旋转角度旋转,角度为atan((P1.y-P0.y),(P1.x-P0.x))
注:逆时针旋转乘上正角度,顺时针旋转乘上负角度值。
旋转后的点计做:R_P0,R_P1,R_P2,R_P3.

2、计算旋转后缩小后的坐标

根据P0指向P2向量角度的正负分两种情况计算。在R_P0,R_P1,R_P2,R_P3的坐标值直接相加减即可。

3、反向旋转

将R_P0,R_P1,R_P2,R_P3反向旋转回来即可。

代码实现

void shrinkPolygon(geometry_msgs::Polygon &out, double shrink_meter)
{
  const geometry_msgs::Polygon in = out;
  geometry_msgs::Polygon rotate_polygon;
  rotate_polygon.points.resize(4);
  geometry_msgs::Polygon rotate_shrink_polygon;
  rotate_shrink_polygon.points.resize(4);

  geometry_msgs::Point32 tem_point32;
  geometry_msgs::Point32 rotate_point = in.points[0];
  double theta = atan2((in.points[1].y - in.points[0].y),(in.points[1].x - in.points[0].x))*(-1.0);
  for(size_t i = 0;i < 4;i++)
  {
    tem_point32 = in.points[i];
    rotate_polygon.points[i].x = (tem_point32.x-rotate_point.x)*cos(theta) - (tem_point32.y-rotate_point.y)*sin(theta) + rotate_point.x;
    rotate_polygon.points[i].y = (tem_point32.x-rotate_point.x)*sin(theta) + (tem_point32.y-rotate_point.y)*cos(theta) + rotate_point.y;
  }

  double theta_p02 = atan2((rotate_polygon.points[2].y - rotate_polygon.points[0].y),(rotate_polygon.points[2].x - rotate_polygon.points[0].x));

  if(theta_p02>0)
  {
    rotate_shrink_polygon.points[0].x = rotate_polygon.points[0].x + shrink_meter;
    rotate_shrink_polygon.points[0].y = rotate_polygon.points[0].y + shrink_meter;

    rotate_shrink_polygon.points[1].x = rotate_polygon.points[1].x - shrink_meter;
    rotate_shrink_polygon.points[1].y = rotate_polygon.points[1].y + shrink_meter;

    rotate_shrink_polygon.points[2].x = rotate_polygon.points[2].x - shrink_meter;
    rotate_shrink_polygon.points[2].y = rotate_polygon.points[2].y - shrink_meter;

    rotate_shrink_polygon.points[3].x = rotate_polygon.points[3].x + shrink_meter;
    rotate_shrink_polygon.points[3].y = rotate_polygon.points[3].y - shrink_meter;
  }
  else
  {
    rotate_shrink_polygon.points[0].x = rotate_polygon.points[0].x + shrink_meter;
    rotate_shrink_polygon.points[0].y = rotate_polygon.points[0].y - shrink_meter;

    rotate_shrink_polygon.points[1].x = rotate_polygon.points[1].x - shrink_meter;
    rotate_shrink_polygon.points[1].y = rotate_polygon.points[1].y - shrink_meter;

    rotate_shrink_polygon.points[2].x = rotate_polygon.points[2].x - shrink_meter;
    rotate_shrink_polygon.points[2].y = rotate_polygon.points[2].y + shrink_meter;

    rotate_shrink_polygon.points[3].x = rotate_polygon.points[3].x + shrink_meter;
    rotate_shrink_polygon.points[3].y = rotate_polygon.points[3].y + shrink_meter;
  }

  for (size_t i = 0; i < 4; i++)
  {
    tem_point32 = rotate_shrink_polygon.points[i];
    out.points[i].x = (tem_point32.x-rotate_point.x)*cos(-theta) - (tem_point32.y-rotate_point.y)*sin(-theta) + rotate_point.x;
    out.points[i].y = (tem_point32.x-rotate_point.x)*sin(-theta) + (tem_point32.y-rotate_point.y)*cos(-theta) + rotate_point.y;
  }
}

out.points包含矩形的四个顶点坐标,shrink_meter为缩小多少米。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值