2015-01-06 147 views
3

我读了很多关于这个的帖子,要么我的大脑不工作,要么我找不到正确的答案。矩形和圆(或圆弧)的交集

我已经淹没了一个分段的圆圈(即使用圆弧的圆圈),并且我有一个正在四处移动的imageview(矩形)。我怎样才能知道矩形和圆形相交的时间以及哪个圆弧或交点?

我能够得到的ImageView的正确,而且圆的矩形/中心/半径

你的帮助是极大的赞赏 感谢

回答

2

检测用矩形,圆形交叉口,寻找交叉点

您可以将问题分解为两个较小的问题。会有矩形和圆之间的交点,如果:

  • 圆完全位于矩形之内,OR
  • 任何矩形的4个侧面的相交圆

第一情况很简单,只需检查圆的中心点是否在矩形内,并且大于或等于半径距离每边的距离。在这种情况下,有一个交点,交点圆弧就是整个圆。有零到四个交点:如果该边缘正好是距离中心点半径,则每个边缘一个;如果大于半径:完成,则为零。

对于第二种情况,使用四个line-segment-to-circle相交测试,矩形的每一边各一个,它会告诉你是否有交点以及交点是什么。每边可以有零个,一个或两个。

查找相交圆弧

这仅适用于所述第二壳体。一旦有了交点,就可以通过查看一对点,即一个矩形边进入圆的位置和一个边(可能不是相同的边)的交点,计算出交点圆弧(根据起始角和终点角)根据围绕矩形边缘的任意缠绕方向离开它。然后,每对中的每个点取交点和圆心点之间的x和y差值,并使用atan2()计算出角度。这些是交叉圆弧的起始和终止角度,总共可能有四个这样的圆弧。

但是,首先你必须排除特殊情况。如果只有1个交点,那么该圆正在“接吻”该矩形:其中一边正好是半径远离圆心点,它们只是触摸,并且没有相交弧。

测试矩形对弧而非圆形

如果您的圈子已经分割成预先定义的弧线,你做了测试之前,那么你可以检查哪些弧每个交叉点比较属于它的角度(用atan2()计算)到每个预定义弧段的起始角度和结束角度。同样,如果您只想针对单个圆弧而不是整个圆测试矩形,请检查给定交点的角度是否在圆弧的起点范围内,如果不是,则忽略它。

+0

太谢谢你了 – Snake

0

我用不同的方式:由圆的半径越来越多的矩形,并检查是否圆的中心由矩形包含:

PointF center; 
float radius; 
RectF rect; 

// Copy rect in another RectF instance if you need it later 
rect.inset (-radius, -radius); 

if (rect.contains (center.x, center.y)) { 
    // Intersection 
} 

我希望它能帮助