已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)

这篇具有很好参考价值的文章主要介绍了已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

理论基础

本次实现有几个前提:

  • 已知的信息如下形式:[x_center, y_center, w, h, angle],其中默认 w w w是矩形最长的边,即 w > h w > h w>h
  • 已知的旋转角度 θ \theta θ是矩形的最长边 w w w相对于 x x x坐标轴的旋转角度
  • 旋转角度 θ \theta θ的旋转区间在 [ 0 , π ] [0, \pi] [0,π]

可以将情况分为两种,即 θ ∈ [ 0 , π / 2 ] \theta \in [0, \pi/2] θ[0,π/2] θ ∈ [ π / 2 , π ] \theta \in [\pi/2, \pi] θ[π/2,π]

情况一: θ ∈ [ 0 , π / 2 ] \theta \in [0, \pi/2] θ∈[0,π/2]

先看第一种情况 θ ∈ [ 0 , π / 2 ] \theta \in [0, \pi/2] θ[0,π/2]
已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)
已知矩形的中心点 ( x , y ) (x, y) (x,y),旋转角度 θ \theta θ在图中用橙色标注。

先来求 ( x 1 , y 1 ) (x_1,y_1) (x1,y1),用到图中绿色的辅助线,用到的三角形都标注了角 θ \theta θ

  • x 1 = x + c o s θ ∗ w / 2 − s i n θ ∗ h / 2 x_1=x+cos\theta*w/2-sin\theta*h/2 x1=x+cosθw/2sinθh/2
  • y 1 = y + s i n θ ∗ w / 2 + c o s θ ∗ h / 2 y_1=y+sin\theta*w/2+cos\theta*h/2 y1=y+sinθw/2+cosθh/2

再来求 ( x 2 , y 2 ) (x_2,y_2) (x2,y2),用到图中紫色的辅助线:

  • x 2 = x + c o s θ ∗ w / 2 + s i n θ ∗ h / 2 x_2=x+cos\theta*w/2+sin\theta*h/2 x2=x+cosθw/2+sinθh/2
  • y 2 = y + s i n θ ∗ w / 2 − c o s θ ∗ h / 2 y_2=y+sin\theta*w/2-cos\theta*h/2 y2=y+sinθw/2cosθh/2

接下来的 ( x 3 , y 3 ) (x_3,y_3) (x3,y3) ( x 4 , y 4 ) (x_4,y_4) (x4,y4)就是 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) ( x 2 , y 2 ) (x_2,y_2) (x2,y2)关于 ( x , y ) (x, y) (x,y)的对称点,只需要将正项变为负项,负项变为正项即可:

  • x 3 = x − c o s θ ∗ w / 2 + s i n θ ∗ h / 2 x_3=x-cos\theta*w/2+sin\theta*h/2 x3=xcosθw/2+sinθh/2
  • y 3 = y − s i n θ ∗ w / 2 − c o s θ ∗ h / 2 y_3=y-sin\theta*w/2-cos\theta*h/2 y3=ysinθw/2cosθh/2
  • x 4 = x − c o s θ ∗ w / 2 − s i n θ ∗ h / 2 x_4=x-cos\theta*w/2-sin\theta*h/2 x4=xcosθw/2sinθh/2
  • y 4 = y − s i n θ ∗ w / 2 + c o s θ ∗ h / 2 y_4=y-sin\theta*w/2+cos\theta*h/2 y4=ysinθw/2+cosθh/2

情况二: θ ∈ [ π / 2 , π ] \theta \in [ \pi/2,\pi] θ∈[π/2,π]

已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)
同理,此时旋转角度 θ \theta θ大于 π / 2 \pi/2 π/2,所以用到的辅助三角形的角度标注为 π − θ \pi -\theta πθ

先来求 ( x 1 , y 1 ) (x_1,y_1) (x1,y1),用到图中绿色的辅助线,用到的三角形都标注了角 π − θ \pi -\theta πθ

  • x 1 = x − c o s ( π − θ ) ∗ w / 2 + s i n ( π − θ ) ∗ h / 2 = x + c o s θ ∗ w / 2 + s i n θ ∗ h / 2 x_1=x-cos(\pi-\theta)*w/2+sin(\pi-\theta)*h/2=x+cos\theta*w/2+sin\theta*h/2 x1=xcos(πθ)w/2+sin(πθ)h/2=x+cosθw/2+sinθh/2
  • y 1 = y − s i n ( π − θ ) ∗ w / 2 − c o s ( π − θ ) ∗ h / 2 = y − s i n θ ∗ w / 2 + c o s θ ∗ h / 2 y_1=y-sin(\pi-\theta)*w/2-cos(\pi-\theta)*h/2=y-sin\theta*w/2+cos\theta*h/2 y1=ysin(πθ)w/2cos(πθ)h/2=ysinθw/2+cosθh/2
  • x 2 = x − c o s ( π − θ ) ∗ w / 2 − s i n ( π − θ ) ∗ h / 2 = x + c o s θ ∗ w / 2 − s i n θ ∗ h / 2 x_2=x-cos(\pi-\theta)*w/2-sin(\pi-\theta)*h/2=x+cos\theta*w/2-sin\theta*h/2 x2=xcos(πθ)w/2sin(πθ)h/2=x+cosθw/2sinθh/2
  • y 2 = y + s i n ( π − θ ) ∗ w / 2 − c o s ( π − θ ) ∗ h / 2 = y + s i n θ ∗ w / 2 + c o s θ ∗ h / 2 y_2=y+sin(\pi-\theta)*w/2-cos(\pi-\theta)*h/2=y+sin\theta*w/2+cos\theta*h/2 y2=y+sin(πθ)w/2cos(πθ)h/2=y+sinθw/2+cosθh/2

