矩形和圆(或弧)的交点

时间:2015-01-06 20:39:40

标签: android

我读了这么多关于这个的帖子,要么我的大脑不工作,要么我找不到正确的答案。

我已经淹没了一个分段的圆圈(即使用圆弧的圆圈),我有一个移动的图像视图(矩形)。我怎么知道矩形和圆形何时相交以及哪个圆弧或交点?

我能够获得imageview的矩形和圆的矩形/中心/半径

非常感谢您的帮助 感谢

2 个答案:

答案 0 :(得分:2)

检测矩形圆形交叉点并找到交叉点

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

  • 圆圈完全位于矩形内,或
  • 矩形的4个边中的任何一个与圆相交

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

对于第二种情况,使用四个line-segment-to-circle交叉点测试,矩形的每一边测试一次,它将告诉您是否存在交叉点以及交叉点是什么。每一方都可以有零个,一个或两个。

查找交叉弧

这仅适用于第二种情况。一旦有了交点,就可以通过查看成对的点来确定交点弧(在开始和结束角度方面),一个点是矩形边进入圆,另一个是边(可能不是同一个边)根据围绕矩形边缘的任意缠绕方向离开它。然后,对于每对中的每个点,取交点和圆心点之间的x和y差异,并使用atan2()计算出角度。这些是交叉弧的起始角和终止角,总共最多可以有四个这样的弧。

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

针对圆弧而不是圆圈测试矩形

如果您的圆圈在进行测试之前已经被分割成预定义的弧线,那么您可以通过比较其角度(使用atan2()计算)与每个交叉点的起点和终点角度来检查每个交叉点属于哪个弧线。预定弧。类似地,如果您只想针对单个圆弧而不是整个圆测试矩形,请检查给定交叉点的角度是否在弧的起始端范围内,如果不是,则忽略它。

答案 1 :(得分: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
}

我希望它有所帮助