查找具有旋转轴的旋转多边形的边界框

时间:2019-05-12 02:59:04

标签: javascript math rotation

我在这里浏览了其他一些接近的答案,但是找不到解决我问题的方法。

我有一个绕轴位置旋转的多边形,我需要找到该多边形的边界框。本质上,边界框对象应位于左上角的xy位置,以及框本身的widthheight。我可以使用此代码在不旋转的情况下计算多边形的框,但它也不考虑旋转。红色正方形是当前没有旋转的边界框,绿色圆圈是旋转轴,多边形是多边形本身。

Rotated polygon with non-rotated bounding box

理想情况下,我不想在每次调用时重新计算每个顶点位置以获取边界框,而是希望它位于数学本身中。这是不旋转的多边形和边界框的示例:https://i.imgur.com/MSOM9Q1.mp4

这是我当前用于查找非旋转多边形的边界框的代码:

const minX = Math.min(...this.vertices.map((vertex) => vertex.x));
const minY = Math.min(...this.vertices.map((vertex) => vertex.y));

return {
    x: minX + this.position.x,
    y: minY + this.position.y,
    width: Math.max(...this.vertices.map((vertex) => vertex.x)) - minX,
    height: Math.max(...this.vertices.map((vertex) => vertex.y)) - minY
};

多边形对象结构:

Polygon object structure

  • position是多边形的中心
  • rotationAxis是相对于多边形中心(位置)的向量
  • vertices数组是相对于多边形中心的矢量列表

边界框结构:

Bounding box object structure

我该怎么做才能计算旋转多边形的边界框?

1 个答案:

答案 0 :(得分:1)

如果您不想在任何旋转/平移后从多边形的所有顶点重新计算与 BBOX 对齐的轴,请从OBB(仅4个顶点)进行操作... < / p>

  1. 计算未旋转/未平移多边形的OBB

    此操作很慢,但仅执行一次(除非您的多边形更改形状或大小)

  2. 在多边形的任意变换

    也以相同的方式转换 OBB 顶点。然后根据转换后的 OBB 顶点计算 BBOX 对齐的轴(只需像现在一样查找最小/最大坐标)即可。

通过这种方式,您只需要从4个顶点计算内容,而不用将N的复杂度从O(N)转换为O(1)

还具有 OBB 可能会在以后派上用场,因为它可以加快某些操作,甚至可以提高碰撞测试的精度等。