Как рассчитать в python историю x, y данных для расчета движения? - PullRequest
0 голосов
/ 17 марта 2020

Здравствуйте, я пытаюсь вычислить, остановлен ли объект или находится в движении.

В моем коде у меня есть список координат x, y, как в истории.

history = [[12,30],[15,30],[25,30],[35,30],[45,30],[50,32],[50,33],[51,32]]

Идентификатор как рассчитать в истории, если этот объект остановлен или находится в движении. Если я возьму расстояние от двух последних координат, у меня будет низкое значение, которое может вернуть для меня, что этот объект остановлен.

Но id хотел бы получить больше данных, таких как последние 10, но если я этого не сделаю у меня есть 10 элементов в моем списке, я получу весь список.

И после этого я хочу вычислить расстояние перемещения для каждой точки в медиане.

Моя фактическая функция для расстояния:

def calculateDistance(x1,y1,x2,y2):  
    dist = math.sqrt((x2 - x1)**2 + (y2 - y1)**2)  
    return dist

Кто-нибудь может мне помочь?

Ответы [ 3 ]

1 голос
/ 17 марта 2020

Предполагая, что ваша история позиций была выбрана с регулярными интервалами, вы можете сгруппировать позиции по полосам "близости", используя перечисления по zip и list. С помощью этих групп «неподвижности» вы можете выбрать периоды времени, когда произошла пауза минимальной длительности.

Обратите внимание, что для этого требуется только сравнение расстояний, поэтому вам не нужно использовать квадрат root.

history = [[12,30],[15,30],[25,30],[35,30],[45,30],[50,32],[50,33],[51,32]]

minDist = 5 # this is your distance threshold to determine if a movement occurred
minTime = 3 # stillness time expressed in number of position samples

dists  = ( (ax-bx)**2+(ay-by)**2 for (ax,ay),(bx,by) in zip(history,history[1:]) ) # distance to neighbour
moves  = [ i for i,d in enumerate(dists,1) if d>minDist**2 ]                       # positions where movement occurred
pauses = [ history[s:e] for s,e in zip([0]+moves,moves+[len(history)]) ]           # groups of "stillness"

выход:

for pause in pauses:
    if len(pause) >= minTime:   # check stayed sill for a minimum amount of time
        print(pause[0],len(pause))

# [50, 32] 3

Вы можете уточнить это, проверив, находятся ли все точки в группе на расстоянии 1/2 от центра (AverageX, AverageY) и далее разбить группу на основе этого (используя ту же технику, если необходимо)

0 голосов
/ 17 марта 2020

Отвечаю здесь, пока я не могу комментировать. По первому вопросу: только с парой координат вы не сможете легко определить, движется ли игрок / объект или остановлен. Вы можете добавить третью переменную, время. Между двумя последними ходами вы сможете определить, как долго объект стоял на месте или сколько времени занял этот ход. Если вы добавляете чек каждые x периодов времени, у вас будет еще больше точности, и вы наверняка будете знать, остановились они или нет.

0 голосов
/ 17 марта 2020

Вы можете рассчитать все расстояние между двумя последовательными значениями.

def calculateDistance(x1,y1,x2,y2):  
    dist = math.sqrt((x2 - x1)**2 + (y2 - y1)**2)  
    return dist

history = [[12,30],[15,30],[25,30],[35,30],[45,30],[50,32],[50,33],[51,32]]
distanceHistory = []
for index in range(0,len(history)):
    distance = calculateDistance(history[idx][0],history[idx][1], history[idx+1][0],history[idx+1][1])
    distanceHistory.append(distance)





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