查找具有旋转轴的旋转多边形的边界框
Find the bounding box of a rotated polygon with an axis of rotation
我在这里查看了其他一些接近的答案,但找不到任何解决我的问题的方法。
我有一个绕轴位置旋转的多边形,我需要找到多边形的边界框。本质上,边界框对象应该有左上角的 x
和 y
位置,以及框本身的 width
和 height
位置。我可以使用此代码在不旋转的情况下计算多边形的框,但它也没有考虑旋转。红色方块是当前没有旋转的边界框,绿色圆圈是旋转轴,多边形是多边形本身。
理想情况下,我不想在每次调用时重新计算每个顶点位置以获取边界框,我希望它在数学本身中。这是没有旋转的多边形和边界框的示例: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
};
多边形对象结构:
position
是多边形的中心
rotationAxis
是一个相对于多边形中心(位置)的向量
vertices
数组是相对于多边形中心的向量列表
边界框结构:
如何计算旋转多边形的边界框?
如果您不想在任何 rotation/translation 之后从多边形的所有顶点重新计算对齐 BBOX 的轴,那么从 开始计算只有 4 个顶点 ...
计算 unrotated/untranslated 多边形的 OBB
这个操作很慢,但只完成一次(除非你的多边形正在改变形状或大小)
任意多边形变换
也以同样的方式变换OBB顶点。然后从转换后的 OBB 顶点计算轴对齐 BBOX(就像现在一样找到 min/max 坐标)。
这样你只需要从 4 个顶点计算东西而不是 N
将复杂性从 O(N)
转换为 O(1)
。
还有 OBB 以后可能会派上用场,因为它可以加快某些操作甚至提高碰撞测试的精度等...
我在这里查看了其他一些接近的答案,但找不到任何解决我的问题的方法。
我有一个绕轴位置旋转的多边形,我需要找到多边形的边界框。本质上,边界框对象应该有左上角的 x
和 y
位置,以及框本身的 width
和 height
位置。我可以使用此代码在不旋转的情况下计算多边形的框,但它也没有考虑旋转。红色方块是当前没有旋转的边界框,绿色圆圈是旋转轴,多边形是多边形本身。
理想情况下,我不想在每次调用时重新计算每个顶点位置以获取边界框,我希望它在数学本身中。这是没有旋转的多边形和边界框的示例: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
};
多边形对象结构:
position
是多边形的中心rotationAxis
是一个相对于多边形中心(位置)的向量vertices
数组是相对于多边形中心的向量列表
边界框结构:
如何计算旋转多边形的边界框?
如果您不想在任何 rotation/translation 之后从多边形的所有顶点重新计算对齐 BBOX 的轴,那么从
计算 unrotated/untranslated 多边形的 OBB
这个操作很慢,但只完成一次(除非你的多边形正在改变形状或大小)
任意多边形变换
也以同样的方式变换OBB顶点。然后从转换后的 OBB 顶点计算轴对齐 BBOX(就像现在一样找到 min/max 坐标)。
这样你只需要从 4 个顶点计算东西而不是 N
将复杂性从 O(N)
转换为 O(1)
。
还有 OBB 以后可能会派上用场,因为它可以加快某些操作甚至提高碰撞测试的精度等...