首页 > 其他分享 >圆与OBB矩形是否相交

圆与OBB矩形是否相交

时间:2023-11-06 23:33:22浏览次数:42  
标签:cos Vector2 OBB dc 相交 var 矩形 sin

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博客

 

标签:cos,Vector2,OBB,dc,相交,var,矩形,sin
From: https://www.cnblogs.com/sailJs/p/17807815.html

相关文章

  • ArcMap生成矢量面的外接圆或外接矩形
      本文介绍在ArcMap软件中,基于一个面图层,绘制其中面要素的最小外接矩形、最小外接圆等的方法。  首先,我们来看一下本文需要实现的需求。现有一个面要素图层,其中包含多个面要素,如下图所示。我们希望绘制这个面要素图层的最小外接矩形——既包括这个完整的面要素图层的最小外接......
  • echarts修改图例legend样式:正方形、矩形、圆形、圆角
    ECharts提供的标记类型有‘circle’,‘rect’,‘roundRect’,‘triangle’,‘diamond’,‘pin’,‘arrow’,‘none’legend:{icon:'circle'}参考文章echarts图例修改legend中icon的形状及大小......
  • Qt绘制圆角矩形的内发光或外发光效果
    Qt没有内置的发光效果,只有一个QGraphicsDropShadowEffect类可以对整个控件产生阴影(可近似为外发光)效果。此处作者整理了如何用QPainter手工绘制形状的内发光或外发光效果。本文主要涉及到QPainter类中的图像混合模式技巧。下面允许我把Qt帮助中的内容复制过来供参考。调用QPaint......
  • 矩形,圆相交测试
    注意:这边的矩形不带旋转 两圆是否相交  //两圆是否相交publicstaticboolIsCircleIntersect(Vector2center1,floatr1,Vector2center2,floatr2){varresult=(center1-center2).sqrMagnitude>Mathf.Sqrt(r1+r2);returnresult;} 两矩形是......
  • 寻找两个链表相交节点方法(可以是有环链表)
    问题分析:两个链表相交可以分为两个大类,一是两个无环链表相交,二是两个有环链表相交。 无环相交如图:有环相交有两种情况,一种是先相交后成环,如图:另一种是交点有两个,是成环后的交点(入环节点不同) 方法1.判断链表是否有环,返回第一个入环节点。2.判断是否相交3.......
  • 直线是否相交以及交点
    直线的点斜公式y=kx+b,k为直线斜率,b为直线在y轴上的交点 两条直线平行则不相交, 否则就相交publicstaticboolIsLineIntersect(floatk1,floatb1,floatk2,floatb2,outVector2intersectPoint){intersectPoint=Vector2.zero;if(Mathf.Approximat......
  • P3217 [HNOI2011] 数矩形
    P3217[HNOI2011]数矩形题解前言提交记录本题其实并不是非常难想,那么为什么本蒟蒻还交了那么多发呢?cal函数求平方的时候传值未开longlong,我谔谔。正文题面省流:给定$n$个点求最大举行的面积,矩形的边可以不与坐标系垂直。如果每次枚举矩形的四个点的话,$O\left(n^4\rig......
  • 代码随想录第四天 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题
    question1:SwapNodesinPairshttps://leetcode.cn/problems/swap-nodes-in-pairs/IwasalittleconfusedatfirstbecauseI'mthinkingwhethershouldIcreatanewhead,butsoonIcameupwiththeideaofcreatpre=Noneandwithan'if-els......
  • C++前缀和算法应用:矩形区域不超过 K 的最大数值和
    题目给你一个mxn的矩阵matrix和一个整数k,找出并返回矩阵内部矩形区域的不超过k的最大数值和。题目数据保证总会存在一个数值和不超过k的矩形区域。示例1:输入:matrix=[[1,0,1],[0,-2,3]],k=2输出:2解释:蓝色边框圈出来的矩形区域[[0,1],[-2,3]]的数值和是......
  • 小白学Python - 使用 Python 的 OpenCV 绘制矩形并提取对象
    使用Python的OpenCV绘制矩形并提取对象OpenCV是一个开源计算机视觉和机器学习软件库。可以在它的帮助下完成各种图像处理操作,例如操纵图像和应用大量滤镜。它广泛用于对象检测、人脸检测和其他图像处理任务。让我们看看如何使用OpenCV在图像上绘制矩形并提取对象。编写代码#......