面试题:判断一个圆和一个矩形是否相交

来源:互联网 发布:数据恢复中心 赵力 编辑:程序博客网 时间:2024/06/05 07:38

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

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, *.*)

解答:这就是一个判断同一个平面上,正方形和圆是否相交的问题。最简单的想法肯定是取正方形上面的点,然后判断点是否在圆内(点到圆心距离是否小于半径)来判断是否相交。但是这种方法一是需要取很多点,显然不满足“快速”的要求,第二是存在明显的缺陷,比如下面圆在正方形里面的情况:会把它判断为不相交,但实际却是相交。

下面说说我自己的想法,首先将题目扩展为一般的矩形与圆是否相交的问题,当然正方形属于矩形。对于圆和矩形在同一平面的位置分布,有四种情况

1.圆完全在矩形内部(相交),如上图所示。

2.矩形完全在圆外部(相交),如下所示。


3.圆和矩形只有一部分相交,如下所示

4.矩形和圆不相交

不论是上面哪一种情况,都可以归结为矩形的四条线段与圆的位置关系和圆心与矩形的位置关系来判断,比如情况1:四条线段都在圆外且圆心在矩形内部;情况2:四条线段都在圆内;情况3:存在一条线段与圆相交;情况4:四条线段都在圆外且圆心在矩形之外。这样一来,我们可以将问题退化为两个小问题:A判断线段与圆的位置关系B判断圆心与矩形的位置关系

问题A:判断线段与圆的位置关系。有三种情况,在圆内,相交,在圆外。下面介绍判断方法之前先介绍一个概念:圆心到线段的最小距离Hmin。如下图所示,当圆心到线段的投影点在线段之上时,最短距离为三角形的高(点到直线的距离),当投影点不在线段之上,最短距离为圆心到两端点之间较短的那条边。

判断线段与圆的位置关系:1.如果两端点都在圆内,那么线段在圆内2.如果一个在圆内,一个在圆外,那么线段与圆相交3.如果两个端点都在圆外,那么计算圆心到线段的最小距离Hmin,如果Hmin小于半径,那么相交,否则线段在圆外。

问题B:判断圆心与矩形的位置关系。如下所示有两种情况,可以通过计算圆心与端点之间夹角和来判断,等于360度则圆心在矩形内,小于360度则在矩形之外。

综上所述:可以用下述算法来判断圆与矩形的位置关系:首先分别判断矩形四条线段与圆的位置关系,如果所有线段均在圆内部,那么矩形完全包含在圆内部,如果存在某条线段与圆相交,那么矩形与圆部分相交,如果线段均在圆外,那么判断圆心是否在矩形内,在的话圆完全包含在矩形内,否则圆与矩形不相交。

实际上此算法应该适用于判断圆与任意多边形相交的判断


0 0
原创粉丝点击