文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-09-30 08:35

关注

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

理论基础

本次实现有几个前提:

可以将情况分为两种,即 θ ∈ [ 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]
在这里插入图片描述
已知矩形的中心点 ( x , y ) (x, y) (x,y),旋转角度 θ \theta θ在图中用橙色标注。

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

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

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

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

在这里插入图片描述
同理,此时旋转角度 θ \theta θ大于 π / 2 \pi/2 π/2,所以用到的辅助三角形的角度标注为 π − θ \pi -\theta πθ

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

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

可以看到两种情况下,得到的四个点的值是一样的,比如情况一里 ( x1 , y1 ) (x_1,y_1) (x1,y1)和情况二里 ( x2 , y2 ) (x_2,y_2) (x2,y2)一样,所以在代码实现里可以不分情况讨论,不影响最终结果。

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

来源地址:https://blog.csdn.net/weixin_45453121/article/details/129582622

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