Classe Vec3D

La classe Vec3D representa vectors lliures de l’espai 3D a través de les seves components x, y i z. Vegeu-ne l’especificació:

class vec3D.Vec3D(x=0., y=0., z=0.)

Atribut de classe

EPS

Precisió de les operacions de comparacions entre vectors (valor = \(10^{-6}\) )

Atributs d’instància

x

Component x del vector (float)

y

Component y del vector (float)

z

Component z del vector (float)

Mètodes

norma()

Retorna la norma (o mòdul) del vector.

normalitza()

Retorna una nova instància de Vec3D resultat de la normalització del vector

Aquesta classe ha de suportar les operacions següents:

Operació

Resultat

v[i]

Retorna la component i-èssima del vector \(0 \leq i<3\)

v[i] = valor

Assigna valor a la component i-èssima del vector \(0 \leq i<3\)

-v

Retorna el vector oposat a v (Vec3D)

v1 + v2

Retorna el vector suma dels vectors v1 i v2 (Vec3D)

v1 - v2

Retorna el vector resta dels vectors v1 i v2 (Vec3D)

v1*v2

Retorna el producte escalar de v1 per v2 (float)

k*v

Retorna el vector resultant de multiplicar v pel float k (Vec3D)

La classe suporta la funció str que retorna l’expressió: “(x, y, z)” on x, y, z estan expressats en base 10 i amb un dígit darrera de la coma. La representació oficial del vector és un string de format “Vec3D(x, y, z)” on x, y, z estan expressats en base 10 i amb 2 dígits darrera de la coma. La classe també suporta la comparació de vectors (==, !=, >, <, >= i <=).

  • Implementeu aquesta classe amb tots els mètodes especials necessaris per a donar suport a les operacions i funcions descrites. Cal tindre en compte que l’índex 0 d’un vector es correspon a la coordenada x, l’índex 1 amb y i l’índex 2 amb z. Per exemple:

    
    >>> v = Vec3D(1, 2, 3)
    >>> (v.x, v.y, v.z)
    (1, 2, 3)
    >>> (v[0], v[1], v[2])
    (1, 2, 3)
    
    

    Pel que fa a la comparació de vectors, dins d’aquesta classe, es considera que un vector és més gran que un altre si la seva norma és superior. Dos vectors són iguals si les seves coordenades són iguals amb una precisió de EPS. Vegeu, per exemple:

    >>> v = Vec3D(1, 2, 3)
    >>> v1 = Vec3D(1., 2., 3.)
    >>> v1 == v
    True
    >>> v2 = Vec3D(1.00001, 2, 3)
    >>> v2 == v
    False
    >>> v3 = Vec3D(1.000001, 2, 3)
    >>> v3 == v
    True
    
    

    Finalment, mireu com es comporten els operadors:

    >>> v1 = Vec3D(1, 3, -0.806)
    >>> -v1
    Vec3D(-1.00, -3.00, 0.81)
    >>> v1-v1
    Vec3D(0.00, 0.00, 0.00)
    >>> v1+v1
    Vec3D(2.00, 6.00, -1.61)
    >>> 3*v1
    Vec3D(3.00, 9.00, -2.42)
    
    
    
  • En un intèrpret de python, proveu d’assignar un vector a un altre. Canvieu la coordenada x d’un dels dos. Com faríeu una còpia i no un àlies? Examineu aquesta part dels tests i assegureu-vos que l’enteneu:

    >>> u = Vec3D(0.27, 0.53, 0.80)
    >>> w = u
    >>> w
    Vec3D(0.27, 0.53, 0.80)
    >>> w.x = 9
    >>> w
    Vec3D(9.00, 0.53, 0.80)
    >>> u
    Vec3D(9.00, 0.53, 0.80)
    >>> from copy import copy
    >>> u = copy(w)
    >>> u.z = 32
    >>> u
    Vec3D(9.00, 0.53, 32.00)
    >>> w
    Vec3D(9.00, 0.53, 0.80)
    
    

Nota

Disposeu de jocs de prova de l’exercici al fitxer test-vec3D.txt i d’una solució a vec3D.py.