本文转自:http://blog.csdn.net/bitzhuxb/article/details/8641636
题目重述(来自面试题):(初稿,未改错别字。)
用最简单, 最快速的方法计算出下面这个圆形是否和正方形相交。
3D坐标系 原点(0.0,0.0,0.0)
圆形:
半径r = 3.0
圆心o = (*.*, 0.0, *.*)
正方形:
4个角坐标
1:(*.*, 0.0, *.*)
2:(*.*, 0.0, *.*)
3:(*.*, 0.0, *.*)
4:(*.*, 0.0, *.*)
判断圆形和正方形是否相交。
思路:
我们首先做一个图,由四个坐标点组成的正方形和它的四条边的延长线把平面区域分为3个部分如下所示,我们可以通过判断圆心在哪一个区域,进一步判断圆和正方形是否相交。于是问题分为两部分,先判断圆心所在的区域,然后在判断圆心是否和正方形相交。
如何判断给定的圆心在哪个区域?
解决方法如下:
首先计算圆心到正方形四条边的距离,计为a,b,c,d。并假设 a和c是对应的正方形的一对平行的边到圆心的距离,c和d是对应的另一对平行的边到圆心的距离。
那么可以作如下判断:设正方形边长为len,那么如果且b+d=len那么圆心在区域(1)里面。
如果|a-c|=len而且|b-d|=len 说明圆心在区域(3)里面。
其他情况下(也就是a和c 或b和d中有一组和为len 另一组差的绝对值为len,也就是a+c=len且|b-d|=len 或者|a-c|=len且b+d=len)那么圆心在区域(2)中。
知道圆心所在的区域了 ,下面就应该求正方形和圆是否相交了。
假设圆心到四条线的距离分别为a,b,c,d。正方形的顶点到圆心的距离分别为LA,LB,LC,LD
如果在区域(1),那么直接求 min(la,lb,lc,ld) 如果小于等于r则 相交,否则不想交。
如果在区域(2),那么要么|a-c|=len要么|b-d|=len。 假设是|a-c|=len ,那么只要判断min(a,c)是否小于等于半径就行了 小于等于就相交否则不想交。
如果在区域(3),直接判断min(LA,LB,LC,LD)是否小于等于r,满足就相交否则就不想交。(当然可以理解为就是四个点是否有在圆内的,这样方便计算直接带入方程即可。)
同样还有另外的思路。
1.如果四个点都在圆内,说明不交
2.有外面的里面的,说明相交
3如果都在圆外面继续判断,在哪个区域(此时只有可能在第二个区域和第一个区域) 第三个区域那种情况肯定不想交,因为如果相交的话就包含在第二种情况里面了。
接着继续按上述方法判断就行了。
总之思路都类似