Как найти длину отрезков, используя python - PullRequest
0 голосов
/ 28 мая 2018

Я хочу рассчитать длину (любого количества) отрезков линии, используя Python.Я использовал следующий код, но я обнаружил, что кортежи не могут иметь вычитание в качестве операндов.Как я могу преодолеть это?Я хотел бы знать, пропустил ли я какую-либо важную концепцию Python.

from itertools import starmap
import math
class Point(object):
    def __init__(self,x,y):
        self.x=x
        self.y=y
    def move(self,dx,dy):
        self.x+=dx
        self.y+=dy


class LineString(object):

    def __init__(self,*args): # A method with any number of arguments, args

        self.args=[Point(*args) for p in args] # A list of Points

    def length(self):
        pairs=zip(self.args, self.args[1:])
        return sum(starmap(distance,pairs))

def distance(p1, p2):
    a = p1.x,p1.y
    b = p2.x,p2.y

    print (math.sqrt((a[0]-b[0])**2-(a[1]-b[1])**2))
    # calculates distance between two given points p1 and p2
    return math.sqrt((a** 2)+ (b** 2))


if __name__ == '__main__':
    # Tests for LineString
    # ===================================
    lin1 = LineString((1, 1), (0, 2))

    assert lin1.length() == sqrt(2.0)

    lin1.move(-1, -1) # Move by -1 and -1 for x and y respectively

    assert lin1[0].y == 0 # Inspect the y value of the start point.
    # Implement this by overloading __getitem__(self, key) in your class.

    lin2 = LineString((1, 1), (1, 2), (2, 2))

    assert lin2.length() == 2.0

    lin2.move(-1, -1) # Move by -1 and -1 for x and y respectively

    assert lin2.length() == 2.0

    assert lin2[-1].x == 1 # Inspect the x value of the end point.

    print ('Success! Line tests passed!')

Ответы [ 2 ]

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

Как уже упоминалось, оно должно быть Point(*p) целым числом Point(*args).Последний передаст все наборы точек конструктору каждой точки.Вы также должны исправить distance, однако.

def __init__(self, *args):
    self.args=[Point(*p) for p in args]

def distance(p1, p2):
    return math.sqrt((p1.x-p2.x)**2 + (p1.y-p2.y)**2)

Однако вместо создания вашего собственного Point класса «важная концепция Python», которую вы можете использовать вместо этого, встроена в complex числа , что делает distance намного проще:

def __init__(self, *args):
    self.args=[complex(*p) for p in args]

def distance(p1, p2):
    return abs(p1 - p2)
0 голосов
/ 28 мая 2018

Python не поддерживает возведение в степень (и другие математические операции) для кортежей.Хотя возможно иметь такой код:

print (1, 2) * 3       # produces (1, 2, 1, 2, 1, 2)
print (1, 2) + (1, 2)  # produces (1, 2, 1, 2)

, это не векторные вычисления для всего кортежа.Это просто синтаксический сахар для конкатенации кортежей.

Также кажется, что во фрагменте есть несколько опечаток / ошибок.

Строка self.args=[Point(*args) for p in args] должна быть скорее self.args=[Point(*p) for p in args]

Класс LineString не имеет move() метода.

И вычисление distance() должно бытьнемного изменилось (обратите внимание, что я заменил - на + в формуле):

return math.sqrt((p1.x - p2.x)**2 + (p1.y - p2.y)**2)
...