指向旋转的2D矩形内部(不使用平移,三角函数或点积)

时间:2012-06-07 12:04:49

标签: polygon formal-verification

我想知道以下算法检查一个点是否在矩形内是否有效。 我使用自己的直觉(没有强大的触发/数学基础来支持它)开发它,所以我很乐意听到有更多经验的人。

上下文

  • 矩形定义为4个点。它可以旋转。
  • 坐标总是积极的。
  • 根据定义,如果与点相交,则在矩形内部考虑该点。

假设:

  • 使用点和矩形顶点之间的距离(下面的第一个图表)。
  • 最大可能的总距离是指该点位于一个顶点(第二个图表)中。
  • 如果该点位于矩形之外,则距离将更大(第三张图)。

图表链接:http://i45.tinypic.com/id6o35.png

算法(Java):

static boolean pointInsideRectangle(Point[] rect, Point point) {
    double maxDistance = distance(rect[0], rect[1]);
    maxDistance += distance(rect[0], rect[2]);
    maxDistance += distance(rect[0], rect[3]);

    double distance = 0;
    for (Point rectPoint : rect) {          
        distance += distance(rectPoint, point);
        if (distance > maxDistance) return false;
    }
    return true;
}

问题:这是正确的吗?

2 个答案:

答案 0 :(得分:3)

简短回答:不:P(不要贬低它)

长答案:交叉您提到的四个圆圈中的区域(相对顶点之间的最大距离)不会产生矩形。Common area of four circles of radius equal to the rectangle´s diagonal with center in each corner 由于我几何形状有点生锈,我无法给出完整的数学解释(时间约束我的部分),但是给你一些程序的伪代码与你问的约束(没有花哨的公式),对于wikipeida的任何矩形都有效或者几何书可以填补空白。

  • 找到N,E,S,W顶点(最上面,最右边,最低和最左边的顶点)这对于任何矩形来说都很容易,但轴对齐谁可以产生奇怪的顶点赋值(参见带有例子的图像){ {0}}
  • 找到NE,SE,SW和NW边界,这是线方程in wikipedia或另一个link,同样应该很容易,但轴对齐边框应该仔细分析{{3} }。
  • 检查您的点是否位于边框because those generate another type of ecuation/restriction的“右侧”,只有矩形内的点满足四个限制,如图所示连接。 enter image description here

  • 如果我忽略了一些可以完成此任务的java.geom命令,我很抱歉

我希望这对你的努力有所帮助

答案 1 :(得分:0)

你可以尝试这个。让我们把我们的点命名为A.绘制A和矩形的每个点之间的一条线。然后你得到4个不同的三角形。计算三角形所采用的区域(使用Heron' s公式)并将其与矩形区域进行比较。如果区域相同,则您的点位于矩形内。 干杯