用最简单, 最快速的方法计算出下面这个圆形是否和正方形相交

来源:互联网 发布:dcse tbs软件下载 编辑:程序博客网 时间:2024/04/30 01:35

本文转自: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如果都在圆外面继续判断,在哪个区域(此时只有可能在第二个区域和第一个区域) 第三个区域那种情况肯定不想交,因为如果相交的话就包含在第二种情况里面了。

接着继续按上述方法判断就行了。


总之思路都类似

 

0 0
原创粉丝点击