( x 3 , y 3 ) (x_3,y_3) (x3,y3) ( x 4 , y 4 ) (x_4,y_4) (x4,y4)就是 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) ( x 2 , y 2 ) (x_2,y_2) (x2,y2)关于 ( x , y ) (x, y) (x,y)的对称点。

可以看到两种情况下,得到的四个点的值是一样的,比如情况一里 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)和情况二里 ( x 2 , y 2 ) (x_2,y_2) (x2,y2)一样,所以在代码实现里可以不分情况讨论,不影响最终结果。文章来源地址https://www.toymoban.com/news/detail-447061.html

python代码实现

def get_corners(box):  #这里本人项目yaw [-pi/4, 3*pi/4),需要映射到[0, pi)
    box = box.detach().cpu().numpy()
    x = box[0]
    y = box[1]
    w = box[2]
    l = box[3]
    yaw = box[4]
    if yaw <0: #用来映射
        yaw = yaw + np.pi

    bev_corners = np.zeros((4, 2), dtype=np.float32)
    cos_yaw = np.cos(yaw)
    sin_yaw = np.sin(yaw)
 
    bev_corners[0, 0] = (w / 2) * cos_yaw - (l / 2) * sin_yaw +x
    bev_corners[0, 1] = (w / 2)* sin_yaw + (l / 2) * cos_yaw +y

    bev_corners[1, 0] = (l / 2) * sin_yaw + (w / 2) * cos_yaw +x
    bev_corners[1, 1] = (w / 2)* sin_yaw - (l / 2) * cos_yaw +y

    bev_corners[2, 0] = (-w / 2) * cos_yaw - (-l / 2) * sin_yaw +x
    bev_corners[2, 1] = (-w / 2)* sin_yaw + (-l / 2) * cos_yaw +y

    bev_corners[3, 0] = (-l / 2) * sin_yaw + (-w / 2) * cos_yaw +x
    bev_corners[3, 1] = (-w / 2)* sin_yaw - (-l / 2) * cos_yaw +y

    return bev_corners

到了这里,关于已知中心点、长宽和旋转角度,求矩形的四个顶点坐标(Python)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity shader中获得模型中心点 + 中心点详解

    参考连接: Unity Shader中获取模型中心点的世界坐标_unity获取物体坐标_VirtualCreator的博客-CSDN博客 实际是当前材质球挂接的Renderer的mesh定义的坐标原点,但是有两种情况: 1 Renderer是MeshRender 原点就是当前mesh的坐标原点. 当前body的mesh , 坐标中心就是原点 2 SkinnedMeshRender  是Ro

    2024年02月13日
    浏览(27)
  • PCL圆柱中心轴线提取、中心点提取

    适用于 圆柱中心轴线计算,轴线的端点、中心点计算 附代码完整实现及测试代码。 相关链接: C++ PCL点云圆柱结构提取/立杆结构提取

    2024年02月14日
    浏览(29)
  • unity 获取复杂物体(模型)中心点

    2024年02月02日
    浏览(31)
  • UE4中修改模型的中心点

    在UE4中的模型中心点一般都在模型的中点,如果是门这样的模型,我们就不能绕中心点旋转了,不然会觉得很奇怪。但是默认的静态网格体中心点都在物体中心,那我们怎么办?有两种方法: 1.我们就需要移动物体的中心点 2.在三维建模软件中移动模型中心点 下面我们就讨论

    2023年04月08日
    浏览(43)
  • Unity将模型的世界坐标下的中心点归到模型中心

    效果对比: 调整前: 调整后: 需求:由于建模时的疏忽或者网上找的一些测试模型不规范,会出现导入unity中,模型的世界坐标下的中心点与模型实际的位置差出很多。 注意:物体中心点和父物体中心点的设置代码隐忍而异,看模型结构需求 注意:这里模型的位置必须Re

    2024年02月03日
    浏览(31)
  • uniapp小程序地图设置中心点位置向上偏移

    图示: id=\\\"map\\\" ref=\\\"map\\\"

    2024年02月11日
    浏览(41)
  • WPF中有中心点的slider滑动条

    想要实现的效果 原生滑动条 需要认识一下滑动条的组成 在原生控件中生成“资源字典”对应的样式 然后在track所在的列进行添砖加瓦 由于track在row=\\\"1\\\"的位置,只需要在这个位置上面添加一个Ellipse和Line Ellipse是来描述固定在滑动条上的中心点的位置 line是来描述Thumb从中心点

    2024年02月08日
    浏览(32)
  • vue canvas拖拽,鼠标中心点缩放,标记点位等

    vue实现canvas画布建立图片,坐标建立,可进行拖拽,鼠标中心点位缩放,标记点位等功能 直接上源码 仅供学习使用

    2024年02月17日
    浏览(28)
  • 高德API JS 高德地图获取多个坐标点的中心点

    我需要: 在地图上展示多个地点 地图缩放到合适的大小,要求刚好能显示全部点位 边缘留有一部分间隔。 做成如图所示这样。 经过一下午的研究,弄出来了。 需要以下这些 AMap 的类库: AMap.Bounds() 区域 AMap.LngLat() 点坐标(基础点位) AMap.setBounds() 设置地图区域,这会自动

    2024年02月07日
    浏览(36)
  • Unity中如何修改精灵(Sprite)的中心点(Pivot)位置

    在Unity中,精灵(Sprite)是游戏中最常用的图形资源之一。精灵的中心点(Pivot)决定了它的旋转和缩放的中心位置。默认情况下,精灵的中心点位于其包围盒(Bounding Box)的中心。然而,在某些情况下,我们可能需要将精灵的中心点设置为不同的位置,以便更好地适应特定的需求

    2024年02月04日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包