Как исправить это l oop для особых случаев в Python - PullRequest
0 голосов
/ 28 мая 2020

Итак, мне дали домашнее задание, в котором я должен решить задачу с выпуклым корпусом с помощью грубой силы (чтобы потом сравнить сложность с нормальным комплексным корпусом), и у меня есть этот код:

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 в конце списка

1 Ответ

0 голосов
/ 28 мая 2020

@ Хайке дал мне ответ, и он был довольно простым: P

def isAllPointsOnOneSide(vector, pointList):
    pointSideList = []

    for i in pointList:
        pointSideList.append(determineSideLocation(vector[0], vector[1], i))

    minValue = min(pointSideList)
    maxValue = max(pointSideList)

    #If max - min is higher than 1, its a False result.
    if maxValue - minValue > 1:
        return False
    else:
        return True

Прошу прощения, и в конце концов, это была довольно простая проблема, но я занимался этим несколько часов сейчас (грубое форсирование выпуклой оболочки), и это меня расстроило.

Еще раз спасибо Хайке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...