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