Итак, мне дали домашнее задание, в котором я должен решить задачу с выпуклым корпусом с помощью грубой силы (чтобы потом сравнить сложность с нормальным комплексным корпусом), и у меня есть этот код:
def determineSideLocation(A,B,P):
#Takes point A and B and creates a vector (A ---> B), direction sensitive
d = ((P[0] - A[0])*(B[1] - A[1])) - ((P[1] - A[1])*(B[0] - A[0]))
if d < 0:
#To the left of AB
return -1
elif d > 0:
#To the right of AB
return 1
elif d == 0:
#On AB
return 0
И теперь я определяю, все ли точки, которые я хочу сравнить, с одной стороны или нет:
def isAllPointsOnOneSide(vector, pointList):
pointSideList = []
print("vector: " + str(vector))
print("pointList: " + str(pointList))
for i in pointList:
pointSideList.append(determineSideLocation(vector[0], vector[1], i))
print("pointSideList: " + str(pointSideList))
for j in range(0, len(pointSideList) - 1):
if pointSideList[j] == 0:
continue
elif pointSideList[j+1] == 0:
#2 options:
#1. pointSideList[j+1] is at the end of the list (j+1 = len(pointSideList) - 1)
#2. pointSideList[j+1] is not at the end of the list
if j+1 == (len(pointSideList) - 1):
continue
else:
if pointSideList[j+2] == 0:
if j+2 == (len(pointSideList) - 1):
continue
else:
if pointSideList[j] != pointSideList[j+3]:
return False
else:
continue
elif pointSideList[j] != pointSideList[j+2]:
return False
else:
continue
elif pointSideList[j] != pointSideList[j+1]:
return False
else:
continue
return True
Существует функция convxHull, но проблема не в ней. Дело в том, что в функции isAllPointsOnOneSide
она берет список точек и составляет список значений относительно вектора, который может быть только 1 (справа), -1 (слева) и 0 (в вектор).
Я получил неудобный случай, когда относительные значения были такими: [-1,0,0,0,0]
и функция ломается и дает значение False, несмотря на то, что оно истинно (все точки находятся на векторе или с одной стороны) . Я знаю, что это в части исключения, где он пытается пропустить сравнение текущего значения с 0, но я знаю, что это не идеально, чтобы продолжать писать больше исключений для этой части.
Как я могу исправить это, чтобы избежать случаи, когда функция ломается? Где нужно сравнивать с 0 в конце списка