Python: Сравнить расстояние между записями в списке и заменить запись, если расстояние меньше определенного числа? - PullRequest
0 голосов
/ 01 мая 2018

Я сгенерировал случайный список следующим образом, где каждая запись соответствует координатам x, y, z. Затем я сравниваю расстояние между каждой записью следующим образом:

myList = []
for x in range(12): #12 is just an example number, just a multiple of 3
    myList.append(random.uniform(0,1))
#Split list into x,y,z coordinates
n = 3
newList = [myList[i:i + n] for i in xrange(0, len(myList), n)]

#function to get distance
def distance(p1, p2):
    myDist = math.sqrt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2 + (p1[2] - p2[2])**2)
    return myDist

#Compare distance between each entry in newList
for a,b in itertools.combinations(newList, 2):
    distance(a,b)

Мой вопрос:

Если расстояние (a, b) <<strong> i, где i - некоторое число , я хочу заменить a и / или b новой записью, чтобы расстояние было больше, чем i. В конце я хочу список такой, чтобы расстояние между любыми двумя точками было больше, чем я. Я думал добавить здесь оператор if:

#Compare distance between each entry in newList
i = 0.4 #can be any number
for a,b in itertools.combinations(newList, 2):
    distance(a,b)
    if distance(a,b) < i:
        #replace a and/or b

Однако тогда я думаю, что мне нужно было бы повторить итерацию по newList, чтобы убедиться, что ни одна из новых сгенерированных точек не находится на расстоянии i от других точек, и продолжать делать это, пока все точки не будут больше, чем расстояние i. Есть ли аккуратный способ сделать это? Спасибо!

1 Ответ

0 голосов
/ 01 мая 2018

Однако тогда я думаю, что мне нужно было бы повторить итерацию по newList, чтобы убедиться, что ни одна из новых сгенерированных точек не находится на расстоянии i от других точек, и продолжать делать это до тех пор, пока все точки не будут больше, чем i расстояние друг от друга. Есть ли аккуратный способ сделать это? Спасибо!

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

Вы можете избежать создания полного оригинального списка; немного быстрее создавать точки по одному, проверять их, а затем добавлять их в (изначально пустой) список.

...