如何在不改动核心逻辑前提下实现45°旋转矩形的点位置校验
矩形等效旋转45°点位置判定方案
核心需求
- 不改动原有矩形创建、点位置校验的核心概念与逻辑框架
- 实现效果与矩形绕中心旋转45°后的点位置判定完全等效:原有逻辑判定点在区域内返回
TRUE的场景,新逻辑需返回FALSE,对应点落在旋转后矩形区域外的结果
参考说明
原有矩形区域创建与点位置判断的基础组合逻辑可参考下图:
实现方法
无需修改原有矩形点判定的核心逻辑,仅需对输入点做坐标变换后复用原有逻辑即可:
假设原有轴对齐矩形的判定逻辑为:
// 入参说明:p为待判定点(含x、y坐标属性),rect为矩形参数(含x1左边界、x2右边界、y1下边界、y2上边界属性) function isPointInOriginalRect(p, rect) { return p.x >= rect.x1 && p.x <= rect.x2 && p.y >= rect.y1 && p.y <= rect.y2 }
新逻辑的实现步骤:
- 计算矩形的中心坐标:
cx = (rect.x1 + rect.x2) / 2,cy = (rect.y1 + rect.y2) / 2 - 将待判定点平移到以矩形中心为原点的坐标系:
x0 = p.x - cx,y0 = p.y - cy - 对平移后的点做-45°旋转变换(等效于将矩形正向旋转45°),其中
cos45 = sin45 = Math.sqrt(2) / 2:x_new = x0 * cos45 + y0 * sin45y_new = -x0 * sin45 + y0 * cos45
- 将变换后的点平移回原坐标系得到新的判定点:
p_new.x = x_new + cx,p_new.y = y_new + cy - 调用原有判定逻辑得到结果后取反,即为等效旋转后的判定结果:
return !isPointInOriginalRect(p_new, rect)
内容的提问来源于stack exchange,提问作者taraz
相关产品推荐
相关产品推荐

