python - array - Normalización de vectores
normalize array python (1)
La fórmula para medio vector es (Hv) = (Lv + Vv) / | Lv + Vv |, donde Lv es vector de luz, y Vv es vector de vista.
¿Estoy haciendo esto bien en el código de Python?
Vvx = 0-xi # view vector (calculating it from surface points)
Vvy = 0-yi
Vvz = 0-zi
Vv = math.sqrt((Vvx * Vvx) + (Vvy * Vvy) + (Vvz * Vvz)) # normalizing
Vvx = Vvx / Vv
Vvy = Vvy / Vv
Vvz = Vvz / Vv
Lv = (1,1,1) # light vector
Hn = math.sqrt(((1 + Vvx) * (1 + Vvx)) + ((1 + Vvy) * (1 + Vvy)) +
((1 + Vvz) * (1 + Vvz)))
Hv = ((1 + Vvx) / Hn, (1 + Vvy) / Hn, (1 + Vvz) / Hn) # half-way vector
Esto es mal llamado. Lo que has escrito es una simple adición vectorial de dos vectores, con el resultado de un vector unitario normalizado.
Así es como lo haría:
import math
def magnitude(v):
return math.sqrt(sum(v[i]*v[i] for i in range(len(v))))
def add(u, v):
return [ u[i]+v[i] for i in range(len(u)) ]
def sub(u, v):
return [ u[i]-v[i] for i in range(len(u)) ]
def dot(u, v):
return sum(u[i]*v[i] for i in range(len(u)))
def normalize(v):
vmag = magnitude(v)
return [ v[i]/vmag for i in range(len(v)) ]
if __name__ == ''__main__'':
l = [1, 1, 1]
v = [0, 0, 0]
h = normalize(add(l, v))
print h