14

私はベクトルが初めてで、クラスを作成しています。私は自分のベクトルクラスを構築しようとしていますが、それを自分のコードに渡すと:

位置 += 見出し*distance_moved

ここで、位置と見出しは両方ともベクトルです。見出しは正規化されています。私の目標は、位置 = 目的地までコードを繰り返すことです。このクラスの何が問題になっていますか?

インポート数学

class Vector(object):
    #defaults are set at 0.0 for x and y
    def __init__(self, x=0.0, y=0.0):
        self.x = x
        self.y = y

    #allows us to return a string for print
    def __str__(self):
        return "(%s, %s)"%(self.x, self.y)

    # from_points generates a vector between 2 pairs of (x,y) coordinates
    @classmethod
    def from_points(cls, P1, P2):
        return cls(P2[0] - P1[0], P2[1] - P1[1])

    #calculate magnitude(distance of the line from points a to points b
    def get_magnitude(self):
        return math.sqrt(self.x**2+self.y**2)

    #normalizes the vector (divides it by a magnitude and finds the direction)
    def normalize(self):
        magnitude = self.get_magnitude()
        self.x/= magnitude
        self.y/= magnitude

    #adds two vectors and returns the results(a new line from start of line ab to end of line bc)
    def __add__(self, rhs):
        return Vector(self.x +rhs.x, self.y+rhs.y)

    #subtracts two vectors
    def __sub__(self, rhs):
        return Vector(self.x - rhs.x, self.y-rhs.y)

    #negates or returns a vector back in the opposite direction
    def __neg__(self):
        return Vector(-self.x, -self.y)

    #multiply the vector (scales its size) multiplying by negative reverses the direction
    def __mul__(self, scalar):
        return Vector(self.x*scalar, self.y*scalar)

    #divides the vector (scales its size down)
    def __div__(self, scalar):
        return Vector(self.x/scalar, self.y/scalar)

    #iterator
    def __iter__(self):
        return self

    #next
    def next(self):
        self.current += 1
        return self.current - 1

    #turns a list into a tuple
    def make_tuple(l):
        return tuple(l)
4

2 に答える 2

32

同様のエラーが発生したため、python 3.x を使用していると思います。私もクラスを作るのは初めてですが、学んだことを共有できれば幸いです:)

3.x では、クラスの定義で__next__()代わりに使用します。next()コードで名前を変更した後、エラーは発生しませんでしたが、別の問題が発生しました。「「ベクター」オブジェクトには属性「現在」がありません:)

イテレータ(とクラス?)をもっと理解したほうがいいと思います。最も簡単な例は次のとおりです。

class Count:
    def __init__(self, n):
        self.max = n

    def __iter__(self):
        self.count = 0
        return self

    def __next__(self):
        if self.count == self.max:
            raise StopIteration
        self.count += 1
        return self.count - 1

if __name__ == '__main__':
    c = Count(4)
    for i in c:
        print(i, end = ',')

出力は 0、1、2、3 です。

ベクトル クラスを使用して、ベクトルのコンポーネントを反復処理したいと考えています。そう:

def __iter__(self):
    self.count = 0
    self.list = [self.x, self.y, self.z]  # for three dimension
    return self

def __next__(self):
    if self.count == len(self.list):
        raise StopIteration
    self.count += 1
    return self.list[self.count - 1]

イテレータはシーケンス x、y、z を出力します。

イテレータの最も重要な機能は、リスト全体を作成せずにシーケンスを段階的に提供することです。self.listそのため、シーケンスが非常に長くなる場合は、あまり良い考えではありません。詳細はこちら: python チュートリアル

于 2013-06-09T22:18:54.057 に答える
0

渡される最初の引数make_tupleVectorインスタンスです(これは、selfどこにでも配置するのと同じ引数です)。

タプルに変換したいものを渡す必要があります。これはおそらくx座標とy座標です。

def make_tuple(self):
    return (self.x, self.y)
于 2013-03-01T04:48:22.637 に答える