几何 – 如何在2D整数坐标中测试点是否在凸多边形内?

多边形作为Vector2I对象(2维,整数坐标)的列表给出。我如何测试一个给定的点在里面?我在网络上发现的所有实现都是失败的。写一个正确的实现似乎很难。这个语言并不重要,因为我会自己移植它。
最佳答案
如果它是凸的,检查它的一个简单的方法是,该点放在所有段的同一侧(如果以相同的顺序遍历)。

您可以使用十字制品轻松检查(因为它与分段和点之间形成的角度的余弦成正比,正号的位置将位于右侧,而在左侧具有负号)。

以下是Python中的代码:

RIGHT = "RIGHT"
LEFT = "LEFT"

def inside_convex_polygon(point, vertices):
    previous_side = None
    n_vertices = len(vertices)
    for n in xrange(n_vertices):
        a, b = vertices[n], vertices[(n+1)%n_vertices]
        affine_segment = v_sub(b, a)
        affine_point = v_sub(point, a)
        current_side = get_side(affine_segment, affine_point)
        if current_side is None:
            return False #outside or over an edge
        elif previous_side is None: #first segment
            previous_side = current_side
        elif previous_side != current_side:
            return False
    return True

def get_side(a, b):
    x = x_product(a, b)
    if x < 0:
        return LEFT
    elif x > 0: 
        return RIGHT
    else:
        return None

def v_sub(a, b):
    return (a[0]-b[0], a[1]-b[1])

def x_product(a, b):
    return a[0]*b[1]-a[1]*b[0]

转载注明原文:几何 – 如何在2D整数坐标中测试点是否在凸多边形内? - 代码日志