Convex Polygon

这道题和围栏不同在于用的检查函数是不一样的,围栏那道题是让我们在一堆点中组合出一个凸包,我们对于三点间的判断只需要根据斜率的比较就可以得到结果,而这道题是要判断这一堆点集本身是否为凸多边形,这里用的是叉积的概念,定义三个点A,B,C的叉积为det(A,B,C)

det(A,B,C) = (C.y - A.y) * (B.x - A.x) - (B.y - A.y) * (C.x - A.x)

从上面可以看出,实际上就是CA向量的斜率减去BA向量的斜率,这里跟orientation函数里的A,B,C中比较的AB,BC向量是不一样的

我们通过叉积比较就能知道CA向量在BA向量的哪一边,而对于一个凸多边形来说,相邻四个点之间的叉积之和是肯定大于零的,也就是向量永远在沿着顺指针转,一旦有哪里不符合这个条件,此多边形就不是凸多边形而是凹多边形了,这里注意叉积等于0的情况代表三点一线,我们不需要改变前面的叉积了,总的来说计算几何还是不太懂,暂时只能先背着再说

class Solution(object):
    def isConvex(self, points):
        """
        :type points: List[List[int]]
        :rtype: bool
        """
        f = lambda A : (A[1][0] - A[0][0]) * (A[2][1] - A[0][1]) - (A[1][1] - A[0][1]) * (A[2][0] - A[0][0])

        pre = 0
        n = len(points)
        for i in xrange(n):
            tmp = f([points[i], points[(i + 1) % n], points[(i + 2) % n]])
            if tmp:
                if pre * tmp < 0:
                    return False
                else:
                    pre = tmp
        return True

results matching ""

    No results matching ""