相交 - 圆与OBB矩形是否相交
1) 以矩形的中心作为原点,建立坐标系。
2) 算出矩形的旋转角度,然后将矩形和圆都旋转回去。
3) 就可以按照普通的圆与矩形是否相交来判断了。
关于圆心旋转后的坐标计算
先求出oc与x轴的夹角,然后根据旋转角度就可计算出c'的坐标
c'.x = r * cos(θ+θ2), c'.y = r * sin(θ+θ2)
会用到的三角函数公式:
sin(θ+θ2)=sin(θ)*cos(θ2)+cos(θ)*sin(θ2)
cos(θ+θ2)=cos(θ)*cos(θ2)-sin(θ)*sin(θ2)
且已知:
c.x = r * cos(θ), c.y = r * sin(θ)
所以:
c'.x = r * cos(θ+θ2) = r*cos(θ)*cos(θ2) - r*sin(θ)*sin(θ2) = c.x*cos(θ2) - c.y*sin(θ2)
c'.y = r * sin(θ+θ2) = r*sin(θ)*cos(θ2) + r*cos(θ)*sin(θ2) = c.y*cos(θ2) + c.x*sin(θ2)
//圆与OBB矩形是否相交 public static bool IsCircleOBBIntersect(Vector2 a, Vector2 b, Vector2 d, Vector2 e, Vector2 c, float r) { var o = (d - a) * 2; //矩形中心点 //将矩形中心点作为原点建立坐标系 a -= o; b -= o; c -= o; var right = Vector2.right; var abNM = (b - a).normalized; var dot = Vector2.Dot(abNM, right); //cos(θ2) var cross = V2Cross(ref abNM, ref right); //sin(θ2) c = new Vector2(c.x * dot - c.y * cross, c.y * dot + c.x * cross); //不带旋转的圆心坐标 //不带旋转的矩形对角坐标 var halfSize = (d - a) * 0.5f; a = -halfSize; d = halfSize; //将圆转换到第一象限 c.x = Mathf.Abs(c.x); c.y = Mathf.Abs(c.y); //圆心到矩形的最短距离 var dc = c - d; dc.x = Mathf.Max(dc.x, 0); dc.y = Mathf.Max(dc.y, 0); //最短距离<=r, 则和矩形相交 return dc.sqrMagnitude <= r * r; }
参考
简易碰撞检测原理--图形相交测试_相交检测算法-CSDN博客
分类:
2d碰撞检测 / 5_圆、矩形
, 2d碰撞检测
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
2021-11-06 lua for in理解