如何使用python查找线段的长度

Kal*_*eab 5 python line

我想使用 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!')
Run Code Online (Sandbox Code Playgroud)

tob*_*s_k 5

正如已经提到的,它必须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)
Run Code Online (Sandbox Code Playgroud)

Point然而,您可以使用内置的数字作为“重要的Python概念”,而不是创建自己的类,从而变得更简单:complex distance

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

def distance(p1, p2):
    return abs(p1 - p2)
Run Code Online (Sandbox Code Playgroud)