【问题标题】:Determine if a point is on a vertices of a polygon确定一个点是否在多边形的顶点上
【发布时间】:2013-07-08 13:37:04
【问题描述】:

给定一个多边形的坐标, 我发现了很多算法来检测一个点是否在多边形中——例如:[1][2]。但是这些算法都无法检测该点是否位于该多边形的顶点上。例如我有一个多边形:

|---------------------|
|                     |
|                     |
|---------------------|

我的观点在右上角。我想要一个算法来告诉我该点是否在多边形内。我该怎么做?

【问题讨论】:

  • 你的多边形是如何定义的?大概你没有顶点坐标;你是在处理多边形的图像吗?
  • 没有图片。我有多边形的坐标和我的点的坐标。在大多数情况下,该点位于多边形的顶点上。而且我总是有简单的多边形。
  • 检查您的术语(顶点)和问题的连贯性。 “如果该点位于该多边形的顶点上”与“该点是否在多边形内与“该点位于多边形的顶点上”。

标签: math polygon computational-geometry


【解决方案1】:

除了处理与浮点相关的问题不完全匹配但足够接近,相同的算法应该适用于两者。
只需在多边形内部选择一个点,创建从测试点到内部点的测试线段,然后,对于多边形中的每个线段,确定测试线段是否与该多边形线段相交,要计为相交,请计算相交在多边形段的一端开,在另一端闭合,即如果交点与多边形的起点完全相同,则计算它,但如果与终点完全相同,则不计算它。您需要这样做,以便当测试线段与多边形顶点相交时,您只能将其视为与顶点任一侧的两个线段之一相交。

那么如果测试点在多边形内,则相交的数量为偶数,如果在多边形外,则为奇数。

【讨论】:

    【解决方案2】:

    刚刚在这里找到了解决方案。这非常简单,[1] 的代码已经实现了ab。源代码的其他信息可以在here找到。

    const float EPSILON = 0.001f;
    
    bool IsPointOnLine(Point linePointA, Point linePointB, Point point) 
    {
       float a = (linePointB.y - linePointA.y) / (linePointB.x - linePointB.x);
       float b = linePointA.y - a * linePointA.x;
       if ( fabs(point.y - (a*point.x+b)) < EPSILON)
       {
           return true;
       }
    
       return false;
    }
    

    【讨论】:

    • 跟帖子里的问题有什么关系?
    • 这段代码在各向同性方面相当差:它测试到直线的垂直距离,对于几乎垂直的直线会返回错误的结果,对于垂直线会崩溃。
    猜你喜欢
    • 2012-05-19
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 2015-12-20
    • 2021-05-28
    • 2019-04-26
    相关资源
    最近更新 更多