【问题标题】:Intersection of rectangle and circle (or arc)矩形和圆(或圆弧)的交点
【发布时间】:2015-12-12 03:05:08
【问题描述】:

我阅读了很多关于此的帖子,要么是我的大脑不工作,要么就是找不到正确的答案。

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

我能够获得图像视图的矩形和圆的矩形/中心/半径

非常感谢您的帮助 谢谢

【问题讨论】:

标签: android


【解决方案1】:

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

您可以将问题分解为两个较小的问题。如果满足以下条件,则矩形和圆形之间会有交集:

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

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

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

寻找相交弧

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

但是,首先您必须排除一种特殊情况。如果只有 1 个交点,则圆正在“亲吻”矩形:其中一条边距圆中心点正好 半径,它们只是接触,没有相交弧.

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

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

【讨论】:

    【解决方案2】:

    我使用了另一种方法:将矩形按圆半径扩大,并检查圆心是否包含在矩形中:

    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
    }
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      • 2015-06-06
      • 2018-03-27
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      相关资源
      最近更新 更多