如何计算绕中心旋转的矩形的包围盒并适配拐角原点的现有方案
你当前代码的问题出在computeAABBCenter函数的坐标基准不匹配:函数内部逻辑默认传入的x、y是矩形中心点坐标,但你调用时传入的是矩形左上角的坐标,最终导致包围盒计算偏移。
修正方案
下面是优化后的实现,不需要计算四个顶点再取最值,运算量更低,性能优于顶点枚举方案,完全满足你的性能需求:
function computeAABBCenter(x, y, w, h, theta) { // 从传入的左上角坐标计算矩形实际中心点 const centerX = x + w / 2; const centerY = y + h / 2; const halfWidth = w / 2; const halfHeight = h / 2; const absCos = Math.abs(Math.cos(theta)); const absSin = Math.abs(Math.sin(theta)); // 利用投影原理直接计算旋转后包围盒的半宽半高 const bboxHalfWidth = halfWidth * absCos + halfHeight * absSin; const bboxHalfHeight = halfWidth * absSin + halfHeight * absCos; return { x1: centerX - bboxHalfWidth, y1: centerY - bboxHalfHeight, x2: centerX + bboxHalfWidth, y2: centerY + bboxHalfHeight, }; }
直接替换你代码中的computeAABBCenter函数即可得到正确的包围盒结果。
内容的提问来源于stack exchange,提问作者Ryan Peschel
相关产品推荐
相关产品推荐

