вычисление общего расстояния между несколькими точками - PullRequest
0 голосов
/ 09 апреля 2020

как рассчитать расстояние между несколькими точками в списке, используя al oop.

def create_list(x_range,y_range, locations):
  generated_list = []
  for x in range(locations):
    x_range = random.randint(-300,300)
    y_range = random.randint(-300,300)
    generated_list.append([x_range, y_range])
  return generated_list

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

def calculate_distance(starting_x, starting_y, destination_x, destination_y):
    distance = math.hypot(destination_x - starting_x, destination_y - starting_y)  # calculates Euclidean distance (straight-line) distance between two points
    return distance

здесь мне нужно вычислить расстояние между всеми точками, используя al oop с функцией выше, как бы я использовал al oop для вычисления расстояния между всеми точками

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020
import math

def calculate_distance(x1, y1, x2, y2):
    distance = math.hypot(x2 - x1, y2 - y1)
    return distance


def total_dist(ml):  # ml is a list of pairs of x,y points
    n = len(ml)
    total = 0.0
    for i in range (n):
        x1 = ml[i][0]
        y1 = ml[i][1]
        if i < n-1:
            x2 = ml[i+1][0]
            y2 = ml[i+1][1]
        else:
            x2 = ml[0][0]
            y2 = ml[0][1]
        dist = calculate_distance(x1,y1,x2,y2)
        total += dist
    return total

# main program
copy_list = [[110, -260], [284, -152], [-197, -167], [-253, 295], [-89, 26], [-165, 43], [-84, 148], [-188, 38], [201, 191], [232, 251]]
print total_dist(copy_list)
0 голосов
/ 09 апреля 2020

Из списка пар (x, y) вы можете

  • использовать itertools.permutations, чтобы получить перестановки внутри этого списка. Вот пример с 3 точками, вы получили 6 перестановок, указав длину 2

    values  = [(2, 1), (0, 3), (3, 2)]
    
    perm = [((2, 1), (0, 3)),   ((2, 1), (3, 2)),   ((0, 3), (2, 1)), 
            ((0, 3), (3, 2)),   ((3, 2), (2, 1)),   ((3, 2), (0, 3))]
    
  • , позвоните вашему calculate_distance с точками

    p1 = (1,2)
    p2 = (2,3)
    dist = calculate_distance(*p1, *p2) #or calculate_distance(p1[0], p1[1], p2[0], p2[1])
    

Используйте все это

values = create_list(300, 300, 3)
for p1, p2 in permutations(values, r=2):
    dist = calculate_distance(*p1, *p2)
    print(p1, p2, dist)

Чтобы сложить их все, добавьте значение, чтобы сделать total+=dist в l oop, или используйте sum, который принимает итеративный и сократить

values = create_list(300, 300, 3)
total = sum(calculate_distance(*p1, *p2) for p1, p2 in permutations(values, r=2))

Использование циклов

Сумма только последовательных точек

# Way 1 : d(a,b) + d(b,c) + d(c,d) + d(d,e) + d(e,a)
total = calculate_distance(*values[-1], *values[0])  # between  last and first
for i in range(len(values) - 1):
    total += calculate_distance(*values[i], *values[i + 1])
print(total)

Сумма всех комбинаций точек

# Way 2: d(a,b) + d(a,c) + d(a,d) + d(a,e) + d(b,c) + d(b,d) + d(b,e) + d(c,d) + d(c,e) + d(d,e)
total = 0
for p1 in values:
    for p2 in values:
        if p1 != p2:
            total += calculate_distance(*p1, *p2)
print(total)
...